2018-12-05 23:21:45 +05:30
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2018-03-17 18:26:18 +05:30
|
|
|
module API
|
2021-01-03 14:25:43 +05:30
|
|
|
class PagesDomains < ::API::Base
|
2018-03-17 18:26:18 +05:30
|
|
|
include PaginationParams
|
|
|
|
|
2021-01-29 00:20:46 +05:30
|
|
|
feature_category :pages
|
|
|
|
|
2019-02-15 15:39:39 +05:30
|
|
|
PAGES_DOMAINS_ENDPOINT_REQUIREMENTS = API::NAMESPACE_OR_PROJECT_REQUIREMENTS.merge(domain: API::NO_SLASH_URL_PART_REGEX)
|
2018-03-27 19:54:05 +05:30
|
|
|
|
2018-03-17 18:26:18 +05:30
|
|
|
before do
|
|
|
|
authenticate!
|
|
|
|
end
|
|
|
|
|
|
|
|
after_validation do
|
|
|
|
normalize_params_file_to_string
|
|
|
|
end
|
|
|
|
|
|
|
|
helpers do
|
2018-12-05 23:21:45 +05:30
|
|
|
# rubocop: disable CodeReuse/ActiveRecord
|
2018-03-17 18:26:18 +05:30
|
|
|
def find_pages_domain!
|
|
|
|
user_project.pages_domains.find_by(domain: params[:domain]) || not_found!('PagesDomain')
|
|
|
|
end
|
2018-12-05 23:21:45 +05:30
|
|
|
# rubocop: enable CodeReuse/ActiveRecord
|
2018-03-17 18:26:18 +05:30
|
|
|
|
|
|
|
def pages_domain
|
|
|
|
@pages_domain ||= find_pages_domain!
|
|
|
|
end
|
|
|
|
|
|
|
|
def normalize_params_file_to_string
|
|
|
|
params.each do |k, v|
|
|
|
|
if v.is_a?(Hash) && v.key?(:tempfile)
|
|
|
|
params[k] = v[:tempfile].to_a.join('')
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
resource :pages do
|
|
|
|
before do
|
|
|
|
require_pages_config_enabled!
|
2020-01-01 13:55:28 +05:30
|
|
|
authenticated_with_can_read_all_resources!
|
2018-03-17 18:26:18 +05:30
|
|
|
end
|
|
|
|
|
|
|
|
desc "Get all pages domains" do
|
|
|
|
success Entities::PagesDomainBasic
|
|
|
|
end
|
|
|
|
params do
|
|
|
|
use :pagination
|
|
|
|
end
|
|
|
|
get "domains" do
|
|
|
|
present paginate(PagesDomain.all), with: Entities::PagesDomainBasic
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
params do
|
|
|
|
requires :id, type: String, desc: 'The ID of a project'
|
|
|
|
end
|
2019-02-15 15:39:39 +05:30
|
|
|
resource :projects, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
|
2018-03-17 18:26:18 +05:30
|
|
|
before do
|
|
|
|
require_pages_enabled!
|
|
|
|
end
|
|
|
|
|
|
|
|
desc 'Get all pages domains' do
|
|
|
|
success Entities::PagesDomain
|
|
|
|
end
|
|
|
|
params do
|
|
|
|
use :pagination
|
|
|
|
end
|
2018-12-05 23:21:45 +05:30
|
|
|
# rubocop: disable CodeReuse/ActiveRecord
|
2018-03-17 18:26:18 +05:30
|
|
|
get ":id/pages/domains" do
|
|
|
|
authorize! :read_pages, user_project
|
|
|
|
|
|
|
|
present paginate(user_project.pages_domains.order(:domain)), with: Entities::PagesDomain
|
|
|
|
end
|
2018-12-05 23:21:45 +05:30
|
|
|
# rubocop: enable CodeReuse/ActiveRecord
|
2018-03-17 18:26:18 +05:30
|
|
|
|
|
|
|
desc 'Get a single pages domain' do
|
|
|
|
success Entities::PagesDomain
|
|
|
|
end
|
|
|
|
params do
|
|
|
|
requires :domain, type: String, desc: 'The domain'
|
|
|
|
end
|
2018-03-27 19:54:05 +05:30
|
|
|
get ":id/pages/domains/:domain", requirements: PAGES_DOMAINS_ENDPOINT_REQUIREMENTS do
|
2018-03-17 18:26:18 +05:30
|
|
|
authorize! :read_pages, user_project
|
|
|
|
|
|
|
|
present pages_domain, with: Entities::PagesDomain
|
|
|
|
end
|
|
|
|
|
|
|
|
desc 'Create a new pages domain' do
|
|
|
|
success Entities::PagesDomain
|
|
|
|
end
|
|
|
|
params do
|
|
|
|
requires :domain, type: String, desc: 'The domain'
|
2019-12-04 20:38:33 +05:30
|
|
|
# rubocop:disable Scalability/FileUploads
|
|
|
|
# TODO: remove rubocop disable - https://gitlab.com/gitlab-org/gitlab/issues/14960
|
2019-12-26 22:10:19 +05:30
|
|
|
optional :certificate, types: [File, String], desc: 'The certificate', as: :user_provided_certificate
|
|
|
|
optional :key, types: [File, String], desc: 'The key', as: :user_provided_key
|
|
|
|
optional :auto_ssl_enabled, allow_blank: false, type: Boolean, default: false,
|
2022-08-27 11:52:29 +05:30
|
|
|
desc: "Enables automatic generation of SSL certificates issued by Let's Encrypt for custom domains."
|
2019-12-04 20:38:33 +05:30
|
|
|
# rubocop:enable Scalability/FileUploads
|
2019-09-30 21:07:59 +05:30
|
|
|
all_or_none_of :user_provided_certificate, :user_provided_key
|
2018-03-17 18:26:18 +05:30
|
|
|
end
|
|
|
|
post ":id/pages/domains" do
|
|
|
|
authorize! :update_pages, user_project
|
|
|
|
|
|
|
|
pages_domain_params = declared(params, include_parent_namespaces: false)
|
2019-09-30 21:07:59 +05:30
|
|
|
|
2022-11-25 23:54:43 +05:30
|
|
|
pages_domain = ::PagesDomains::CreateService
|
|
|
|
.new(user_project, current_user, pages_domain_params)
|
|
|
|
.execute
|
2018-03-17 18:26:18 +05:30
|
|
|
|
|
|
|
if pages_domain.persisted?
|
|
|
|
present pages_domain, with: Entities::PagesDomain
|
|
|
|
else
|
|
|
|
render_validation_error!(pages_domain)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
desc 'Updates a pages domain'
|
|
|
|
params do
|
|
|
|
requires :domain, type: String, desc: 'The domain'
|
2019-12-04 20:38:33 +05:30
|
|
|
# rubocop:disable Scalability/FileUploads
|
|
|
|
# TODO: remove rubocop disable - https://gitlab.com/gitlab-org/gitlab/issues/14960
|
2019-12-26 22:10:19 +05:30
|
|
|
optional :certificate, types: [File, String], desc: 'The certificate', as: :user_provided_certificate
|
|
|
|
optional :key, types: [File, String], desc: 'The key', as: :user_provided_key
|
|
|
|
optional :auto_ssl_enabled, allow_blank: true, type: Boolean,
|
2022-08-27 11:52:29 +05:30
|
|
|
desc: "Enables automatic generation of SSL certificates issued by Let's Encrypt for custom domains."
|
2019-12-04 20:38:33 +05:30
|
|
|
# rubocop:enable Scalability/FileUploads
|
2018-03-17 18:26:18 +05:30
|
|
|
end
|
2018-03-27 19:54:05 +05:30
|
|
|
put ":id/pages/domains/:domain", requirements: PAGES_DOMAINS_ENDPOINT_REQUIREMENTS do
|
2018-03-17 18:26:18 +05:30
|
|
|
authorize! :update_pages, user_project
|
|
|
|
|
2019-12-26 22:10:19 +05:30
|
|
|
pages_domain_params = declared(params, include_parent_namespaces: false, include_missing: false)
|
2018-03-17 18:26:18 +05:30
|
|
|
|
|
|
|
# Remove empty private key if certificate is not empty.
|
2019-09-30 21:07:59 +05:30
|
|
|
if pages_domain_params[:user_provided_certificate] && !pages_domain_params[:user_provided_key]
|
|
|
|
pages_domain_params.delete(:user_provided_key)
|
2018-03-17 18:26:18 +05:30
|
|
|
end
|
|
|
|
|
2022-11-25 23:54:43 +05:30
|
|
|
service = ::PagesDomains::UpdateService.new(user_project, current_user, pages_domain_params)
|
|
|
|
|
|
|
|
if service.execute(pages_domain)
|
2018-03-17 18:26:18 +05:30
|
|
|
present pages_domain, with: Entities::PagesDomain
|
|
|
|
else
|
|
|
|
render_validation_error!(pages_domain)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
desc 'Delete a pages domain'
|
|
|
|
params do
|
|
|
|
requires :domain, type: String, desc: 'The domain'
|
|
|
|
end
|
2018-03-27 19:54:05 +05:30
|
|
|
delete ":id/pages/domains/:domain", requirements: PAGES_DOMAINS_ENDPOINT_REQUIREMENTS do
|
2018-03-17 18:26:18 +05:30
|
|
|
authorize! :update_pages, user_project
|
|
|
|
|
2022-11-25 23:54:43 +05:30
|
|
|
::PagesDomains::DeleteService
|
|
|
|
.new(user_project, current_user)
|
|
|
|
.execute(pages_domain)
|
2020-03-13 15:44:24 +05:30
|
|
|
|
|
|
|
no_content!
|
2018-03-17 18:26:18 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|