mirror of
https://github.com/internetee/registry.git
synced 2025-07-28 05:26:17 +02:00
Added ApiUser and WhiteIp endpoints to REPP API
This commit is contained in:
parent
0442f7f087
commit
b84e9e1579
9 changed files with 206 additions and 3 deletions
|
@ -34,8 +34,12 @@ module Repp
|
||||||
iban: registrar.iban,
|
iban: registrar.iban,
|
||||||
iban_max_length: Iban.max_length,
|
iban_max_length: Iban.max_length,
|
||||||
linked_users: serialized_users(current_user.linked_users),
|
linked_users: serialized_users(current_user.linked_users),
|
||||||
|
api_users: serialized_users(current_user.api_users),
|
||||||
|
white_ips: serialized_ips(registrar.white_ips),
|
||||||
balance_auto_reload: type,
|
balance_auto_reload: type,
|
||||||
min_deposit: Setting.minimum_deposit } }
|
min_deposit: Setting.minimum_deposit },
|
||||||
|
roles: ApiUser::ROLES,
|
||||||
|
interfaces: WhiteIp::INTERFACES }
|
||||||
render_success(data: resp)
|
render_success(data: resp)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -148,7 +152,8 @@ module Repp
|
||||||
arr = []
|
arr = []
|
||||||
users.each do |u|
|
users.each do |u|
|
||||||
arr << { id: u.id, username: u.username,
|
arr << { id: u.id, username: u.username,
|
||||||
role: u.roles.first, registrar_name: u.registrar.name }
|
role: u.roles.first, registrar_name: u.registrar.name,
|
||||||
|
active: u.active }
|
||||||
end
|
end
|
||||||
|
|
||||||
arr
|
arr
|
||||||
|
@ -165,6 +170,10 @@ module Repp
|
||||||
|
|
||||||
arr
|
arr
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def serialized_ips(ips)
|
||||||
|
ips.as_json(only: %i[id ipv4 ipv6 interfaces])
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
73
app/controllers/repp/v1/api_users_controller.rb
Normal file
73
app/controllers/repp/v1/api_users_controller.rb
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
require 'serializers/repp/api_user'
|
||||||
|
module Repp
|
||||||
|
module V1
|
||||||
|
class ApiUsersController < BaseController
|
||||||
|
load_and_authorize_resource
|
||||||
|
|
||||||
|
THROTTLED_ACTIONS = %i[index show create update destroy].freeze
|
||||||
|
include Shunter::Integration::Throttle
|
||||||
|
|
||||||
|
api :GET, '/repp/v1/api_users'
|
||||||
|
desc 'Get all api users'
|
||||||
|
def index
|
||||||
|
users = current_user.registrar.api_users
|
||||||
|
|
||||||
|
render_success(data: { users: serialized_users(users),
|
||||||
|
count: users.count })
|
||||||
|
end
|
||||||
|
|
||||||
|
api :GET, '/repp/v1/api_users/:id'
|
||||||
|
desc 'Get a specific api user'
|
||||||
|
def show
|
||||||
|
serializer = Serializers::Repp::ApiUser.new(@api_user)
|
||||||
|
render_success(data: { user: serializer.to_json, roles: ApiUser::ROLES })
|
||||||
|
end
|
||||||
|
|
||||||
|
api :POST, '/repp/v1/api_users'
|
||||||
|
desc 'Create a new api user'
|
||||||
|
def create
|
||||||
|
@api_user = current_user.registrar.api_users.build(api_user_params)
|
||||||
|
@api_user.active = api_user_params[:active]
|
||||||
|
unless @api_user.save
|
||||||
|
handle_non_epp_errors(@api_user)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
render_success(data: { api_user: { id: @api_user.id } })
|
||||||
|
end
|
||||||
|
|
||||||
|
api :PUT, '/repp/v1/api_users/:id'
|
||||||
|
desc 'Update api user'
|
||||||
|
def update
|
||||||
|
unless @api_user.update(api_user_params)
|
||||||
|
handle_non_epp_errors(@api_user)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
render_success(data: { api_user: { id: @api_user.id } })
|
||||||
|
end
|
||||||
|
|
||||||
|
api :DELETE, '/repp/v1/api_users/:id'
|
||||||
|
desc 'Delete a specific api user'
|
||||||
|
def destroy
|
||||||
|
unless @api_user.destroy
|
||||||
|
handle_non_epp_errors(@api_user)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
render_success
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def api_user_params
|
||||||
|
params.require(:api_user).permit(:id, :username, :plain_text_password, :active,
|
||||||
|
:identity_code, { roles: [] })
|
||||||
|
end
|
||||||
|
|
||||||
|
def serialized_users(users)
|
||||||
|
users.map { |i| Serializers::Repp::ApiUser.new(i).to_json }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
59
app/controllers/repp/v1/white_ips_controller.rb
Normal file
59
app/controllers/repp/v1/white_ips_controller.rb
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
module Repp
|
||||||
|
module V1
|
||||||
|
class WhiteIpsController < BaseController
|
||||||
|
load_and_authorize_resource
|
||||||
|
|
||||||
|
THROTTLED_ACTIONS = %i[index create update destroy].freeze
|
||||||
|
include Shunter::Integration::Throttle
|
||||||
|
|
||||||
|
api :GET, '/repp/v1/white_ips'
|
||||||
|
desc 'Get all whitelisted ips'
|
||||||
|
def index
|
||||||
|
ips = current_user.registrar.white_ips
|
||||||
|
|
||||||
|
render_success(data: { ips: ips.as_json(except: %i[creator_str updator_str]),
|
||||||
|
count: ips.count })
|
||||||
|
end
|
||||||
|
|
||||||
|
api :POST, '/repp/v1/white_ips'
|
||||||
|
desc 'Add new whitelisted IP'
|
||||||
|
def create
|
||||||
|
@white_ip = current_user.registrar.white_ips.build(white_ip_params)
|
||||||
|
unless @white_ip.save
|
||||||
|
handle_non_epp_errors(@white_ip)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
render_success(data: { ip: { id: @white_ip.id } })
|
||||||
|
end
|
||||||
|
|
||||||
|
api :PUT, '/repp/v1/white_ips/:id'
|
||||||
|
desc 'Update whitelisted ip address'
|
||||||
|
def update
|
||||||
|
unless @white_ip.update(white_ip_params)
|
||||||
|
handle_non_epp_errors(@white_ip)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
render_success(data: { ip: { id: @white_ip.id } })
|
||||||
|
end
|
||||||
|
|
||||||
|
api :DELETE, '/repp/v1/white_ips/:id'
|
||||||
|
desc 'Delete a specific whitelisted ip address'
|
||||||
|
def destroy
|
||||||
|
unless @white_ip.destroy
|
||||||
|
handle_non_epp_errors(@white_ip)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
render_success
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def white_ip_params
|
||||||
|
params.require(:white_ip).permit(:ipv4, :ipv6, interfaces: [])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -28,6 +28,8 @@ class Ability
|
||||||
def super # Registrar/api_user dynamic role
|
def super # Registrar/api_user dynamic role
|
||||||
epp
|
epp
|
||||||
billing
|
billing
|
||||||
|
can :manage, ApiUser
|
||||||
|
can :manage, WhiteIp
|
||||||
end
|
end
|
||||||
|
|
||||||
def epp # Registrar/api_user dynamic role
|
def epp # Registrar/api_user dynamic role
|
||||||
|
|
|
@ -24,6 +24,7 @@ class ApiUser < User
|
||||||
validates :username, :plain_text_password, :registrar, :roles, presence: true
|
validates :username, :plain_text_password, :registrar, :roles, presence: true
|
||||||
validates :plain_text_password, length: { minimum: min_password_length }
|
validates :plain_text_password, length: { minimum: min_password_length }
|
||||||
validates :username, uniqueness: true
|
validates :username, uniqueness: true
|
||||||
|
validates :identity_code, uniqueness: { scope: :registrar_id }, if: -> { identity_code.present? }
|
||||||
|
|
||||||
delegate :code, :name, to: :registrar, prefix: true
|
delegate :code, :name, to: :registrar, prefix: true
|
||||||
delegate :legaldoc_mandatory?, to: :registrar
|
delegate :legaldoc_mandatory?, to: :registrar
|
||||||
|
@ -36,6 +37,8 @@ class ApiUser < User
|
||||||
|
|
||||||
ROLES = %w[super epp billing].freeze # should not match to admin roles
|
ROLES = %w[super epp billing].freeze # should not match to admin roles
|
||||||
|
|
||||||
|
scope :non_super, -> { where.not('roles @> ARRAY[?]::varchar[]', ['super']) }
|
||||||
|
|
||||||
def ability
|
def ability
|
||||||
@ability ||= Ability.new(self)
|
@ability ||= Ability.new(self)
|
||||||
end
|
end
|
||||||
|
@ -81,12 +84,16 @@ class ApiUser < User
|
||||||
end
|
end
|
||||||
|
|
||||||
def linked_users
|
def linked_users
|
||||||
self.class.where(identity_code: identity_code)
|
self.class.where(identity_code: identity_code, active: true)
|
||||||
.where("identity_code IS NOT NULL AND identity_code != ''")
|
.where("identity_code IS NOT NULL AND identity_code != ''")
|
||||||
.where.not(id: id)
|
.where.not(id: id)
|
||||||
.includes(:registrar)
|
.includes(:registrar)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def api_users
|
||||||
|
self.class.where(registrar_id: registrar_id)
|
||||||
|
end
|
||||||
|
|
||||||
def linked_with?(another_api_user)
|
def linked_with?(another_api_user)
|
||||||
another_api_user.identity_code == identity_code
|
another_api_user.identity_code == identity_code
|
||||||
end
|
end
|
||||||
|
@ -109,6 +116,14 @@ class ApiUser < User
|
||||||
'Accreditation Expire Date', 'Created', 'Updated']
|
'Accreditation Expire Date', 'Created', 'Updated']
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def self.ransackable_associations(*)
|
||||||
|
authorizable_ransackable_associations
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.ransackable_attributes(*)
|
||||||
|
authorizable_ransackable_attributes
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def machine_readable_certificate(cert)
|
def machine_readable_certificate(cert)
|
||||||
|
|
|
@ -77,6 +77,10 @@ class WhiteIp < ApplicationRecord
|
||||||
def csv_header
|
def csv_header
|
||||||
%w[IPv4 IPv6 Interfaces Created Updated]
|
%w[IPv4 IPv6 Interfaces Created Updated]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def ransackable_attributes(auth_object = nil)
|
||||||
|
["created_at", "creator_str", "id", "interfaces", "ipv4", "ipv6", "registrar_id", "updated_at", "updator_str"]
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def as_csv_row
|
def as_csv_row
|
||||||
|
|
|
@ -108,6 +108,8 @@ Rails.application.routes.draw do
|
||||||
get '/market_share_growth_rate', to: 'stats#market_share_growth_rate'
|
get '/market_share_growth_rate', to: 'stats#market_share_growth_rate'
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
resources :api_users, only: %i[index show update create destroy]
|
||||||
|
resources :white_ips, only: %i[index update create destroy]
|
||||||
namespace :registrar do
|
namespace :registrar do
|
||||||
resources :notifications, only: %i[index show update] do
|
resources :notifications, only: %i[index show update] do
|
||||||
collection do
|
collection do
|
||||||
|
|
38
lib/serializers/repp/api_user.rb
Normal file
38
lib/serializers/repp/api_user.rb
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
module Serializers
|
||||||
|
module Repp
|
||||||
|
class ApiUser
|
||||||
|
attr_reader :user
|
||||||
|
|
||||||
|
def initialize(user)
|
||||||
|
@user = user
|
||||||
|
end
|
||||||
|
|
||||||
|
def to_json(obj = user)
|
||||||
|
json = {
|
||||||
|
id: obj.id,
|
||||||
|
name: obj.username,
|
||||||
|
password: obj.plain_text_password,
|
||||||
|
identity_code: obj.identity_code,
|
||||||
|
roles: obj.roles.join(', '),
|
||||||
|
active: obj.active,
|
||||||
|
accredited: obj.accredited?,
|
||||||
|
accreditation_expired: obj.accreditation_expired?,
|
||||||
|
accreditation_expire_date: obj.accreditation_expire_date,
|
||||||
|
created_at: obj.created_at,
|
||||||
|
updated_at: obj.updated_at,
|
||||||
|
}
|
||||||
|
json[:certificates] = certificates
|
||||||
|
json
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def certificates
|
||||||
|
user.certificates.map do |x|
|
||||||
|
subject = x.csr ? x.parsed_csr.try(:subject) : x.parsed_crt.try(:subject)
|
||||||
|
{ subject: subject.to_s, status: x.status }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -81,6 +81,7 @@ module Serializers
|
||||||
total: invoice.total,
|
total: invoice.total,
|
||||||
recipient: invoice.buyer.billing_email,
|
recipient: invoice.buyer.billing_email,
|
||||||
monthly_invoice: invoice.monthly_invoice,
|
monthly_invoice: invoice.monthly_invoice,
|
||||||
|
reference_no: invoice.reference_no
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
# rubocop:enable Metrics/MethodLength
|
# rubocop:enable Metrics/MethodLength
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue