module DocxManagerClient::ModelAdditions::BelongsToDocxTemplate

Public Instance Methods

belongs_to_docx_template(name:, belongs_to:, template_type:) click to toggle source
# File lib/docx_manager_client/model_additions/belongs_to_docx_template.rb, line 5
def belongs_to_docx_template(name:, belongs_to:, template_type:)
  # dependency check
  raise DocxManagerClient::DependencyError.new("#{self.name} dose not have relation 'belongs_to :#{belongs_to}'") unless self.reflect_on_all_associations(:belongs_to).map(&:name).include?(belongs_to.to_sym)

  # attr_accessor
  attr_accessor :"#{name}_docx_file"

  # callbacks
  after_save    :"post_#{name}_docx"
  after_destroy :"delete_#{name}_docx"

  # instance methods
  define_method "#{name}_docx_path" do
    status, response = DocxManagerClient::Connection.docx_server_api(:get, send("#{name}_docx_request_paht"))
    docx_response_attr(status, response, :docx_url)
  end

  define_method "#{name}_pdf_path" do
    status, response = DocxManagerClient::Connection.docx_server_api(:get, send("#{name}_docx_request_paht"))
    docx_response_attr(status, response, :pdf_url)
  end

  define_method "#{name}_png_path" do
    status, response = DocxManagerClient::Connection.docx_server_api(:get, send("#{name}_docx_request_paht"))
    docx_response_attr(status, response, :png_url)
  end

  define_method "post_#{name}_docx" do
    status, response = DocxManagerClient::Connection.docx_server_api(:post, send("#{name}_docx_request_paht"), send("#{name}_request_attributes"))
    docx_response_attr(status, response)
  end

  define_method "delete_#{name}_docx" do
    status, response = DocxManagerClient::Connection.docx_server_api(:delete, send("#{name}_docx_request_paht"), send("#{name}_request_attributes"))
    docx_response_attr(status, response)
  end

  # private methods
  define_method :docx_response_attr do |status, response, attr = nil|
    if status < 300
      attr.nil? ? response.data : response.data.attributes.send(attr)
    else
      response.errors
    end
  end

  define_method "#{name}_docx_request_paht" do
    reference_record_id   = send("#{belongs_to}_id")
    reference_record_type = self.class.reflect_on_association(belongs_to).klass.name
    record_id             = id
    record_type           = self.class.name
    "templates/#{template_type}/#{reference_record_type}/#{reference_record_id}/generated_documents/#{record_type}/#{record_id}"
  end

  define_method "#{name}_request_attributes" do
    { request_attributes: send("#{name}_docx_hash") }
  end

  define_method "#{name}_docx_hash" do
    raise NotImplementedError,
    "\e[1m\e[91m#{self.class}\e[0m belongs_to_docx_template :#{name} but didn't define \e[91m'#{name}_docx_hash'\e[0m"
  end

  private :docx_response_attr, "#{name}_docx_hash".to_sym, "#{name}_docx_request_paht".to_sym, "#{name}_request_attributes".to_sym

end