1# frozen_string_literal: true 2 3class EnvironmentEntity < Grape::Entity 4 include RequestAwareEntity 5 6 UNNECESSARY_ENTRIES_FOR_UPCOMING_DEPLOYMENT = 7 %i[manual_actions scheduled_actions playable_build cluster].freeze 8 9 expose :id 10 11 expose :global_id do |environment| 12 environment.to_global_id.to_s 13 end 14 15 expose :name 16 expose :state 17 expose :external_url 18 expose :environment_type 19 expose :name_without_type 20 expose :last_deployment, using: DeploymentEntity 21 expose :stop_action_available?, as: :has_stop_action 22 expose :rollout_status, if: -> (*) { can_read_deploy_board? }, using: RolloutStatusEntity 23 24 expose :upcoming_deployment, if: -> (environment) { environment.upcoming_deployment } do |environment, ops| 25 DeploymentEntity.represent(environment.upcoming_deployment, 26 ops.merge(except: UNNECESSARY_ENTRIES_FOR_UPCOMING_DEPLOYMENT)) 27 end 28 29 expose :metrics_path, if: -> (*) { environment.has_metrics? } do |environment| 30 metrics_project_environment_path(environment.project, environment) 31 end 32 33 expose :environment_path do |environment| 34 project_environment_path(environment.project, environment) 35 end 36 37 expose :stop_path do |environment| 38 stop_project_environment_path(environment.project, environment) 39 end 40 41 expose :cancel_auto_stop_path, if: -> (*) { can_update_environment? } do |environment| 42 cancel_auto_stop_project_environment_path(environment.project, environment) 43 end 44 45 expose :delete_path do |environment| 46 environment_delete_path(environment) 47 end 48 49 expose :cluster_type, if: ->(environment, _) { cluster_platform_kubernetes? } do |environment| 50 cluster.cluster_type 51 end 52 53 expose :terminal_path, if: ->(*) { environment.has_terminals? && can_access_terminal? } do |environment| 54 terminal_project_environment_path(environment.project, environment) 55 end 56 57 expose :folder_path do |environment| 58 folder_project_environments_path(environment.project, environment.folder_name) 59 end 60 61 expose :created_at, :updated_at 62 expose :auto_stop_at, expose_nil: false 63 64 expose :can_stop do |environment| 65 environment.available? && can?(current_user, :stop_environment, environment) 66 end 67 68 expose :logs_path, if: -> (*) { can_read_pod_logs? } do |environment| 69 project_logs_path(environment.project, environment_name: environment.name) 70 end 71 72 expose :logs_api_path, if: -> (*) { can_read_pod_logs? } do |environment| 73 if environment.elastic_stack_available? 74 elasticsearch_project_logs_path(environment.project, environment_name: environment.name, format: :json) 75 else 76 k8s_project_logs_path(environment.project, environment_name: environment.name, format: :json) 77 end 78 end 79 80 expose :enable_advanced_logs_querying, if: -> (*) { can_read_pod_logs? } do |environment| 81 environment.elastic_stack_available? 82 end 83 84 expose :can_delete do |environment| 85 can?(current_user, :destroy_environment, environment) 86 end 87 88 private 89 90 alias_method :environment, :object 91 92 def current_user 93 request.current_user 94 end 95 96 def can_access_terminal? 97 can?(request.current_user, :create_environment_terminal, environment) 98 end 99 100 def can_update_environment? 101 can?(current_user, :update_environment, environment) 102 end 103 104 def can_read_pod_logs? 105 can?(current_user, :read_pod_logs, environment.project) 106 end 107 108 def can_read_deploy_board? 109 can?(current_user, :read_deploy_board, environment.project) 110 end 111 112 def cluster_platform_kubernetes? 113 deployment_platform && deployment_platform.is_a?(Clusters::Platforms::Kubernetes) 114 end 115 116 def deployment_platform 117 environment.deployment_platform 118 end 119 120 def cluster 121 deployment_platform.cluster 122 end 123end 124 125EnvironmentEntity.prepend_mod_with('EnvironmentEntity') 126