mirror of
https://github.com/internetee/registry.git
synced 2025-06-04 03:37:28 +02:00
178 lines
6.5 KiB
Ruby
178 lines
6.5 KiB
Ruby
require 'serializers/registrant_api/domain'
|
|
module Repp
|
|
module V1
|
|
class DomainsController < BaseController
|
|
before_action :set_authorized_domain, only: %i[transfer_info]
|
|
before_action :forward_registrar_id, only: %i[create]
|
|
before_action :set_domain, only: %i[show update]
|
|
|
|
def index
|
|
records = current_user.registrar.domains
|
|
domains = records.limit(limit).offset(offset)
|
|
domains = domains.pluck(:name) unless index_params[:details] == 'true'
|
|
|
|
render_success(data: { domains: domains, total_number_of_records: records.count })
|
|
end
|
|
|
|
def show
|
|
render_success(data: { domain: Serializers::RegistrantApi::Domain.new(@domain).to_json })
|
|
end
|
|
|
|
api :POST, '/repp/v1/domains'
|
|
desc 'Creates new domain'
|
|
param :domain, Hash, required: true, desc: 'Parameters for new domain' do
|
|
param :name, String, required: true, desc: 'Domain name to be registered'
|
|
param :registrant_id, String, required: true, desc: 'Registrant contact code'
|
|
param :period, Integer, required: true, desc: 'Registration period in months or years'
|
|
param :period_unit, String, required: true, desc: 'Period type (month m) or (year y)'
|
|
param :nameservers_attributes, Array, required: false, desc: 'Domain nameservers' do
|
|
param :hostname, String, required: true, desc: 'Nameserver hostname'
|
|
param :ipv4, Array, desc: 'Array of IPv4 addresses'
|
|
param :ipv6, Array, desc: 'Array of IPv4 addresses'
|
|
end
|
|
param :admin_domain_contacts_attributes, Array, required: false, desc: 'Admin domain contacts codes'
|
|
param :admin_domain_contacts_attributes, Array, required: false, desc: 'Tech domain contacts codes'
|
|
param :dnskeys_attributes, Array, required: false, desc: 'DNSSEC keys for domain' do
|
|
param :flags, String, required: true, desc: 'Flag of DNSSEC key'
|
|
param :protocol, String, required: true, desc: 'Protocol of DNSSEC key'
|
|
param :alg, String, required: true, desc: 'Algorithm of DNSSEC key'
|
|
param :public_key, String, required: true, desc: 'Public key of DNSSEC key'
|
|
end
|
|
end
|
|
returns code: 200, desc: 'Successful domain registration response' do
|
|
property :code, Integer, desc: 'EPP code'
|
|
property :message, String, desc: 'EPP code explanation'
|
|
property :data, Hash do
|
|
property :domain, Hash do
|
|
property :name, String, 'Domain name'
|
|
end
|
|
end
|
|
end
|
|
def create
|
|
authorize!(:create, Epp::Domain)
|
|
@domain = Epp::Domain.new
|
|
action = Actions::DomainCreate.new(@domain, domain_create_params)
|
|
|
|
handle_errors(@domain) and return unless action.call
|
|
|
|
render_success(data: { domain: { name: @domain.name } })
|
|
end
|
|
|
|
api :PUT, 'repp/v1/domains/:id'
|
|
param :id, String, desc: 'Domain name in IDN / Puny format'
|
|
param :domain, Hash, required: true, desc: 'Changes of domain object' do
|
|
param :registrant, Hash, required: false, desc: 'New registrant object' do
|
|
param :code, String, required: true, desc: 'New registrant contact code'
|
|
end
|
|
param :auth_info, String, required: false, desc: 'New authorization code'
|
|
end
|
|
def update
|
|
action = Actions::DomainUpdate.new(@domain, params[:domain], current_user)
|
|
|
|
unless action.call
|
|
handle_errors(@domain)
|
|
return
|
|
end
|
|
|
|
render_success(data: { domain: { name: @domain.name } })
|
|
end
|
|
|
|
def transfer_info
|
|
contact_fields = %i[code name ident ident_type ident_country_code phone email street city
|
|
zip country_code statuses]
|
|
|
|
data = {
|
|
domain: @domain.name,
|
|
registrant: @domain.registrant.as_json(only: contact_fields),
|
|
admin_contacts: @domain.admin_contacts.map { |c| c.as_json(only: contact_fields) },
|
|
tech_contacts: @domain.tech_contacts.map { |c| c.as_json(only: contact_fields) },
|
|
}
|
|
|
|
render_success(data: data)
|
|
end
|
|
|
|
def transfer
|
|
@errors ||= []
|
|
@successful = []
|
|
|
|
transfer_params[:domain_transfers].each do |transfer|
|
|
initiate_transfer(transfer)
|
|
end
|
|
|
|
render_success(data: { success: @successful, failed: @errors })
|
|
end
|
|
|
|
def initiate_transfer(transfer)
|
|
domain = Epp::Domain.find_or_initialize_by(name: transfer[:domain_name])
|
|
action = Actions::DomainTransfer.new(domain, transfer[:transfer_code],
|
|
current_user.registrar)
|
|
|
|
if action.call
|
|
@successful << { type: 'domain_transfer', domain_name: domain.name }
|
|
else
|
|
@errors << { type: 'domain_transfer', domain_name: domain.name,
|
|
errors: domain.errors[:epp_errors] }
|
|
end
|
|
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)
|
|
end
|
|
|
|
def forward_registrar_id
|
|
params[:domain][:registrar_id] = current_user.registrar.id
|
|
end
|
|
|
|
def set_domain
|
|
@domain = Epp::Domain.find_by!(registrar: current_user.registrar, name: params[:id])
|
|
end
|
|
|
|
def set_authorized_domain
|
|
@epp_errors ||= []
|
|
h = {}
|
|
h[transfer_info_params[:id].match?(/\A[0-9]+\z/) ? :id : :name] = transfer_info_params[:id]
|
|
@domain = Domain.find_by!(h)
|
|
|
|
validate_registrar_authorization
|
|
end
|
|
|
|
def validate_registrar_authorization
|
|
return if @domain.registrar == current_user.registrar
|
|
return if @domain.transfer_code.eql?(request.headers['Auth-Code'])
|
|
|
|
@epp_errors << { code: 2202, msg: I18n.t('errors.messages.epp_authorization_error') }
|
|
handle_errors
|
|
end
|
|
|
|
def limit
|
|
index_params[:limit] || 200
|
|
end
|
|
|
|
def offset
|
|
index_params[:offset] || 0
|
|
end
|
|
|
|
def index_params
|
|
params.permit(:limit, :offset, :details)
|
|
end
|
|
|
|
def domain_create_params
|
|
params.require(:domain).require([:name, :registrant_id, :period, :period_unit])
|
|
params.require(:domain).permit(:name, :registrant_id, :period, :period_unit, :registrar_id)
|
|
end
|
|
end
|
|
end
|
|
end
|