summaryrefslogtreecommitdiff
path: root/app/presenters
diff options
context:
space:
mode:
Diffstat (limited to 'app/presenters')
-rw-r--r--app/presenters/ci/legacy_stage_presenter.rb32
-rw-r--r--app/presenters/ci/pipeline_presenter.rb4
-rw-r--r--app/presenters/clusterable_presenter.rb12
-rw-r--r--app/presenters/clusters/cluster_presenter.rb16
-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.rb5
-rw-r--r--app/presenters/hooks/project_hook_presenter.rb13
-rw-r--r--app/presenters/hooks/service_hook_presenter.rb13
-rw-r--r--app/presenters/instance_clusterable_presenter.rb15
-rw-r--r--app/presenters/project_clusterable_presenter.rb5
-rw-r--r--app/presenters/projects/settings/deploy_keys_presenter.rb62
-rw-r--r--app/presenters/release_presenter.rb8
-rw-r--r--app/presenters/sentry_detailed_error_presenter.rb15
-rw-r--r--app/presenters/snippet_presenter.rb39
-rw-r--r--app/presenters/web_hook_log_presenter.rb13
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