diff options
-rw-r--r-- | app/controllers/projects/merge_requests/diffs_controller.rb | 4 | ||||
-rw-r--r-- | app/serializers/diff_file_entity.rb | 37 | ||||
-rw-r--r-- | app/serializers/user_entity.rb | 14 | ||||
-rw-r--r-- | app/views/projects/merge_requests/show.html.haml | 2 |
4 files changed, 46 insertions, 11 deletions
diff --git a/app/controllers/projects/merge_requests/diffs_controller.rb b/app/controllers/projects/merge_requests/diffs_controller.rb index 90674a8735b..0f373835062 100644 --- a/app/controllers/projects/merge_requests/diffs_controller.rb +++ b/app/controllers/projects/merge_requests/diffs_controller.rb @@ -21,7 +21,7 @@ class Projects::MergeRequests::DiffsController < Projects::MergeRequests::Applic def render_diff_file @environment = @merge_request.environments_for(current_user).last - render json: DiffsSerializer.new.represent(@diffs, serializeable_vars) + render json: DiffsSerializer.new(current_user: current_user).represent(@diffs, serializable_vars) end def define_diff_vars @@ -67,7 +67,7 @@ class Projects::MergeRequests::DiffsController < Projects::MergeRequests::Applic end end - def serializeable_vars + def serializable_vars { environment: @environment, merge_request: @merge_request, diff --git a/app/serializers/diff_file_entity.rb b/app/serializers/diff_file_entity.rb index 70820c6e19e..86c2edd331e 100644 --- a/app/serializers/diff_file_entity.rb +++ b/app/serializers/diff_file_entity.rb @@ -1,4 +1,5 @@ class DiffFileEntity < Grape::Entity + include RequestAwareEntity include ActionView::Helpers::TagHelper include Gitlab::Routing include BlobHelper @@ -7,23 +8,30 @@ class DiffFileEntity < Grape::Entity include IconsHelper include SubmoduleHelper include TreeHelper + include ChecksCollaboration + include Gitlab::Utils::StrongMemoize + expose :submodule?, as: :submodule expose :submodule_link do |diff_file| - submodule_links(diff_file.blob, diff_file.content_sha, diff_file.repository).first if diff_file.submodule? + memoized_submodule_links(diff_file).first end expose :submodule_tree_url do |diff_file| - submodule_links(diff_file.blob, diff_file.content_sha, diff_file.repository).last if diff_file.submodule? + memoized_submodule_links(diff_file).last end expose :blob, using: BlobEntity expose :can_modify_blob do |diff_file| - # todo: this depends on can_collaborate_with_project?, which needs current_user - # also maybe this should live in current_user like in merge_request entity - # can_modify_blob?(diff_file.blob, merge_request.project, merge_request.source_branch) + merge_request = options[:merge_request] + + if merge_request && current_user + can_modify_blob?(diff_file.blob, merge_request.source_project, merge_request.source_branch) + else + false + end end expose :file_hash do |diff_file| @@ -92,9 +100,10 @@ class DiffFileEntity < Grape::Entity end expose :fork_path, if: -> (_, options) { options[:merge_request] } do |diff_file| - # copypasted from helper - # params = edit_blob_fork_params(edit_path) - # project_forks_path(merge_request.project, namespace_key: request.current_user.namespace.id, continue: params) + merge_request = options[:merge_request] + + params = edit_blob_fork_params("Edit") + project_forks_path(merge_request.project, namespace_key: request.current_user.namespace.id, continue: params) end expose :view_path, if: -> (_, options) { options[:merge_request] } do |diff_file| @@ -123,4 +132,16 @@ class DiffFileEntity < Grape::Entity # Used for parallel diffs expose :parallel_diff_lines, if: -> (diff_file, _) { diff_file.text? } + + def current_user + request.current_user + end + + def memoized_submodule_links(diff_file) + strong_memoize(:submodule_links) do + return [] unless diff_file.submodule? + + submodule_links(diff_file.blob, diff_file.content_sha, diff_file.repository) + end + end end diff --git a/app/serializers/user_entity.rb b/app/serializers/user_entity.rb index 876512b12dc..f44ca064a20 100644 --- a/app/serializers/user_entity.rb +++ b/app/serializers/user_entity.rb @@ -1,7 +1,21 @@ class UserEntity < API::Entities::UserBasic include RequestAwareEntity + expose :can_fork do |user| + can?(user, :fork_project, request.project) if project + end + + expose :can_create_merge_request do |user| + can?(user, :create_merge_request_in, project) if project + end + expose :path do |user| user_path(user) end + + def project + return false unless request.respond_to?(:project) && request.project + + request.project + end end diff --git a/app/views/projects/merge_requests/show.html.haml b/app/views/projects/merge_requests/show.html.haml index 8427548e2de..7175883821f 100644 --- a/app/views/projects/merge_requests/show.html.haml +++ b/app/views/projects/merge_requests/show.html.haml @@ -62,7 +62,7 @@ #js-vue-mr-discussions{ data: { notes_data: notes_data(@merge_request), noteable_data: serialize_issuable(@merge_request), noteable_type: 'MergeRequest', - current_user_data: UserSerializer.new.represent(current_user).to_json} } + current_user_data: UserSerializer.new(project: @project).represent(current_user).to_json} } - else = render "projects/merge_requests/discussion" |