2022-08-13 15:12:31 +05:30
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
module Gitlab
|
|
|
|
module Pages
|
|
|
|
class CacheControl
|
2022-11-25 23:54:43 +05:30
|
|
|
include Gitlab::Utils::StrongMemoize
|
2022-08-13 15:12:31 +05:30
|
|
|
|
2022-11-25 23:54:43 +05:30
|
|
|
EXPIRE = 12.hours
|
|
|
|
# To avoid delivering expired deployment URL in the cached payload,
|
|
|
|
# use a longer expiration time in the deployment URL
|
|
|
|
DEPLOYMENT_EXPIRATION = (EXPIRE + 12.hours)
|
|
|
|
CACHE_KEY_FORMAT = 'pages_domain_for_%{type}_%{id}_%{settings}'
|
2022-08-13 15:12:31 +05:30
|
|
|
|
|
|
|
class << self
|
|
|
|
def for_project(project_id)
|
|
|
|
new(type: :project, id: project_id)
|
|
|
|
end
|
|
|
|
|
|
|
|
def for_namespace(namespace_id)
|
|
|
|
new(type: :namespace, id: namespace_id)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def initialize(type:, id:)
|
|
|
|
raise(ArgumentError, "type must be :namespace or :project") unless %i[namespace project].include?(type)
|
|
|
|
|
2022-11-25 23:54:43 +05:30
|
|
|
@type = type
|
|
|
|
@id = id
|
|
|
|
end
|
|
|
|
|
|
|
|
def cache_key
|
|
|
|
strong_memoize(:cache_key) do
|
|
|
|
CACHE_KEY_FORMAT % {
|
|
|
|
type: @type,
|
|
|
|
id: @id,
|
|
|
|
settings: settings
|
|
|
|
}
|
|
|
|
end
|
2022-08-13 15:12:31 +05:30
|
|
|
end
|
|
|
|
|
|
|
|
def clear_cache
|
|
|
|
Rails.cache.delete(cache_key)
|
|
|
|
end
|
2022-11-25 23:54:43 +05:30
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
def settings
|
|
|
|
values = ::Gitlab.config.pages.dup
|
|
|
|
|
|
|
|
values['app_settings'] = ::Gitlab::CurrentSettings.attributes.slice(
|
|
|
|
'force_pages_access_control'
|
|
|
|
)
|
|
|
|
|
|
|
|
::Digest::SHA256.hexdigest(values.inspect)
|
|
|
|
end
|
2022-08-13 15:12:31 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|