# frozen_string_literal: true # User document model class Document < ApplicationRecord include Encryptable # acts_as_eventable prefix: 'document', on: %i[create] mount_uploader :upload, Barong::App.config.uploader enum state: { pending: 0, verified: 1, rejected: 2, replaced: 3 } attr_encrypted :doc_number belongs_to :user validates :doc_type, :upload, presence: true validates :doc_type, inclusion: { in: DocumentTypes.list } validates :doc_category, inclusion: { in: DocumentTypes.category_list } validates :doc_expire, presence: true, if: -> { Barong::App.config.required_docs_expire } validates :metadata, data_is_json: true validate :exist_verified validates :doc_number, length: { maximum: 128 }, format: { with: /\A[A-Za-z0-9\-\s]+\z/, message: 'only allows letters and digits' }, if: proc { |a| a.doc_number.present? } validate :doc_expire_not_in_the_past, if: -> { Barong::App.config.required_docs_expire } before_save :start_document_kyc_verification, :save_doc_number_index attr_writer :update_labels def exist_verified errors.add(:document, 'already have verified') if user.documents.find_by(state: 'verified', doc_type: doc_type).present? end def as_json_for_event_api { user: user.as_json_for_event_api, upload: CGI::escape(upload.url), doc_type: doc_type, doc_number: doc_number, doc_expire: doc_expire, metadata: metadata, created_at: format_iso8601_time(created_at), updated_at: format_iso8601_time(updated_at) } end def sub_masked_doc_number doc_number.sub(/(?<=\A.{2})(.*)(?=.{2}\z)/) { |match| '*' * match.length } if doc_number end private def start_document_kyc_verification KycService.document_step(self) end def update_labels @update_labels.nil? ? true : @update_labels end def doc_expire_not_in_the_past return if doc_expire.blank? errors.add(:doc_expire, :invalid) if doc_expire < Date.current end def save_doc_number_index self.doc_number_index = SaltedCrc32.generate_hash(doc_number) if doc_number.present? end end # == Schema Information # Schema version: 20210714111301 # # Table name: documents # # id :bigint not null, primary key # user_id :bigint unsigned, not null # upload :string(255) # doc_type :string(255) # doc_expire :date # doc_number_encrypted :string(255) # doc_number_index :bigint # doc_issue :date # doc_category :string(255) # identificator :string(255) # metadata :text(65535) # created_at :datetime not null # updated_at :datetime not null # state :integer default("pending"), not null # # Indexes # # index_documents_on_doc_number_index (doc_number_index) # index_documents_on_user_id (user_id) #