diff --git a/app/controllers/admin/api_users_controller.rb b/app/controllers/admin/api_users_controller.rb index cbef7def2..5021fe15a 100644 --- a/app/controllers/admin/api_users_controller.rb +++ b/app/controllers/admin/api_users_controller.rb @@ -47,8 +47,46 @@ module Admin redirect_to admin_registrar_path(@api_user.registrar), notice: t('.deleted') end + def set_test_date_to_api_user + user_api = User.find(params[:user_api_id]) + + uri = URI.parse(ENV['registry_demo_registrar_api_user_url'] + "?username=#{user_api.username}&identity_code=#{user_api.identity_code}") + + response = base_get_request(uri: uri, port: ENV['registry_demo_registrar_port']) + + if response.code == "200" + result = JSON.parse(response.body) + demo_user_api = result['user_api'] + + Actions::RecordDateOfTest.record_result_to_api_user( + api_user:user_api, + date: demo_user_api['accreditation_date']) unless demo_user_api.empty? + return redirect_to request.referrer, notice: 'User Api found' + else + return redirect_to request.referrer, notice: 'User Api no found or not accriditated yet' + end + + redirect_to request.referrer, notice: 'Something goes wrong' + end + + def remove_test_date_to_api_user + user_api = User.find(params[:user_api_id]) + user_api.accreditation_date = nil + user_api.accreditation_expire_date = nil + user_api.save + + redirect_to request.referrer + end + private + def base_get_request(uri:, port:) + http = Net::HTTP.new(uri.host, port) + req = Net::HTTP::Get.new(uri.request_uri) + + http.request(req) + end + def api_user_params params.require(:api_user).permit(:username, :plain_text_password, :active, :identity_code, { roles: [] }) diff --git a/app/controllers/admin/registrars_controller.rb b/app/controllers/admin/registrars_controller.rb index a803a8e7d..9c2485813 100644 --- a/app/controllers/admin/registrars_controller.rb +++ b/app/controllers/admin/registrars_controller.rb @@ -1,3 +1,5 @@ +require 'net/http' + module Admin class RegistrarsController < BaseController # rubocop:disable Metrics/ClassLength load_and_authorize_resource @@ -55,8 +57,56 @@ module Admin end end + def set_test_date + registrar = Registrar.find(params[:registrar_id]) + + uri = URI.parse(ENV['registry_demo_registrar_results_url'] + "?registrar_name=#{registrar.name}") + + response = base_get_request(uri: uri, port: ENV['registry_demo_registrar_port']) + + if response.code == "200" + return record_result_for_each_api_user(response: response) + else + return redirect_to request.referrer, notice: 'Registrar no found' + end + + redirect_to request.referrer, notice: 'Something goes wrong' + end + + def remove_test_date + registrar = Registrar.find(params[:registrar_id]) + registrar.api_users.each do |api| + api.accreditation_date = nil + api.accreditation_expire_date = nil + api.save + end + + redirect_to request.referrer + end + private + def record_result_for_each_api_user(response:) + result = JSON.parse(response.body) + registrar_users = result['registrar_users'] + + return redirect_to request.referrer, notice: 'Registrar found, but not accreditated yet' if registrar_users.empty? + + registrar_users.each do |api| + a = ApiUser.find_by(username: api.username, identity_code: api.identity_code) + Actions::RecordDateOfTest.record_result_to_api_user(a, api.accreditation_date) unless a.nil? + end + + redirect_to request.referrer, notice: 'Registrar found' + end + + def base_get_request(uri:, port:) + http = Net::HTTP.new(uri.host, port) + req = Net::HTTP::Get.new(uri.request_uri) + + http.request(req) + end + def filter_by_status case params[:status] when 'Active' diff --git a/app/controllers/api/v1/accreditation_center/base_controller.rb b/app/controllers/api/v1/accreditation_center/base_controller.rb index 7deb776b9..77f3b0338 100644 --- a/app/controllers/api/v1/accreditation_center/base_controller.rb +++ b/app/controllers/api/v1/accreditation_center/base_controller.rb @@ -3,24 +3,26 @@ require 'auth_token/auth_token_decryptor' module Api module V1 module AccreditationCenter - class BaseController < ActionController::API - rescue_from ActiveRecord::RecordNotFound, with: :show_not_found_error - rescue_from ActiveRecord::RecordInvalid, with: :show_invalid_record_error - rescue_from(ActionController::ParameterMissing) do |parameter_missing_exception| - error = {} - error[parameter_missing_exception.param] = ['parameter is required'] - response = { errors: [error] } - render json: response, status: :unprocessable_entity - end + if Rails.env.development? || Rails.env.staging? || Rails.env.test? + class BaseController < ActionController::API + rescue_from ActiveRecord::RecordNotFound, with: :show_not_found_error + rescue_from ActiveRecord::RecordInvalid, with: :show_invalid_record_error + rescue_from(ActionController::ParameterMissing) do |parameter_missing_exception| + error = {} + error[parameter_missing_exception.param] = ['parameter is required'] + response = { errors: [error] } + render json: response, status: :unprocessable_entity + end - private + private - def show_not_found_error - render json: { errors: [{ base: ['Not found'] }] }, status: :not_found - end + def show_not_found_error + render json: { errors: [{ base: ['Not found'] }] }, status: :not_found + end - def show_invalid_record_error(exception) - render json: { errors: exception.record.errors }, status: :bad_request + def show_invalid_record_error(exception) + render json: { errors: exception.record.errors }, status: :bad_request + end end end end diff --git a/app/controllers/api/v1/accreditation_center/results_controller.rb b/app/controllers/api/v1/accreditation_center/results_controller.rb new file mode 100644 index 000000000..8a6fd2d51 --- /dev/null +++ b/app/controllers/api/v1/accreditation_center/results_controller.rb @@ -0,0 +1,40 @@ +require 'serializers/repp/contact' + +module Api + module V1 + module AccreditationCenter + class ResultsController < ::Api::V1::AccreditationCenter::BaseController + def show + accr_users = [] + registrar = Registrar.find_by(name: params[:registrar_name]) + + return render json: { errors: 'Registrar not found' }, status: :not_found if registrar.nil? + + registrar.api_users.where.not(accreditation_date: nil).each do |u| + accr_users << u + end + + render json: { code: 1000, registrar_users: accr_users } + end + + def show_api_user + user_api = User.find_by(username: params[:username], identity_code: params[:identity_code]) + + return render json: { errors: 'User not found' }, status: :not_found if user_api.nil? + + return render json: { errors: 'No accreditated yet' }, status: :not_found if user_api.accreditation_date.nil? + + render json: { code: 1000, user_api: user_api } + end + + def list_accreditated_api_users + users = User.where.not(accreditation_date: nil) + + return render json: { errors: 'Accreditated users not found' }, status: :not_found if users.empty? + + render json: { code: 1000, users: users } + end + end + end + end +end diff --git a/app/controllers/repp/v1/registrar/accreditation_info_controller.rb b/app/controllers/repp/v1/registrar/accreditation_info_controller.rb index cd86ce9ed..3157672d5 100644 --- a/app/controllers/repp/v1/registrar/accreditation_info_controller.rb +++ b/app/controllers/repp/v1/registrar/accreditation_info_controller.rb @@ -1,36 +1,38 @@ module Repp module V1 module Registrar - class AccreditationInfoController < BaseController - api :GET, 'repp/v1/registrar/accreditation/get_info' - desc 'check login user and return data' + if Rails.env.development? || Rails.env.staging? + class AccreditationInfoController < BaseController + api :GET, 'repp/v1/registrar/accreditation/get_info' + desc 'check login user and return data' - def index - login = current_user - registrar = current_user.registrar + def index + login = current_user + registrar = current_user.registrar - # rubocop:disable Style/AndOr - render_success(data: nil) and return unless login - # rubocop:enable Style/AndOr + # rubocop:disable Style/AndOr + render_success(data: nil) and return unless login + # rubocop:enable Style/AndOr - data = set_values_to_data(login: login, registrar: registrar) + data = set_values_to_data(login: login, registrar: registrar) - render_success(data: data) - end + render_success(data: data) + end - private + private - def set_values_to_data(login:, registrar:) - data = login.as_json(only: %i[id - username - name - uuid - roles - accreditation_date - accreditation_expire_date]) - data[:registrar_name] = registrar.name - data[:registrar_reg_no] = registrar.reg_no - data + def set_values_to_data(login:, registrar:) + data = login.as_json(only: %i[id + username + name + uuid + roles + accreditation_date + accreditation_expire_date]) + data[:registrar_name] = registrar.name + data[:registrar_reg_no] = registrar.reg_no + data + end end end end diff --git a/app/controllers/repp/v1/registrar/accreditation_results_controller.rb b/app/controllers/repp/v1/registrar/accreditation_results_controller.rb index b58fd3895..b813754c5 100644 --- a/app/controllers/repp/v1/registrar/accreditation_results_controller.rb +++ b/app/controllers/repp/v1/registrar/accreditation_results_controller.rb @@ -1,30 +1,31 @@ module Repp module V1 module Registrar - class AccreditationResultsController < ActionController::API - before_action :authenticate_shared_key + if Rails.env.development? || Rails.env.staging? + class AccreditationResultsController < ActionController::API + before_action :authenticate_shared_key TEMPORARY_SECRET_KEY = ENV['accreditation_secret'].freeze EXPIRE_DEADLINE = 15.minutes.freeze - api :POST, 'repp/v1/registrar/accreditation/push_results' - desc 'added datetime results' + api :POST, 'repp/v1/registrar/accreditation/push_results' + desc 'added datetime results' - def create - username = params[:accreditation_result][:username] - result = params[:accreditation_result][:result] + def create + username = params[:accreditation_result][:username] + result = params[:accreditation_result][:result] - record_accreditation_result(username, result) if result - rescue ActiveRecord::RecordNotFound - record_not_found(username) - end + record_accreditation_result(username, result) if result + rescue ActiveRecord::RecordNotFound + record_not_found(username) + end - private + private - def record_accreditation_result(username, result) - user = ApiUser.find_by(username: username) + def record_accreditation_result(username, result) + user = ApiUser.find_by(username: username) - raise ActiveRecord::RecordNotFound if user.nil? + raise ActiveRecord::RecordNotFound if user.nil? user.accreditation_date = DateTime.current user.accreditation_expire_date = user.accreditation_date + EXPIRE_DEADLINE @@ -55,26 +56,27 @@ module Repp end end - def authenticate_shared_key - api_key = "Basic #{TEMPORARY_SECRET_KEY}" - render_failed unless api_key == request.authorization - end + def authenticate_shared_key + api_key = "Basic #{TEMPORARY_SECRET_KEY}" + render_failed unless api_key == request.authorization + end - def record_not_found(username) - @response = { code: 2303, message: "Object '#{username}' does not exist" } - render(json: @response) - end + def record_not_found(username) + @response = { code: 2303, message: "Object '#{username}' does not exist" } + render(json: @response) + end - def render_failed - @response = { code: 2202, message: 'Invalid authorization information' } - render(json: @response, status: :unauthorized) - end + def render_failed + @response = { code: 2202, message: 'Invalid authorization information' } + render(json: @response, status: :unauthorized) + end - def render_success(code: nil, message: nil, data: nil) - @response = { code: code || 1000, message: message || 'Command completed successfully', - data: data || {} } + def render_success(code: nil, message: nil, data: nil) + @response = { code: code || 1000, message: message || 'Command completed successfully', + data: data || {} } - render(json: @response, status: :ok) + render(json: @response, status: :ok) + end end end end diff --git a/app/interactions/actions/record_date_of_test.rb b/app/interactions/actions/record_date_of_test.rb new file mode 100644 index 000000000..53d309948 --- /dev/null +++ b/app/interactions/actions/record_date_of_test.rb @@ -0,0 +1,22 @@ +module Actions + module RecordDateOfTest + extend self + + TEST_DEADLINE = 1.year.freeze + + def record_result_to_api_user(api_user:, date:) + p "+++++++++++" + p api_user + p "-----------" + p DateTime.parse(date) + p "+++++++++++" + + api_user.accreditation_date = date + api_user.accreditation_expire_date = api_user.accreditation_date + TEST_DEADLINE + api_user.save + + # api_user.update(accreditation_date: date, + # accreditation_expire_date: DateTime.parse(date) + TEST_DEADLINE) + end + end +end diff --git a/app/jobs/sync_accredited_users_job.rb b/app/jobs/sync_accredited_users_job.rb new file mode 100644 index 000000000..8e02956e5 --- /dev/null +++ b/app/jobs/sync_accredited_users_job.rb @@ -0,0 +1,38 @@ +class SyncAccreditedUsersJob < ApplicationJob + def perform + # apiusers_from_test = Actions::GetAccrResultsFromAnotherDb.list_of_accredated_users + + # return if apiusers_from_test.nil? + + # apiusers_from_test.each do |api| + # a = ApiUser.find_by(username: api.username, identity_code: api.identity_code) + # Actions::RecordDateOfTest.record_result_to_api_user(a, api.accreditation_date) unless a.nil? + # end + uri = URI.parse(ENV['registry_demo_accredited_users_url']) + + response = base_get_request(uri: uri, port: ENV['registry_demo_registrar_port']) + + if response.code == "200" + result = JSON.parse(response.body) + users = result['users'] + + users.each do |api| + a = ApiUser.find_by(username: api.username, identity_code: api.identity_code) + Actions::RecordDateOfTest.record_result_to_api_user(a, api.accreditation_date) unless a.nil? + end + else + logger.warn 'User not found' + end + + return + end + + private + + def base_get_request(uri:, port:) + http = Net::HTTP.new(uri.host, port) + req = Net::HTTP::Get.new(uri.request_uri) + + http.request(req) + end +end \ No newline at end of file diff --git a/app/models/api_user.rb b/app/models/api_user.rb index dc5cff0cc..a15b12a85 100644 --- a/app/models/api_user.rb +++ b/app/models/api_user.rb @@ -56,6 +56,16 @@ class ApiUser < User username end + def accredited? + !accreditation_date.nil? + end + + def accreditation_expired? + return false if accreditation_expire_date.nil? + + accreditation_expire_date < Time.zone.now + end + def unread_notifications registrar.notifications.unread end diff --git a/app/models/registrar.rb b/app/models/registrar.rb index 07d7d4795..5d6d7538f 100644 --- a/app/models/registrar.rb +++ b/app/models/registrar.rb @@ -190,6 +190,16 @@ class Registrar < ApplicationRecord # rubocop:disable Metrics/ClassLength white_ips.api.include_ip?(ip) end + def accredited? + api_users.any? do |a| + return true unless a.accreditation_date.nil? + end + end + + def accreditation_expired? + api_users.all? { |api| api.accreditation_expired? } + end + # Audit log is needed, therefore no raw SQL def replace_nameservers(hostname, new_attributes, domains: []) transaction do diff --git a/app/views/admin/api_users/_api_user.html.erb b/app/views/admin/api_users/_api_user.html.erb index d8412a519..5c443bfee 100644 --- a/app/views/admin/api_users/_api_user.html.erb +++ b/app/views/admin/api_users/_api_user.html.erb @@ -2,4 +2,16 @@
+ | <%= sort_link(@q, 'username') %> | -+ | <%= sort_link(@q, 'registrar_name', Registrar.model_name.human) %> | -+ | <%= sort_link(@q, 'active', ApiUser.human_attribute_name(:active)) %> | ++ Test status + | <%= t(:emails) %> | + ++ Test status + | @@ -58,6 +62,17 @@ <%= content_tag(:span, x[:billing_email]) %> <% end %> ++ <% if !x.accredited? || x.accreditation_expired? %> + <%= button_to t('.set_test_btn'), + { controller: 'registrars', action: 'set_test_date', registrar_id: x.id}, + { method: :post, class: 'btn btn-primary'} %> + <% else %> + <%= button_to t('.remove_test_btn'), + { controller: 'registrars', action: 'remove_test_date', registrar_id: x.id}, + { method: :post, class: 'btn btn-danger'} %> + <% end %> + | <% end %> diff --git a/app/views/admin/registrars/show/_api_users.html.erb b/app/views/admin/registrars/show/_api_users.html.erb index 2d10b1c56..fddccd9b7 100644 --- a/app/views/admin/registrars/show/_api_users.html.erb +++ b/app/views/admin/registrars/show/_api_users.html.erb @@ -8,6 +8,7 @@
---|---|---|---|---|---|---|
<%= ApiUser.human_attribute_name :username %> | <%= ApiUser.human_attribute_name :active %> | +Test Results | ||||
<%= link_to api_user, admin_registrar_api_user_path(api_user.registrar, api_user) %> | <%= api_user.active %> | ++ + <% if !api_user.accredited? || api_user.accreditation_expired? %> + <%= button_to t('.set_test_btn'), + { controller: 'api_users', action: 'set_test_date_to_api_user', user_api_id: api_user.id }, + { method: :post, class: 'btn btn-primary'} %> + <% else %> + <%= button_to t('.remove_test_btn'), + { controller: 'api_users', action: 'remove_test_date_to_api_user', user_api_id: api_user.id }, + { method: :post, class: 'btn btn-danger'} %> + <% end %> + |