diff options
Diffstat (limited to 'app/serializers')
22 files changed, 176 insertions, 53 deletions
diff --git a/app/serializers/admin/user_entity.rb b/app/serializers/admin/user_entity.rb new file mode 100644 index 00000000000..ad96c101822 --- /dev/null +++ b/app/serializers/admin/user_entity.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +module Admin + class UserEntity < API::Entities::UserSafe + include RequestAwareEntity + include UsersHelper + include UserActionsHelper + + expose :created_at + expose :email + expose :last_activity_on + expose :avatar_url + expose :badges do |user| + user_badges_in_admin_section(user) + end + + expose :projects_count do |user| + user.authorized_projects.length + end + + expose :actions do |user| + admin_actions(user) + end + + private + + def current_user + options[:current_user] + end + end +end diff --git a/app/serializers/admin/user_serializer.rb b/app/serializers/admin/user_serializer.rb new file mode 100644 index 00000000000..09036428bab --- /dev/null +++ b/app/serializers/admin/user_serializer.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +module Admin + class UserSerializer < BaseSerializer + entity UserEntity + end +end diff --git a/app/serializers/codequality_degradation_entity.rb b/app/serializers/codequality_degradation_entity.rb new file mode 100644 index 00000000000..be561052507 --- /dev/null +++ b/app/serializers/codequality_degradation_entity.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +class CodequalityDegradationEntity < Grape::Entity + expose :description + expose :severity + + expose :file_path do |degradation| + degradation.dig(:location, :path) + end + + expose :line do |degradation| + degradation.dig(:location, :lines, :begin) || degradation.dig(:location, :positions, :begin, :line) + end +end diff --git a/app/serializers/codequality_reports_comparer_entity.rb b/app/serializers/codequality_reports_comparer_entity.rb new file mode 100644 index 00000000000..1de4e56c57d --- /dev/null +++ b/app/serializers/codequality_reports_comparer_entity.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +class CodequalityReportsComparerEntity < Grape::Entity + expose :status + + expose :new_errors, using: CodequalityDegradationEntity + expose :resolved_errors, using: CodequalityDegradationEntity + expose :existing_errors, using: CodequalityDegradationEntity + + expose :summary do + expose :total_count, as: :total + expose :resolved_count, as: :resolved + expose :errors_count, as: :errored + end +end diff --git a/app/serializers/codequality_reports_comparer_serializer.rb b/app/serializers/codequality_reports_comparer_serializer.rb new file mode 100644 index 00000000000..2c6eb33aa9f --- /dev/null +++ b/app/serializers/codequality_reports_comparer_serializer.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +class CodequalityReportsComparerSerializer < BaseSerializer + entity CodequalityReportsComparerEntity +end diff --git a/app/serializers/concerns/user_status_tooltip.rb b/app/serializers/concerns/user_status_tooltip.rb index 633b117d392..fcf6700cb59 100644 --- a/app/serializers/concerns/user_status_tooltip.rb +++ b/app/serializers/concerns/user_status_tooltip.rb @@ -8,12 +8,18 @@ module UserStatusTooltip include UsersHelper included do - expose :user_status_if_loaded, as: :status_tooltip_html + expose :status_tooltip_html, if: -> (*) { status_loaded? } do |user| + user_status(user) + end + + expose :show_status do |user| + status_loaded? && show_status_emoji?(user.status) + end - def user_status_if_loaded - return unless object.association(:status).loaded? + private - user_status(object) + def status_loaded? + object.association(:status).loaded? end end end diff --git a/app/serializers/diff_file_base_entity.rb b/app/serializers/diff_file_base_entity.rb index 5036f28184c..1409f023f21 100644 --- a/app/serializers/diff_file_base_entity.rb +++ b/app/serializers/diff_file_base_entity.rb @@ -118,7 +118,7 @@ class DiffFileBaseEntity < Grape::Entity strong_memoize(:submodule_links) do next unless diff_file.submodule? - options[:submodule_links].for(diff_file.blob, diff_file.content_sha, diff_file) + options[:submodule_links]&.for(diff_file.blob, diff_file.content_sha, diff_file) end end diff --git a/app/serializers/diffs_metadata_entity.rb b/app/serializers/diffs_metadata_entity.rb index 8973f23734a..7b0de3bce4e 100644 --- a/app/serializers/diffs_metadata_entity.rb +++ b/app/serializers/diffs_metadata_entity.rb @@ -2,7 +2,9 @@ class DiffsMetadataEntity < DiffsEntity unexpose :diff_files - expose :raw_diff_files, as: :diff_files, using: DiffFileMetadataEntity + expose :diff_files, using: DiffFileMetadataEntity do |diffs, _| + diffs.raw_diff_files(sorted: true) + end expose :conflict_resolution_path do |_, options| presenter(options[:merge_request]).conflict_resolution_path diff --git a/app/serializers/environment_entity.rb b/app/serializers/environment_entity.rb index 0bd9c602bf5..8c6ad010d69 100644 --- a/app/serializers/environment_entity.rb +++ b/app/serializers/environment_entity.rb @@ -3,6 +3,9 @@ class EnvironmentEntity < Grape::Entity include RequestAwareEntity + UNNECESSARY_ENTRIES_FOR_UPCOMING_DEPLOYMENT = + %i[manual_actions scheduled_actions playable_build cluster].freeze + expose :id expose :global_id do |environment| @@ -17,6 +20,11 @@ class EnvironmentEntity < Grape::Entity expose :last_deployment, using: DeploymentEntity expose :stop_action_available?, as: :has_stop_action + expose :upcoming_deployment, expose_nil: false do |environment, ops| + DeploymentEntity.represent(environment.upcoming_deployment, + ops.merge(except: UNNECESSARY_ENTRIES_FOR_UPCOMING_DEPLOYMENT)) + end + expose :metrics_path, if: -> (*) { environment.has_metrics? } do |environment| metrics_project_environment_path(environment.project, environment) end diff --git a/app/serializers/import/bulk_import_entity.rb b/app/serializers/import/bulk_import_entity.rb index 8f0a9dd4428..9daa6699a20 100644 --- a/app/serializers/import/bulk_import_entity.rb +++ b/app/serializers/import/bulk_import_entity.rb @@ -12,4 +12,8 @@ class Import::BulkImportEntity < Grape::Entity expose :full_path do |entity| entity['full_path'] end + + expose :web_url do |entity| + entity['web_url'] + end end diff --git a/app/serializers/merge_request_assignee_entity.rb b/app/serializers/merge_request_assignee_entity.rb deleted file mode 100644 index b7ef7449270..00000000000 --- a/app/serializers/merge_request_assignee_entity.rb +++ /dev/null @@ -1,9 +0,0 @@ -# frozen_string_literal: true - -class MergeRequestAssigneeEntity < ::API::Entities::UserBasic - expose :can_merge do |assignee, options| - options[:merge_request]&.can_be_merged_by?(assignee) - end -end - -MergeRequestAssigneeEntity.prepend_if_ee('EE::MergeRequestAssigneeEntity') diff --git a/app/serializers/merge_request_current_user_entity.rb b/app/serializers/merge_request_current_user_entity.rb new file mode 100644 index 00000000000..fbdb4e505ec --- /dev/null +++ b/app/serializers/merge_request_current_user_entity.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +class MergeRequestCurrentUserEntity < CurrentUserEntity + include RequestAwareEntity + include BlobHelper + include TreeHelper + + expose :can_fork do |user| + project && can?(user, :fork_project, request.project) + end + + expose :can_create_merge_request do |user| + project && can?(user, :create_merge_request_in, project) + end + + expose :fork_path, if: -> (*) { project } do |user| + params = edit_blob_fork_params("Edit") + project_forks_path(project, namespace_key: user.namespace.id, continue: params) + end + + def project + request.respond_to?(:project) && request.project + end +end diff --git a/app/serializers/merge_request_reviewer_entity.rb b/app/serializers/merge_request_reviewer_entity.rb deleted file mode 100644 index fefd116014f..00000000000 --- a/app/serializers/merge_request_reviewer_entity.rb +++ /dev/null @@ -1,9 +0,0 @@ -# frozen_string_literal: true - -class MergeRequestReviewerEntity < ::API::Entities::UserBasic - expose :can_merge do |reviewer, options| - options[:merge_request]&.can_be_merged_by?(reviewer) - end -end - -MergeRequestReviewerEntity.prepend_if_ee('EE::MergeRequestReviewerEntity') diff --git a/app/serializers/merge_request_sidebar_extras_entity.rb b/app/serializers/merge_request_sidebar_extras_entity.rb index 9db8e52abef..261b6e8e519 100644 --- a/app/serializers/merge_request_sidebar_extras_entity.rb +++ b/app/serializers/merge_request_sidebar_extras_entity.rb @@ -2,10 +2,10 @@ class MergeRequestSidebarExtrasEntity < IssuableSidebarExtrasEntity expose :assignees do |merge_request| - MergeRequestAssigneeEntity.represent(merge_request.assignees, merge_request: merge_request) + MergeRequestUserEntity.represent(merge_request.assignees, merge_request: merge_request) end expose :reviewers, if: -> (m) { m.allows_reviewers? } do |merge_request| - MergeRequestReviewerEntity.represent(merge_request.reviewers, merge_request: merge_request) + MergeRequestUserEntity.represent(merge_request.reviewers, merge_request: merge_request) end end diff --git a/app/serializers/merge_request_user_entity.rb b/app/serializers/merge_request_user_entity.rb index 53257b0602c..604c9cabd50 100644 --- a/app/serializers/merge_request_user_entity.rb +++ b/app/serializers/merge_request_user_entity.rb @@ -1,26 +1,9 @@ # frozen_string_literal: true -class MergeRequestUserEntity < CurrentUserEntity - include RequestAwareEntity - include BlobHelper - include TreeHelper - - expose :can_fork do |user| - can?(user, :fork_project, request.project) if project - end - - expose :can_create_merge_request do |user| - project && can?(user, :create_merge_request_in, project) - end - - expose :fork_path, if: -> (*) { project } do |user| - params = edit_blob_fork_params("Edit") - project_forks_path(project, namespace_key: user.namespace.id, continue: params) - end - - def project - return false unless request.respond_to?(:project) && request.project - - request.project +class MergeRequestUserEntity < ::API::Entities::UserBasic + expose :can_merge do |reviewer, options| + options[:merge_request]&.can_be_merged_by?(reviewer) end end + +MergeRequestUserEntity.prepend_if_ee('EE::MergeRequestUserEntity') diff --git a/app/serializers/merge_request_widget_entity.rb b/app/serializers/merge_request_widget_entity.rb index e46b269ea35..afd4d5b9a2b 100644 --- a/app/serializers/merge_request_widget_entity.rb +++ b/app/serializers/merge_request_widget_entity.rb @@ -2,6 +2,9 @@ class MergeRequestWidgetEntity < Grape::Entity include RequestAwareEntity + include ProjectsHelper + include ApplicationHelper + include ApplicationSettingsHelper SUGGEST_PIPELINE = 'suggest_pipeline' @@ -48,6 +51,10 @@ class MergeRequestWidgetEntity < Grape::Entity help_page_path('user/project/merge_requests/resolve_conflicts.md') end + expose :reviewing_and_managing_merge_requests_docs_path do |merge_request| + help_page_path('user/project/merge_requests/reviewing_and_managing_merge_requests.md', anchor: "checkout-merge-requests-locally-through-the-head-ref") + end + expose :merge_request_pipelines_docs_path do |merge_request| help_page_path('ci/merge_request_pipelines/index.md') end @@ -67,15 +74,15 @@ class MergeRequestWidgetEntity < Grape::Entity ) end - expose :user_callouts_path, if: -> (*) { Feature.enabled?(:suggest_pipeline, default_enabled: true) } do |_merge_request| + expose :user_callouts_path do |_merge_request| user_callouts_path end - expose :suggest_pipeline_feature_id, if: -> (*) { Feature.enabled?(:suggest_pipeline, default_enabled: true) } do |_merge_request| + expose :suggest_pipeline_feature_id do |_merge_request| SUGGEST_PIPELINE end - expose :is_dismissed_suggest_pipeline, if: -> (*) { Feature.enabled?(:suggest_pipeline, default_enabled: true) } do |_merge_request| + expose :is_dismissed_suggest_pipeline do |_merge_request| current_user && current_user.dismissed_callout?(feature_name: SUGGEST_PIPELINE) end @@ -87,6 +94,10 @@ class MergeRequestWidgetEntity < Grape::Entity new_project_pipeline_path(merge_request.project) end + expose :source_project_default_url do |merge_request| + merge_request.source_project && default_url_to_repo(merge_request.source_project) + end + # Rendering and redacting Markdown can be expensive. These links are # just nice to have in the merge request widget, so only # include them if they are explicitly requested on first load. diff --git a/app/serializers/paginated_diff_entity.rb b/app/serializers/paginated_diff_entity.rb index fe59686278c..1118b1aa4fe 100644 --- a/app/serializers/paginated_diff_entity.rb +++ b/app/serializers/paginated_diff_entity.rb @@ -13,7 +13,7 @@ class PaginatedDiffEntity < Grape::Entity submodule_links = Gitlab::SubmoduleLinks.new(merge_request.project.repository) DiffFileEntity.represent( - diffs.diff_files, + diffs.diff_files(sorted: true), options.merge( submodule_links: submodule_links, code_navigation_path: code_navigation_path(diffs), diff --git a/app/serializers/pipeline_serializer.rb b/app/serializers/pipeline_serializer.rb index a45214670fa..ab2c6dfeace 100644 --- a/app/serializers/pipeline_serializer.rb +++ b/app/serializers/pipeline_serializer.rb @@ -75,3 +75,5 @@ class PipelineSerializer < BaseSerializer ] end end + +PipelineSerializer.prepend_if_ee('EE::PipelineSerializer') diff --git a/app/serializers/rollout_status_entity.rb b/app/serializers/rollout_status_entity.rb new file mode 100644 index 00000000000..9f4c844859b --- /dev/null +++ b/app/serializers/rollout_status_entity.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +class RolloutStatusEntity < Grape::Entity + include RequestAwareEntity + + expose :status, as: :status + + # To be removed in API v5 + expose :has_legacy_app_label do |_rollout_status| + false + end + + expose :instances, if: -> (rollout_status, _) { rollout_status.found? } + expose :completion, if: -> (rollout_status, _) { rollout_status.found? } + expose :complete?, as: :is_completed, if: -> (rollout_status, _) { rollout_status.found? } + expose :canary_ingress, using: RolloutStatuses::IngressEntity, expose_nil: false, + if: -> (rollout_status, _) { rollout_status.found? && rollout_status.canary_ingress_exists? } +end diff --git a/app/serializers/rollout_statuses/ingress_entity.rb b/app/serializers/rollout_statuses/ingress_entity.rb new file mode 100644 index 00000000000..a68d936b86c --- /dev/null +++ b/app/serializers/rollout_statuses/ingress_entity.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +module RolloutStatuses + class IngressEntity < Grape::Entity + expose :canary_weight + end +end diff --git a/app/serializers/user_entity.rb b/app/serializers/user_entity.rb index 8909ae8df2c..9386c06b87a 100644 --- a/app/serializers/user_entity.rb +++ b/app/serializers/user_entity.rb @@ -2,3 +2,5 @@ class UserEntity < API::Entities::UserPath end + +UserEntity.prepend_if_ee('EE::UserEntity') diff --git a/app/serializers/user_serializer.rb b/app/serializers/user_serializer.rb index d988caea92d..dfbd787298d 100644 --- a/app/serializers/user_serializer.rb +++ b/app/serializers/user_serializer.rb @@ -8,7 +8,7 @@ class UserSerializer < BaseSerializer merge_request = opts[:project].merge_requests.find_by_iid!(params[:merge_request_iid]) preload_max_member_access(merge_request.project, Array(resource)) - super(resource, opts.merge(merge_request: merge_request), MergeRequestAssigneeEntity) + super(resource, opts.merge(merge_request: merge_request), MergeRequestUserEntity) else super end @@ -20,3 +20,5 @@ class UserSerializer < BaseSerializer project.team.max_member_access_for_user_ids(users.map(&:id)) end end + +UserSerializer.prepend_if_ee('EE::UserSerializer') |