From 57df268d916308202068ee757e31c87af6ac3877 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karl=20Erik=20=C3=95unapuu?= Date: Wed, 27 Jan 2021 12:33:46 +0200 Subject: [PATCH] REPP: Create domain statuses endpoints --- .../repp/v1/domains/statuses_controller.rb | 74 +++++++++++++++++++ config/routes.rb | 1 + 2 files changed, 75 insertions(+) create mode 100644 app/controllers/repp/v1/domains/statuses_controller.rb diff --git a/app/controllers/repp/v1/domains/statuses_controller.rb b/app/controllers/repp/v1/domains/statuses_controller.rb new file mode 100644 index 000000000..72bd7e7f6 --- /dev/null +++ b/app/controllers/repp/v1/domains/statuses_controller.rb @@ -0,0 +1,74 @@ +module Repp + module V1 + module Domains + class StatusesController < BaseController + before_action :set_domain, only: %i[update destroy] + before_action :verify_status + before_action :verify_status_removal, only: [:destroy] + before_action :verify_status_create, only: [:update] + + api :DELETE, '/repp/v1/domains/:domain_name/statuses/:status' + desc 'Remove status from specific domain' + param :domain_name, String, required: true, desc: 'Domain name' + param :status, String, required: true, desc: 'Status to be removed' + def destroy + @domain.statuses = @domain.statuses.delete(params[:id]) + if @domain.save + render_success + else + handle_errors(@domain) + end + end + + api :PUT, '/repp/v1/domains/:domain_name/statuses/:status' + desc 'Add status to specific domain' + param :domain_name, String, required: true, desc: 'Domain name' + param :status, String, required: true, desc: 'Status to be added' + def update + @domain.statuses = @domain.statuses << params[:id] + handle_errors(@domain) and return unless @domain.save + + render_success(data: { domain: @domain.name, status: params[:id] }) + end + + private + + def set_domain + registrar = current_user.registrar + @domain = Epp::Domain.find_by(registrar: registrar, name: params[:domain_id]) + @domain ||= Epp::Domain.find_by!(registrar: registrar, name_puny: params[:domain_id]) + + return @domain if @domain + + raise(ActiveRecord::RecordNotFound) + end + + def verify_status + allowed_statuses = [DomainStatus::CLIENT_HOLD].freeze + stat = params[:id] + + return if allowed_statuses.include?(stat) + + @domain.add_epp_error('2306', nil, nil, "#{I18n.t(:client_side_status_editing_error)}: status #{stat}") + handle_errors(@domain) + end + + def verify_status_removal + stat = params[:id] + return if @domain.statuses.include?(stat) + + @domain.add_epp_error('2306', nil, nil, "#{I18n.t(:client_side_status_editing_error)}: status #{stat}") + handle_errors(@domain) + end + + def verify_status_create + stat = params[:id] + return unless @domain.statuses.include?(stat) + + @domain.add_epp_error('2306', nil, nil, "#{I18n.t(:client_side_status_editing_error)}: status #{stat}") + handle_errors(@domain) + end + end + end + end +end diff --git a/config/routes.rb b/config/routes.rb index 10a6f2b6e..85e2bbccb 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -66,6 +66,7 @@ Rails.application.routes.draw do resources :contacts, only: %i[index create], constraints: { id: /.*/ }, controller: 'domains/contacts' resources :renew, only: %i[create], constraints: { id: /.*/ }, controller: 'domains/renews' resources :transfer, only: %i[create], constraints: { id: /.*/ }, controller: 'domains/transfers' + resources :statuses, only: %i[update destroy], constraints: { id: /.*/ }, controller: 'domains/statuses' match "dnssec", to: "domains/dnssec#destroy", via: "delete", defaults: { id: nil } match "contacts", to: "domains/contacts#destroy", via: "delete", defaults: { id: nil } collection do