# frozen_string_literal: true module Account class TicketNoteForm < ApplicationForm attribute :ticket_id, String attribute :content, String attribute :fileupload_guid, String validates :content, presence: true, length: { maximum: 1024 * 4 } validates :fileupload_guid, presence: true, length: { minimum: 16, maximum: 64 } def new_record? true end def submit return false unless valid? api_answer = TranslationCms::Api::Customers::TicketNote.create(attributes) merge_responce! api_answer errors.empty? end def self.build(params = {}) tmp = new(params) tmp.fileupload_guid ||= SecureRandom.base64(15).tr('+/=', 'xyz') tmp.ticket_id ||= params[:ticket_id] || params[:id] tmp end def persisted? defined?(id) && id.present? end def uploder_files return [] if fileupload_guid.blank? self.class.fileupload_scope(nil, fileupload_guid) end class << self # Join ActiveModel object with uploaded file def fileuploads(*args) options = args.extract_options! self.fileupload_options ||= {} args.each do |column| self.fileupload_options[column] = options end end # Update reflection klass by guid def fileupload_update(record_id, guid, method) fileupload_scope(method, guid).update_all(assetable_id: record_id, public_token: nil) end # Find asset(s) by guid def fileupload_find(method, guid) query = fileupload_scope(method, guid) fileupload_multiple?(method) ? query : query.first end def fileupload_scope(_method, guid) Asset.where(guid: guid, assetable_type: name) end def fileupload_find_asset(params) Asset.find_by(assetable_type: params[:klass], remote_asset_id: params[:id]) end # Find class by reflection def fileupload_klass(_method) TicketFile end def fileupload_multiple?(_method) true end def base_class self end end def fileupload_multiple?(method) self.class.fileupload_multiple?(method) end # Find or build new asset object def fileupload_asset(method) asset = self.class.fileupload_find(method, fileupload_guid) asset ||= self.class.fileupload_klass.new(public_token: fileupload_guid) asset end def fileupload_associations return [] if self.class.fileupload_options.nil? self.class.fileupload_options.keys end protected def fileupload_update fileupload_options.each do |method, _options| self.class.fileupload_update(id, fileupload_guid, method) end end end end