diff --git a/app/api/repp/domain_transfers_v1.rb b/app/api/repp/domain_transfers_v1.rb deleted file mode 100644 index c6a48df6d..000000000 --- a/app/api/repp/domain_transfers_v1.rb +++ /dev/null @@ -1,48 +0,0 @@ -module Repp - class DomainTransfersV1 < Grape::API - version 'v1', using: :path - - resource :domain_transfers do - post '/' do - params do - requires :data, type: Hash do - requires :domainTransfers, type: Array do - requires :domainName, type: String, allow_blank: false - requires :transferCode, type: String, allow_blank: false - end - end - end - - new_registrar = current_user.registrar - domain_transfers = params['data']['domainTransfers'] - successful_domain_transfers = [] - errors = [] - - domain_transfers.each do |domain_transfer| - domain_name = domain_transfer['domainName'] - transfer_code = domain_transfer['transferCode'] - domain = Domain.find_by(name: domain_name) - - if domain - if domain.transfer_code == transfer_code - DomainTransfer.request(domain, new_registrar) - successful_domain_transfers << { type: 'domain_transfer', attributes: { domain_name: domain.name } } - else - errors << { title: "#{domain_name} transfer code is wrong" } - end - else - errors << { title: "#{domain_name} does not exist" } - end - end - - if errors.none? - status 200 - @response = { data: successful_domain_transfers } - else - status 400 - @response = { errors: errors } - end - end - end - end -end diff --git a/app/controllers/repp/v1/domains_controller.rb b/app/controllers/repp/v1/domains_controller.rb index e2188730d..4f3d8afe3 100644 --- a/app/controllers/repp/v1/domains_controller.rb +++ b/app/controllers/repp/v1/domains_controller.rb @@ -25,8 +25,49 @@ module Repp render_success(data: data) end + def transfer + @errors ||= [] + successful = [] + + params[:data][:domain_transfers].each do |transfer| + domain = transferable_domain(transfer[:domain_name], transfer[:transfer_code]) + next unless domain + + DomainTransfer.request(domain, current_user.registrar) + successful << { type: 'domain_transfer', attributes: { domain_name: domain.name } } + end + + render_success(data: { errors: @errors }) and return if @errors.any? + + render_success(data: successful) + end + + def transferable_domain(domain_name, transfer_code) + domain = Domain.find_by(name: domain_name) + valid_transfer_code = domain.transfer_code == transfer_code + add_error("#{domain_name} does not exist") and return unless domain + add_error("#{domain_name} transfer code is wrong") and return unless valid_transfer_code + + domain + end + + def add_error(msg) + @errors ||= [] + @errors << { title: msg } + end + private + def transfer_params + params.require(:data).require(:domain_transfers).each do |t| + t.require(:domain_name) + t.permit(:domain_name) + t.require(:transfer_code) + t.permit(:transfer_code) + end + params.require(:data).permit(domain_transfers: %i[domain_name transfer_code]) + end + def transfer_info_params params.require(:id) params.permit(:id) diff --git a/config/routes.rb b/config/routes.rb index 39cc4a0c3..3827d8ef9 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -62,6 +62,7 @@ Rails.application.routes.draw do resources :domains do collection do get ':id/transfer_info', to: 'domains#transfer_info', constraints: { id: /.*/ } + post 'transfer', to: 'domains#transfer' end end