84 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			84 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Ruby
		
	
	
	
| # frozen_string_literal: true
 | |
| 
 | |
| module Gitlab
 | |
|   class UrlBuilder
 | |
|     include Gitlab::Routing
 | |
|     include GitlabRoutingHelper
 | |
|     include ActionView::RecordIdentifier
 | |
| 
 | |
|     attr_reader :object
 | |
| 
 | |
|     def self.build(object)
 | |
|       new(object).url
 | |
|     end
 | |
| 
 | |
|     def url
 | |
|       case object
 | |
|       when Commit
 | |
|         commit_url
 | |
|       when Issue
 | |
|         issue_url(object)
 | |
|       when MergeRequest
 | |
|         merge_request_url(object)
 | |
|       when Note
 | |
|         note_url
 | |
|       when WikiPage
 | |
|         wiki_page_url
 | |
|       when ProjectSnippet
 | |
|         project_snippet_url(object.project, object)
 | |
|       when Snippet
 | |
|         snippet_url(object)
 | |
|       when Milestone
 | |
|         milestone_url(object)
 | |
|       when ::Ci::Build
 | |
|         project_job_url(object.project, object)
 | |
|       when User
 | |
|         user_url(object)
 | |
|       else
 | |
|         raise NotImplementedError.new("No URL builder defined for #{object.class}")
 | |
|       end
 | |
|     end
 | |
| 
 | |
|     private
 | |
| 
 | |
|     def initialize(object)
 | |
|       @object = object
 | |
|     end
 | |
| 
 | |
|     def commit_url(opts = {})
 | |
|       return '' if object.project.nil?
 | |
| 
 | |
|       namespace_project_commit_url({
 | |
|         namespace_id: object.project.namespace,
 | |
|         project_id: object.project,
 | |
|         id: object.id
 | |
|       }.merge!(opts))
 | |
|     end
 | |
| 
 | |
|     def note_url
 | |
|       if object.for_commit?
 | |
|         commit_url(id: object.commit_id, anchor: dom_id(object))
 | |
| 
 | |
|       elsif object.for_issue?
 | |
|         issue_url(object.noteable, anchor: dom_id(object))
 | |
| 
 | |
|       elsif object.for_merge_request?
 | |
|         merge_request_url(object.noteable, anchor: dom_id(object))
 | |
| 
 | |
|       elsif object.for_snippet?
 | |
|         snippet = object.noteable
 | |
| 
 | |
|         if snippet.is_a?(PersonalSnippet)
 | |
|           snippet_url(snippet, anchor: dom_id(object))
 | |
|         else
 | |
|           project_snippet_url(snippet.project, snippet, anchor: dom_id(object))
 | |
|         end
 | |
|       end
 | |
|     end
 | |
| 
 | |
|     def wiki_page_url
 | |
|       project_wiki_url(object.wiki.project, object.slug)
 | |
|     end
 | |
|   end
 | |
| end
 |