internetee/registry

View on GitHub
app/controllers/repp/v1/domains/renews_controller.rb

Summary

Maintainability
A
1 hr
Test Coverage
A
91%
module Repp
  module V1
    module Domains
      class RenewsController < BaseController
        before_action :validate_renew_period, only: [:bulk_renew]
        before_action :select_renewable_domains, only: [:bulk_renew]
        before_action :set_domain, only: [:create]

        THROTTLED_ACTIONS = %i[create bulk_renew].freeze
        include Shunter::Integration::Throttle

        api :POST, 'repp/v1/domains/:domain_name/renew'
        desc 'Renew domain'
        param :renews, Hash, required: true, desc: 'Renew parameters' do
          param :period, Integer, required: true, desc: 'Renew period. Month (m) or year (y)'
          param :period_unit, String, required: true, desc: 'For how many months or years to renew'
          param :exp_date, String, required: true, desc: 'Current expiry date for domain'
        end
        def create
          authorize!(:renew, @domain)
          action = Actions::DomainRenew.new(@domain, renew_params[:renews], current_user.registrar)

          unless action.call
            handle_errors(@domain)
            return
          end

          render_success(data: { domain: { name: @domain.name } })
        end

        def bulk_renew
          authorize! :manage, :repp
          renew = run_bulk_renew_task(@domains, bulk_renew_params[:renew_period])
          return render_success(data: { updated_domains: @domains.map(&:name) }) if renew.valid?

          msg = renew.errors.attribute_names.map { |k, _v| renew.errors[k] }.join(', ')
          @epp_errors.add(:epp_errors, msg: msg, code: '2002')
          handle_errors
        end

        private

        def renew_params
          params.permit(:domain_id, renews: %i[period period_unit exp_date])
        end

        def validate_renew_period
          @epp_errors ||= ActiveModel::Errors.new(self)
          periods = Domain::PERIODS.map { |p| p[1] }
          return if periods.include? bulk_renew_params[:renew_period]

          @epp_errors.add(:epp_errors, msg: 'Invalid renew period', code: '2005')
        end

        def select_renewable_domains
          @epp_errors ||= ActiveModel::Errors.new(self)
          @domains = bulk_renew_domains
          if @domains.empty?
            @epp_errors.add(:epp_errors, msg: 'Domains cannot be empty',
                                         code: '2005')
          end
          return handle_errors if @epp_errors.any?
        end

        def run_bulk_renew_task(domains, period)
          ::Domains::BulkRenew::Start.run(domains: domains, period_element: period,
                                          registrar: current_user.registrar)
        end

        def bulk_renew_params
          params do
            params.require(%i[domains renew_period])
            params.permit(:domains, :renew_period)
          end
        end

        def bulk_renew_domains
          @epp_errors ||= ActiveModel::Errors.new(self)
          domains = []
          if bulk_renew_params[:domains].instance_of?(Array)
            bulk_renew_params[:domains].each do |idn|
              domain = Epp::Domain.find_by(name: idn)
              domains << domain if domain
              next if domain

              @epp_errors.add(:epp_errors,
                              msg: "Object does not exist: #{idn}",
                              code: '2304')
            end
          else
            @epp_errors.add(:epp_errors, msg: 'Domains attribute must be an array', code: '2005')
          end

          domains
        end
      end
    end
  end
end