rubykube/barong

View on GitHub
app/workers/kyc/kycaid/document_worker.rb

Summary

Maintainability
A
1 hr
Test Coverage
require 'sidekiq'

module KYC
  module Kycaid
    class DocumentWorker
      include Sidekiq::Worker
      KYCAID_DOC_TYPES = { "Passport" => 'PASSPORT', 'Identity card' => 'GOVERNMENT_ID', 'Driver license' => 'DRIVERS_LICENSE' }.freeze

      def perform(user_id, identificator)
        # user, that will be verified
        @user = User.find(user_id)
        # exact batch of the docs to be verified
        docs = @user.documents.where(identificator: identificator)
        # user should already have applicant on his last profile to be able to proceed documents verification
        @applicant_id = @user.profiles.last.applicant_id

        # creates a KYCAID::File for front/back and KYCAID::Document with linking files
        front_file = docs.find_by(doc_category: 'front_side')
        back_file = docs.find_by(doc_category: 'back_side')
        selfie_file = docs.find_by(doc_category: 'selfie')

        document = ::KYCAID::Document.create(document_params(front_file, back_file))
        selfie_document = ::KYCAID::Document.create(selfie_image_params(selfie_file))

        if document.error || document.errors || selfie_document.error || selfie_document.errors
          Rails.logger.info("Error in document creation for: #{@user.uid}: #{document.error} #{document.errors} \
                             or in  selfie image creation for: #{@user.uid}: #{selfie_document.error} #{selfie_document.errors}")
          @user.labels.find_by(key: :document, scope: :private).update(value: 'rejected')
        elsif document.document_id && selfie_document.document_id
          front_file&.update(metadata: { document_id: document.document_id }.to_json)
          back_file&.update(metadata: { document_id: document.document_id }.to_json)
          selfie_file&.update(metadata: { document_id: selfie_document.document_id }.to_json)
          verification = ::KYCAID::Verification.create(verification_params)

          if verification.error || verification.errors
            Rails.logger.info("Error in verification creation for: #{@user.uid}: #{verification.error} #{verification.errors}")
            @user.labels.find_by(key: :document, scope: :private).update(value: 'rejected')
          end

          Rails.logger.info("Verification for user document with uid: #{@user.uid}, kycaid id of verification: #{verification.verification_id}")
        end
      rescue OpenURI::HTTPError => e
        Rails.logger.info("#{self.class} caught #{e.inspect()}, retrying in 30 seconds")
        self.class.perform_in(30.seconds, user_id, identificator)
      end

      def document_params(front_file, back_file)
        {
          front_file: {
            tempfile: URI.open(front_file.upload.url),
            file_extension: front_file.upload.file.extension,
            file_name: front_file.upload.file.filename,
          },
          back_file: ({
            tempfile: URI.open(back_file.upload.url),
            file_extension: back_file.upload.file.extension,
            file_name: back_file.upload.file.filename,
          } if back_file),
          expiry_date: front_file.doc_expire,
          document_number: front_file.doc_number,
          type: KYCAID_DOC_TYPES[front_file.doc_type],
          applicant_id: @applicant_id
        }.compact
      end

      def selfie_image_params(selfie_image)
        {
          front_file: {
            tempfile: URI.open(selfie_image.upload.url),
            file_extension: selfie_image.upload.file.extension,
            file_name: selfie_image.upload.file.filename,
          },
          type: 'SELFIE_IMAGE',
          applicant_id: @applicant_id
        }
      end

      def verification_params
        {
          applicant_id: @applicant_id,
          types: ['DOCUMENT', 'FACIAL'],
          callback_url: "#{Barong::App.config.domain}/api/v2/barong/public/kyc"
        }
      end
    end
  end
end