diff options
Diffstat (limited to 'app/serializers')
32 files changed, 250 insertions, 39 deletions
diff --git a/app/serializers/build_trace_entity.rb b/app/serializers/build_trace_entity.rb index b5bac8a5d64..f4c3c7770b2 100644 --- a/app/serializers/build_trace_entity.rb +++ b/app/serializers/build_trace_entity.rb @@ -12,6 +12,5 @@ class BuildTraceEntity < Grape::Entity expose :size expose :total - expose :json_lines, as: :lines, if: ->(*) { object.json? } - expose :html_lines, as: :html, if: ->(*) { object.html? } + expose :lines end diff --git a/app/serializers/ci/group_variable_entity.rb b/app/serializers/ci/group_variable_entity.rb new file mode 100644 index 00000000000..e7d0a957082 --- /dev/null +++ b/app/serializers/ci/group_variable_entity.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +module Ci + class GroupVariableEntity < Ci::BasicVariableEntity + end +end diff --git a/app/serializers/ci/group_variable_serializer.rb b/app/serializers/ci/group_variable_serializer.rb new file mode 100644 index 00000000000..b100a931620 --- /dev/null +++ b/app/serializers/ci/group_variable_serializer.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +module Ci + class GroupVariableSerializer < BaseSerializer + entity ::Ci::GroupVariableEntity + end +end diff --git a/app/serializers/ci/variable_entity.rb b/app/serializers/ci/variable_entity.rb new file mode 100644 index 00000000000..715f829a0e1 --- /dev/null +++ b/app/serializers/ci/variable_entity.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +module Ci + class VariableEntity < Ci::BasicVariableEntity + expose :environment_scope + end +end diff --git a/app/serializers/ci/variable_serializer.rb b/app/serializers/ci/variable_serializer.rb new file mode 100644 index 00000000000..eb47d3b71b5 --- /dev/null +++ b/app/serializers/ci/variable_serializer.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +module Ci + class VariableSerializer < BaseSerializer + entity ::Ci::VariableEntity + end +end diff --git a/app/serializers/cluster_application_entity.rb b/app/serializers/cluster_application_entity.rb index 32b759b9628..6b9a3ce114b 100644 --- a/app/serializers/cluster_application_entity.rb +++ b/app/serializers/cluster_application_entity.rb @@ -4,7 +4,7 @@ class ClusterApplicationEntity < Grape::Entity expose :name expose :status_name, as: :status expose :status_reason - expose :version + expose :version, if: -> (e, _) { e.respond_to?(:version) } expose :external_ip, if: -> (e, _) { e.respond_to?(:external_ip) } expose :external_hostname, if: -> (e, _) { e.respond_to?(:external_hostname) } expose :hostname, if: -> (e, _) { e.respond_to?(:hostname) } diff --git a/app/serializers/cluster_entity.rb b/app/serializers/cluster_entity.rb index 8a1d41dbd96..a46f2889a96 100644 --- a/app/serializers/cluster_entity.rb +++ b/app/serializers/cluster_entity.rb @@ -16,4 +16,8 @@ class ClusterEntity < Grape::Entity expose :path do |cluster| Clusters::ClusterPresenter.new(cluster).show_path # rubocop: disable CodeReuse/Presenter end + + expose :gitlab_managed_apps_logs_path do |cluster| + Clusters::ClusterPresenter.new(cluster, current_user: request.current_user).gitlab_managed_apps_logs_path # rubocop: disable CodeReuse/Presenter + end end diff --git a/app/serializers/cluster_serializer.rb b/app/serializers/cluster_serializer.rb index 27156d3178f..92363a4942c 100644 --- a/app/serializers/cluster_serializer.rb +++ b/app/serializers/cluster_serializer.rb @@ -10,6 +10,7 @@ class ClusterSerializer < BaseSerializer :cluster_type, :enabled, :environment_scope, + :gitlab_managed_apps_logs_path, :name, :nodes, :path, diff --git a/app/serializers/deploy_key_entity.rb b/app/serializers/deploy_key_entity.rb index 653316ce4d2..486189b84ca 100644 --- a/app/serializers/deploy_key_entity.rb +++ b/app/serializers/deploy_key_entity.rb @@ -16,6 +16,7 @@ class DeployKeyEntity < Grape::Entity end end expose :can_edit + expose :user, as: :owner, using: ::API::Entities::UserBasic, if: -> (_, opts) { can_read_owner?(opts) } private @@ -24,6 +25,10 @@ class DeployKeyEntity < Grape::Entity Ability.allowed?(options[:user], :update_deploy_keys_project, object.deploy_keys_project_for(options[:project])) end + def can_read_owner?(opts) + opts[:with_owner] && Ability.allowed?(options[:user], :read_user, object.user) + end + def allowed_to_read_project?(project) if options[:readable_project_ids] options[:readable_project_ids].include?(project.id) diff --git a/app/serializers/diff_file_base_entity.rb b/app/serializers/diff_file_base_entity.rb index 33eb33d314b..2af14f1eb82 100644 --- a/app/serializers/diff_file_base_entity.rb +++ b/app/serializers/diff_file_base_entity.rb @@ -26,13 +26,9 @@ class DiffFileBaseEntity < Grape::Entity target_project, target_branch = edit_project_branch_options(merge_request) - if Feature.enabled?(:web_ide_default) - ide_edit_path(target_project, target_branch, diff_file.new_path) - else - options = merge_request.persisted? && merge_request.source_branch_exists? && !merge_request.merged? ? { from_merge_request_iid: merge_request.iid } : {} + options = merge_request.persisted? && merge_request.source_branch_exists? && !merge_request.merged? ? { from_merge_request_iid: merge_request.iid } : {} - project_edit_blob_path(target_project, tree_join(target_branch, diff_file.new_path), options) - end + project_edit_blob_path(target_project, tree_join(target_branch, diff_file.new_path), options) end expose :old_path_html do |diff_file| diff --git a/app/serializers/evidences/release_entity.rb b/app/serializers/evidences/release_entity.rb index 59e379a3c08..dfc4f52de07 100644 --- a/app/serializers/evidences/release_entity.rb +++ b/app/serializers/evidences/release_entity.rb @@ -11,3 +11,5 @@ module Evidences expose :milestones, using: Evidences::MilestoneEntity end end + +Evidences::ReleaseEntity.prepend_if_ee('EE::Evidences::ReleaseEntity') diff --git a/app/serializers/fork_namespace_entity.rb b/app/serializers/fork_namespace_entity.rb new file mode 100644 index 00000000000..068862e0951 --- /dev/null +++ b/app/serializers/fork_namespace_entity.rb @@ -0,0 +1,52 @@ +# frozen_string_literal: true + +class ForkNamespaceEntity < Grape::Entity + include ActionView::Helpers::NumberHelper + include RequestAwareEntity + include MarkupHelper + + expose :id, :name, :description, :visibility, :full_name, + :created_at, :updated_at, :avatar_url + + expose :fork_path do |namespace, options| + project_forks_path(options[:project], namespace_key: namespace.id) + end + + expose :forked_project_path do |namespace, options| + if forked_project = namespace.find_fork_of(options[:project]) + project_path(forked_project) + end + end + + expose :permission do |namespace, options| + membership(options[:current_user], namespace)&.human_access + end + + expose :relative_path do |namespace| + polymorphic_path(namespace) + end + + expose :markdown_description do |namespace| + markdown_description(namespace) + end + + expose :can_create_project do |namespace, options| + options[:current_user].can?(:create_projects, namespace) + end + + private + + # rubocop: disable CodeReuse/ActiveRecord + def membership(user, object) + return unless user + + @membership ||= user.members.find_by(source: object) + end + # rubocop: enable CodeReuse/ActiveRecord + + def markdown_description(namespace) + markdown_field(namespace, :description) + end +end + +ForkNamespaceEntity.prepend_if_ee('EE::ForkNamespaceEntity') diff --git a/app/serializers/fork_namespace_serializer.rb b/app/serializers/fork_namespace_serializer.rb new file mode 100644 index 00000000000..1461938269e --- /dev/null +++ b/app/serializers/fork_namespace_serializer.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +class ForkNamespaceSerializer < BaseSerializer + entity ForkNamespaceEntity +end diff --git a/app/serializers/group_variable_entity.rb b/app/serializers/group_variable_entity.rb deleted file mode 100644 index 4f44723fefe..00000000000 --- a/app/serializers/group_variable_entity.rb +++ /dev/null @@ -1,4 +0,0 @@ -# frozen_string_literal: true - -class GroupVariableEntity < Ci::BasicVariableEntity -end diff --git a/app/serializers/group_variable_serializer.rb b/app/serializers/group_variable_serializer.rb deleted file mode 100644 index ed20b240cce..00000000000 --- a/app/serializers/group_variable_serializer.rb +++ /dev/null @@ -1,5 +0,0 @@ -# frozen_string_literal: true - -class GroupVariableSerializer < BaseSerializer - entity GroupVariableEntity -end diff --git a/app/serializers/merge_request_poll_cached_widget_entity.rb b/app/serializers/merge_request_poll_cached_widget_entity.rb index 72f629b3507..c51c08ab646 100644 --- a/app/serializers/merge_request_poll_cached_widget_entity.rb +++ b/app/serializers/merge_request_poll_cached_widget_entity.rb @@ -74,6 +74,30 @@ class MergeRequestPollCachedWidgetEntity < IssuableEntity diffs_project_merge_request_path(merge_request.project, merge_request) end + expose :squash_enabled_by_default do |merge_request| + presenter(merge_request).project.squash_enabled_by_default? + end + + expose :squash_readonly do |merge_request| + presenter(merge_request).project.squash_readonly? + end + + expose :squash_on_merge do |merge_request| + presenter(merge_request).squash_on_merge? + end + + expose :api_approvals_path do |merge_request| + presenter(merge_request).api_approvals_path + end + + expose :api_approve_path do |merge_request| + presenter(merge_request).api_approve_path + end + + expose :api_unapprove_path do |merge_request| + presenter(merge_request).api_unapprove_path + end + private delegate :current_user, to: :request diff --git a/app/serializers/merge_request_poll_widget_entity.rb b/app/serializers/merge_request_poll_widget_entity.rb index aad607f358a..a365ebc29c9 100644 --- a/app/serializers/merge_request_poll_widget_entity.rb +++ b/app/serializers/merge_request_poll_widget_entity.rb @@ -145,6 +145,22 @@ class MergeRequestPollWidgetEntity < Grape::Entity presenter(merge_request).revert_in_fork_path end + expose :squash_enabled_by_default do |merge_request| + presenter(merge_request).project.squash_enabled_by_default? + end + + expose :squash_readonly do |merge_request| + presenter(merge_request).project.squash_readonly? + end + + expose :squash_on_merge do |merge_request| + presenter(merge_request).squash_on_merge? + end + + expose :approvals_widget_type do |merge_request| + presenter(merge_request).approvals_widget_type + end + private delegate :current_user, to: :request diff --git a/app/serializers/merge_request_widget_entity.rb b/app/serializers/merge_request_widget_entity.rb index 74f29b36209..2a7afb57314 100644 --- a/app/serializers/merge_request_widget_entity.rb +++ b/app/serializers/merge_request_widget_entity.rb @@ -85,6 +85,26 @@ class MergeRequestWidgetEntity < Grape::Entity end end + expose :blob_path do + expose :head_path, if: -> (mr, _) { mr.source_branch_sha } do |merge_request| + project_blob_path(merge_request.project, merge_request.source_branch_sha) + end + + expose :base_path, if: -> (mr, _) { mr.diff_base_sha } do |merge_request| + project_blob_path(merge_request.project, merge_request.diff_base_sha) + end + end + + expose :codeclimate, if: -> (mr, _) { head_pipeline_downloadable_path_for_report_type(:codequality) } do + expose :head_path do |merge_request| + head_pipeline_downloadable_path_for_report_type(:codequality) + end + + expose :base_path do |merge_request| + base_pipeline_downloadable_path_for_report_type(:codequality) + end + end + private delegate :current_user, to: :request @@ -95,12 +115,24 @@ class MergeRequestWidgetEntity < Grape::Entity end def can_add_ci_config_path?(merge_request) - merge_request.source_project&.uses_default_ci_config? && + merge_request.open? && + merge_request.source_branch_exists? && + merge_request.source_project&.uses_default_ci_config? && !merge_request.source_project.has_ci? && merge_request.commits_count.positive? && can?(current_user, :read_build, merge_request.source_project) && can?(current_user, :create_pipeline, merge_request.source_project) end + + def head_pipeline_downloadable_path_for_report_type(file_type) + object.head_pipeline&.present(current_user: current_user) + &.downloadable_path_for_report_type(file_type) + end + + def base_pipeline_downloadable_path_for_report_type(file_type) + object.base_pipeline&.present(current_user: current_user) + &.downloadable_path_for_report_type(file_type) + end end MergeRequestWidgetEntity.prepend_if_ee('EE::MergeRequestWidgetEntity') diff --git a/app/serializers/pipeline_entity.rb b/app/serializers/pipeline_entity.rb index c3ddbb88c9c..8333a0bb863 100644 --- a/app/serializers/pipeline_entity.rb +++ b/app/serializers/pipeline_entity.rb @@ -85,6 +85,10 @@ class PipelineEntity < Grape::Entity pipeline.failed_builds end + expose :tests_total_count, if: -> (pipeline, _) { Feature.enabled?(:build_report_summary, pipeline.project) } do |pipeline| + pipeline.test_report_summary.total_count + end + private alias_method :pipeline, :object diff --git a/app/serializers/pipeline_serializer.rb b/app/serializers/pipeline_serializer.rb index 21d49c6c292..bfd6851647f 100644 --- a/app/serializers/pipeline_serializer.rb +++ b/app/serializers/pipeline_serializer.rb @@ -60,8 +60,8 @@ class PipelineSerializer < BaseSerializer }, pending_builds: :project, project: [:route, { namespace: :route }], - triggered_by_pipeline: [:project, :user], - triggered_pipelines: [:project, :user] + triggered_by_pipeline: [{ project: [:route, { namespace: :route }] }, :user], + triggered_pipelines: [{ project: [:route, { namespace: :route }] }, :user, :source_job] } ] end diff --git a/app/serializers/service_event_entity.rb b/app/serializers/service_event_entity.rb index fd655dd1ed3..eb4f9c665f2 100644 --- a/app/serializers/service_event_entity.rb +++ b/app/serializers/service_event_entity.rb @@ -14,7 +14,7 @@ class ServiceEventEntity < Grape::Entity end expose :description do |event| - service.class.event_description(event) + ServicesHelper.service_event_description(event) end expose :field, if: -> (_, _) { event_field } do diff --git a/app/serializers/service_field_entity.rb b/app/serializers/service_field_entity.rb index 9929d7e2e5a..08e08ae187f 100644 --- a/app/serializers/service_field_entity.rb +++ b/app/serializers/service_field_entity.rb @@ -11,6 +11,8 @@ class ServiceFieldEntity < Grape::Entity if field[:type] == 'password' && value.present? 'true' + elsif field[:type] == 'checkbox' + ActiveRecord::Type::Boolean.new.deserialize(value).to_s else value end diff --git a/app/serializers/stage_entity.rb b/app/serializers/stage_entity.rb index 0b0454c5282..0aadcd01a43 100644 --- a/app/serializers/stage_entity.rb +++ b/app/serializers/stage_entity.rb @@ -59,13 +59,13 @@ class StageEntity < Grape::Entity end def latest_statuses - HasStatus::ORDERED_STATUSES.flat_map do |ordered_status| + Ci::HasStatus::ORDERED_STATUSES.flat_map do |ordered_status| grouped_statuses.fetch(ordered_status, []) end end def retried_statuses - HasStatus::ORDERED_STATUSES.flat_map do |ordered_status| + Ci::HasStatus::ORDERED_STATUSES.flat_map do |ordered_status| grouped_retried_statuses.fetch(ordered_status, []) end end diff --git a/app/serializers/suggestion_entity.rb b/app/serializers/suggestion_entity.rb index 4fb19fbc074..c9fcbe14f2e 100644 --- a/app/serializers/suggestion_entity.rb +++ b/app/serializers/suggestion_entity.rb @@ -2,6 +2,7 @@ class SuggestionEntity < API::Entities::Suggestion include RequestAwareEntity + include Gitlab::Utils::StrongMemoize unexpose :from_line, :to_line, :from_content, :to_content expose :diff_lines, using: DiffLineEntity do |suggestion| @@ -9,7 +10,29 @@ class SuggestionEntity < API::Entities::Suggestion end expose :current_user do expose :can_apply do |suggestion| - Ability.allowed?(current_user, :apply_suggestion, suggestion) + can_apply?(suggestion) + end + end + + expose :inapplicable_reason do |suggestion| + next _("You don't have write access to the source branch.") unless can_apply?(suggestion) + next if suggestion.appliable? + + case suggestion.inapplicable_reason + when :merge_request_merged + _("This merge request was merged. To apply this suggestion, edit this file directly.") + when :merge_request_closed + _("This merge request is closed. To apply this suggestion, edit this file directly.") + when :source_branch_deleted + _("Can't apply as the source branch was deleted.") + when :outdated + phrase = suggestion.single_line? ? 'this line was' : 'these lines were' + + _("Can't apply as %{phrase} changed in a more recent version.") % { phrase: phrase } + when :same_content + _("This suggestion already matches its content.") + else + _("Can't apply this suggestion.") end end @@ -18,4 +41,10 @@ class SuggestionEntity < API::Entities::Suggestion def current_user request.current_user end + + def can_apply?(suggestion) + strong_memoize(:can_apply) do + Ability.allowed?(current_user, :apply_suggestion, suggestion) + end + end end diff --git a/app/serializers/test_report_summary_entity.rb b/app/serializers/test_report_summary_entity.rb new file mode 100644 index 00000000000..5995ca007d6 --- /dev/null +++ b/app/serializers/test_report_summary_entity.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class TestReportSummaryEntity < TestReportEntity + expose :test_suites, using: TestSuiteSummaryEntity do |summary| + summary.test_suites.values + end +end diff --git a/app/serializers/test_report_summary_serializer.rb b/app/serializers/test_report_summary_serializer.rb new file mode 100644 index 00000000000..6077a4e87bb --- /dev/null +++ b/app/serializers/test_report_summary_serializer.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +class TestReportSummarySerializer < BaseSerializer + entity TestReportSummaryEntity +end diff --git a/app/serializers/test_suite_entity.rb b/app/serializers/test_suite_entity.rb index 53fa830718a..d04fd5f6a84 100644 --- a/app/serializers/test_suite_entity.rb +++ b/app/serializers/test_suite_entity.rb @@ -9,9 +9,11 @@ class TestSuiteEntity < Grape::Entity expose :failed_count expose :skipped_count expose :error_count - expose :suite_error - expose :test_cases, using: TestCaseEntity do |test_suite| - test_suite.suite_error ? [] : test_suite.test_cases.values.flat_map(&:values) + with_options if: -> (_, opts) { opts[:details] } do |test_suite| + expose :suite_error + expose :test_cases, using: TestCaseEntity do |test_suite| + test_suite.suite_error ? [] : test_suite.test_cases.values.flat_map(&:values) + end end end diff --git a/app/serializers/test_suite_serializer.rb b/app/serializers/test_suite_serializer.rb new file mode 100644 index 00000000000..f11d0fbe7e6 --- /dev/null +++ b/app/serializers/test_suite_serializer.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +class TestSuiteSerializer < BaseSerializer + entity TestSuiteEntity +end diff --git a/app/serializers/test_suite_summary_entity.rb b/app/serializers/test_suite_summary_entity.rb new file mode 100644 index 00000000000..6718b31a7f5 --- /dev/null +++ b/app/serializers/test_suite_summary_entity.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class TestSuiteSummaryEntity < TestSuiteEntity + expose :build_ids do |summary| + summary.build_ids + end +end diff --git a/app/serializers/triggered_pipeline_entity.rb b/app/serializers/triggered_pipeline_entity.rb index fd7e4454abf..47f51a6d76a 100644 --- a/app/serializers/triggered_pipeline_entity.rb +++ b/app/serializers/triggered_pipeline_entity.rb @@ -11,6 +11,12 @@ class TriggeredPipelineEntity < Grape::Entity expose :coverage expose :source + expose :source_job do + expose :name do |pipeline| + pipeline.source_job&.name + end + end + expose :path do |pipeline| project_pipeline_path(pipeline.project, pipeline) end @@ -27,7 +33,7 @@ class TriggeredPipelineEntity < Grape::Entity as: :triggered_by, with: TriggeredPipelineEntity, if: -> (_, opts) { can_read_details? && expand_for_path?(opts) } - expose :triggered_pipelines, + expose :triggered_pipelines_with_preloads, as: :triggered, using: TriggeredPipelineEntity, if: -> (_, opts) { can_read_details? && expand_for_path?(opts) } diff --git a/app/serializers/variable_entity.rb b/app/serializers/variable_entity.rb deleted file mode 100644 index 9b0db371acb..00000000000 --- a/app/serializers/variable_entity.rb +++ /dev/null @@ -1,5 +0,0 @@ -# frozen_string_literal: true - -class VariableEntity < Ci::BasicVariableEntity - expose :environment_scope -end diff --git a/app/serializers/variable_serializer.rb b/app/serializers/variable_serializer.rb deleted file mode 100644 index 586666cad8e..00000000000 --- a/app/serializers/variable_serializer.rb +++ /dev/null @@ -1,5 +0,0 @@ -# frozen_string_literal: true - -class VariableSerializer < BaseSerializer - entity VariableEntity -end |