diff options
Diffstat (limited to 'app/presenters')
-rw-r--r-- | app/presenters/ci/legacy_stage_presenter.rb | 32 | ||||
-rw-r--r-- | app/presenters/ci/pipeline_presenter.rb | 4 | ||||
-rw-r--r-- | app/presenters/clusterable_presenter.rb | 12 | ||||
-rw-r--r-- | app/presenters/clusters/cluster_presenter.rb | 16 | ||||
-rw-r--r-- | app/presenters/dev_ops_score/metric_presenter.rb (renamed from app/presenters/conversational_development_index/metric_presenter.rb) | 2 | ||||
-rw-r--r-- | app/presenters/group_clusterable_presenter.rb | 5 | ||||
-rw-r--r-- | app/presenters/hooks/project_hook_presenter.rb | 13 | ||||
-rw-r--r-- | app/presenters/hooks/service_hook_presenter.rb | 13 | ||||
-rw-r--r-- | app/presenters/instance_clusterable_presenter.rb | 15 | ||||
-rw-r--r-- | app/presenters/project_clusterable_presenter.rb | 5 | ||||
-rw-r--r-- | app/presenters/projects/settings/deploy_keys_presenter.rb | 62 | ||||
-rw-r--r-- | app/presenters/release_presenter.rb | 8 | ||||
-rw-r--r-- | app/presenters/sentry_detailed_error_presenter.rb | 15 | ||||
-rw-r--r-- | app/presenters/snippet_presenter.rb | 39 | ||||
-rw-r--r-- | app/presenters/web_hook_log_presenter.rb | 13 |
15 files changed, 215 insertions, 39 deletions
diff --git a/app/presenters/ci/legacy_stage_presenter.rb b/app/presenters/ci/legacy_stage_presenter.rb new file mode 100644 index 00000000000..56e268cff9f --- /dev/null +++ b/app/presenters/ci/legacy_stage_presenter.rb @@ -0,0 +1,32 @@ +# frozen_string_literal: true + +module Ci + class LegacyStagePresenter < Gitlab::View::Presenter::Delegated + presents :legacy_stage + + def latest_ordered_statuses + preload_statuses(legacy_stage.statuses.latest_ordered) + end + + def retried_ordered_statuses + preload_statuses(legacy_stage.statuses.retried_ordered) + end + + private + + def preload_statuses(statuses) + loaded_statuses = statuses.load + statuses.tap do |statuses| + # rubocop: disable CodeReuse/ActiveRecord + ActiveRecord::Associations::Preloader.new.preload(preloadable_statuses(loaded_statuses), %w[tags job_artifacts_archive metadata]) + # rubocop: enable CodeReuse/ActiveRecord + end + end + + def preloadable_statuses(statuses) + statuses.reject do |status| + status.instance_of?(::GenericCommitStatus) || status.instance_of?(::Ci::Bridge) + end + end + end +end diff --git a/app/presenters/ci/pipeline_presenter.rb b/app/presenters/ci/pipeline_presenter.rb index d81b1e6c522..f01ff56540a 100644 --- a/app/presenters/ci/pipeline_presenter.rb +++ b/app/presenters/ci/pipeline_presenter.rb @@ -8,7 +8,9 @@ module Ci # We use a class method here instead of a constant, allowing EE to redefine # the returned `Hash` more easily. def self.failure_reasons - { config_error: 'CI/CD YAML configuration error!' } + { unknown_failure: 'Unknown pipeline failure!', + config_error: 'CI/CD YAML configuration error!', + external_validation_failure: 'External pipeline validation failed!' } end presents :pipeline diff --git a/app/presenters/clusterable_presenter.rb b/app/presenters/clusterable_presenter.rb index 2306f55f1f4..6b1d82e7557 100644 --- a/app/presenters/clusterable_presenter.rb +++ b/app/presenters/clusterable_presenter.rb @@ -29,18 +29,10 @@ class ClusterablePresenter < Gitlab::View::Presenter::Delegated new_polymorphic_path([clusterable, :cluster], options) end - def aws_api_proxy_path(resource) - polymorphic_path([clusterable, :clusters], action: :aws_proxy, resource: resource) - end - def authorize_aws_role_path polymorphic_path([clusterable, :clusters], action: :authorize_aws_role) end - def revoke_aws_role_path - polymorphic_path([clusterable, :clusters], action: :revoke_aws_role) - end - def create_user_clusters_path polymorphic_path([clusterable, :clusters], action: :create_user) end @@ -65,6 +57,10 @@ class ClusterablePresenter < Gitlab::View::Presenter::Delegated raise NotImplementedError end + def clear_cluster_cache_path(cluster) + raise NotImplementedError + end + def cluster_path(cluster, params = {}) raise NotImplementedError end diff --git a/app/presenters/clusters/cluster_presenter.rb b/app/presenters/clusters/cluster_presenter.rb index 1634d2479a0..97771d84031 100644 --- a/app/presenters/clusters/cluster_presenter.rb +++ b/app/presenters/clusters/cluster_presenter.rb @@ -18,8 +18,20 @@ module Clusters end end - def gke_cluster_url - "https://console.cloud.google.com/kubernetes/clusters/details/#{provider.zone}/#{name}" if gcp? + def provider_label + if aws? + s_('ClusterIntegration|Elastic Kubernetes Service') + elsif gcp? + s_('ClusterIntegration|Google Kubernetes Engine') + end + end + + def provider_management_url + if aws? + "https://console.aws.amazon.com/eks/home?region=#{provider.region}\#/clusters/#{name}" + elsif gcp? + "https://console.cloud.google.com/kubernetes/clusters/details/#{provider.zone}/#{name}" + end end def can_read_cluster? diff --git a/app/presenters/conversational_development_index/metric_presenter.rb b/app/presenters/dev_ops_score/metric_presenter.rb index 9639b84cf56..d22beefee54 100644 --- a/app/presenters/conversational_development_index/metric_presenter.rb +++ b/app/presenters/dev_ops_score/metric_presenter.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module ConversationalDevelopmentIndex +module DevOpsScore class MetricPresenter < Gitlab::View::Presenter::Simple def cards [ diff --git a/app/presenters/group_clusterable_presenter.rb b/app/presenters/group_clusterable_presenter.rb index 54cea19b18e..21db2f6f96b 100644 --- a/app/presenters/group_clusterable_presenter.rb +++ b/app/presenters/group_clusterable_presenter.rb @@ -19,6 +19,11 @@ class GroupClusterablePresenter < ClusterablePresenter update_applications_group_cluster_path(clusterable, cluster, application) end + override :clear_cluster_cache_path + def clear_cluster_cache_path(cluster) + clear_cache_group_cluster_path(clusterable, cluster) + end + override :cluster_path def cluster_path(cluster, params = {}) group_cluster_path(clusterable, cluster, params) diff --git a/app/presenters/hooks/project_hook_presenter.rb b/app/presenters/hooks/project_hook_presenter.rb new file mode 100644 index 00000000000..a65c7221b5a --- /dev/null +++ b/app/presenters/hooks/project_hook_presenter.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +class ProjectHookPresenter < Gitlab::View::Presenter::Delegated + presents :project_hook + + def logs_details_path(log) + project_hook_hook_log_path(project, self, log) + end + + def logs_retry_path(log) + retry_project_hook_hook_log_path(project, self, log) + end +end diff --git a/app/presenters/hooks/service_hook_presenter.rb b/app/presenters/hooks/service_hook_presenter.rb new file mode 100644 index 00000000000..bc20d5b1a3b --- /dev/null +++ b/app/presenters/hooks/service_hook_presenter.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +class ServiceHookPresenter < Gitlab::View::Presenter::Delegated + presents :service_hook + + def logs_details_path(log) + project_service_hook_log_path(service.project, service, log) + end + + def logs_retry_path(log) + retry_project_service_hook_log_path(service.project, service, log) + end +end diff --git a/app/presenters/instance_clusterable_presenter.rb b/app/presenters/instance_clusterable_presenter.rb index c6572e8ce71..0c267fd5735 100644 --- a/app/presenters/instance_clusterable_presenter.rb +++ b/app/presenters/instance_clusterable_presenter.rb @@ -37,6 +37,11 @@ class InstanceClusterablePresenter < ClusterablePresenter update_applications_admin_cluster_path(cluster, application) end + override :clear_cluster_cache_path + def clear_cluster_cache_path(cluster) + clear_cache_admin_cluster_path(cluster) + end + override :cluster_path def cluster_path(cluster, params = {}) admin_cluster_path(cluster, params) @@ -62,16 +67,6 @@ class InstanceClusterablePresenter < ClusterablePresenter authorize_aws_role_admin_clusters_path end - override :revoke_aws_role_path - def revoke_aws_role_path - revoke_aws_role_admin_clusters_path - end - - override :aws_api_proxy_path - def aws_api_proxy_path(resource) - aws_proxy_admin_clusters_path(resource: resource) - end - override :empty_state_help_text def empty_state_help_text s_('ClusterIntegration|Adding an integration will share the cluster across all projects.') diff --git a/app/presenters/project_clusterable_presenter.rb b/app/presenters/project_clusterable_presenter.rb index 3fab69fff7a..5c56d42ed27 100644 --- a/app/presenters/project_clusterable_presenter.rb +++ b/app/presenters/project_clusterable_presenter.rb @@ -19,6 +19,11 @@ class ProjectClusterablePresenter < ClusterablePresenter update_applications_project_cluster_path(clusterable, cluster, application) end + override :clear_cluster_cache_path + def clear_cluster_cache_path(cluster) + clear_cache_project_cluster_path(clusterable, cluster) + end + override :cluster_path def cluster_path(cluster, params = {}) project_cluster_path(clusterable, cluster, params) diff --git a/app/presenters/projects/settings/deploy_keys_presenter.rb b/app/presenters/projects/settings/deploy_keys_presenter.rb index 9bb7fe13593..66211d02696 100644 --- a/app/presenters/projects/settings/deploy_keys_presenter.rb +++ b/app/presenters/projects/settings/deploy_keys_presenter.rb @@ -3,6 +3,8 @@ module Projects module Settings class DeployKeysPresenter < Gitlab::View::Presenter::Simple + include Gitlab::Utils::StrongMemoize + presents :project delegate :size, to: :enabled_keys, prefix: true delegate :size, to: :available_project_keys, prefix: true @@ -13,37 +15,45 @@ module Projects end def enabled_keys - project.deploy_keys + strong_memoize(:enabled_keys) do + project.deploy_keys.with_projects + end end def available_keys - current_user - .accessible_deploy_keys - .id_not_in(enabled_keys.select(:id)) - .with_projects + strong_memoize(:available_keys) do + current_user + .accessible_deploy_keys + .id_not_in(enabled_keys.select(:id)) + .with_projects + end end def available_project_keys - current_user - .project_deploy_keys - .id_not_in(enabled_keys.select(:id)) - .with_projects + strong_memoize(:available_project_keys) do + current_user + .project_deploy_keys + .id_not_in(enabled_keys.select(:id)) + .with_projects + end end def available_public_keys - DeployKey - .are_public - .id_not_in(enabled_keys.select(:id)) - .id_not_in(available_project_keys.select(:id)) - .with_projects + strong_memoize(:available_public_keys) do + DeployKey + .are_public + .id_not_in(enabled_keys.select(:id)) + .id_not_in(available_project_keys.select(:id)) + .with_projects + end end def as_json serializer = DeployKeySerializer.new # rubocop: disable CodeReuse/Serializer - opts = { user: current_user, project: project } + opts = { user: current_user, project: project, readable_project_ids: readable_project_ids } { - enabled_keys: serializer.represent(enabled_keys.with_projects, opts), + enabled_keys: serializer.represent(enabled_keys, opts), available_project_keys: serializer.represent(available_project_keys, opts), public_keys: serializer.represent(available_public_keys, opts) } @@ -56,6 +66,26 @@ module Projects def form_partial_path 'projects/deploy_keys/form' end + + private + + # Caching all readable project ids for the user that are associated with the queried deploy keys + def readable_project_ids + strong_memoize(:readable_projects_by_id) do + Set.new(user_readable_project_ids) + end + end + + # rubocop: disable CodeReuse/ActiveRecord + def user_readable_project_ids + project_ids = (available_keys + available_project_keys + available_public_keys) + .flat_map { |deploy_key| deploy_key.deploy_keys_projects.map(&:project_id) } + .compact + .uniq + + current_user.authorized_projects(Gitlab::Access::GUEST).id_in(project_ids).pluck(:id) + end + # rubocop: enable CodeReuse/ActiveRecord end end end diff --git a/app/presenters/release_presenter.rb b/app/presenters/release_presenter.rb index 42463d6dbda..b38bbc8d96c 100644 --- a/app/presenters/release_presenter.rb +++ b/app/presenters/release_presenter.rb @@ -37,6 +37,12 @@ class ReleasePresenter < Gitlab::View::Presenter::Delegated edit_project_release_url(project, release) end + def evidence_file_path + return unless release.evidence.present? + + evidence_project_release_url(project, tag, format: :json) + end + private def can_download_code? @@ -52,6 +58,6 @@ class ReleasePresenter < Gitlab::View::Presenter::Delegated end def release_edit_page_available? - ::Feature.enabled?(:release_edit_page, project, default_enabled: true) + can?(current_user, :update_release, release) end end diff --git a/app/presenters/sentry_detailed_error_presenter.rb b/app/presenters/sentry_detailed_error_presenter.rb new file mode 100644 index 00000000000..9329f987879 --- /dev/null +++ b/app/presenters/sentry_detailed_error_presenter.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +class SentryDetailedErrorPresenter < Gitlab::View::Presenter::Delegated + presents :error + + FrequencyStruct = Struct.new(:time, :count, keyword_init: true) + + def frequency + utc_offset = Time.zone_offset('UTC') + + error.frequency.map do |f| + FrequencyStruct.new(time: Time.at(f[0], in: utc_offset), count: f[1]) + end + end +end diff --git a/app/presenters/snippet_presenter.rb b/app/presenters/snippet_presenter.rb new file mode 100644 index 00000000000..a453be18b95 --- /dev/null +++ b/app/presenters/snippet_presenter.rb @@ -0,0 +1,39 @@ +# frozen_string_literal: true + +class SnippetPresenter < Gitlab::View::Presenter::Delegated + presents :snippet + + def web_url + Gitlab::UrlBuilder.build(snippet) + end + + def raw_url + Gitlab::UrlBuilder.build(snippet, raw: true) + end + + def can_read_snippet? + can_access_resource?("read") + end + + def can_update_snippet? + can_access_resource?("update") + end + + def can_admin_snippet? + can_access_resource?("admin") + end + + def can_report_as_spam? + snippet.submittable_as_spam_by?(current_user) + end + + private + + def can_access_resource?(ability_prefix) + can?(current_user, ability_name(ability_prefix), snippet) + end + + def ability_name(ability_prefix) + "#{ability_prefix}_#{snippet.to_ability_name}".to_sym + end +end diff --git a/app/presenters/web_hook_log_presenter.rb b/app/presenters/web_hook_log_presenter.rb new file mode 100644 index 00000000000..fca03ddb5d7 --- /dev/null +++ b/app/presenters/web_hook_log_presenter.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +class WebHookLogPresenter < Gitlab::View::Presenter::Delegated + presents :web_hook_log + + def details_path + web_hook.present.logs_details_path(self) + end + + def retry_path + web_hook.present.logs_retry_path(self) + end +end |