From 9e542c7aaf20e7806b15ca47e1269f90a0697c62 Mon Sep 17 00:00:00 2001 From: Mikhael Rakauskas Date: Thu, 3 Jul 2025 10:31:57 -0400 Subject: [PATCH] export controller update and misc migration annoyances --- app/controllers/export_controller.rb | 66 ++++++++++++++------- app/javascript/template_builder/builder.vue | 3 +- app/models/document_generation_event.rb | 2 +- app/models/email_event.rb | 2 +- 4 files changed, 47 insertions(+), 26 deletions(-) diff --git a/app/controllers/export_controller.rb b/app/controllers/export_controller.rb index 411daafd..cfa94cf4 100644 --- a/app/controllers/export_controller.rb +++ b/app/controllers/export_controller.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true + require 'faraday' class ExportController < ApplicationController @@ -7,36 +8,55 @@ class ExportController < ApplicationController skip_before_action :verify_authenticity_token # Template is sent as JSON already; we're just gonnna send it on to the third party. - # It's assumed that any extra details required will also be passed through from the front end - - # set by the ExportLocation.extra_params def export_template export_location = ExportLocation.default_location - conn = Faraday.new(url: export_location.api_base_url) do |faraday| + + data = request.raw_post.present? ? JSON.parse(request.raw_post) : params.to_unsafe_h + response = post_to_api(data, export_location.templates_endpoint, export_location.extra_params) + + if response&.success? + Rails.logger.info("Successfully exported template #{data[:template][:name]} to #{export_location.name}") + head :ok + else + Rails.logger.error("Failed to export template to third party: #{response&.status}") + Rollbar.error("#{export_location.name} template export API error: #{response&.status}") if defined?(Rollbar) + head :unprocessable_entity + end + rescue Faraday::Error => e + Rails.logger.error("Failed to export template Faraday: #{e.message}") + Rollbar.error("Failed to export template: #{e.message}") if defined?(Rollbar) + head :service_unavailable + rescue StandardError => e + Rails.logger.error("Failed to export template: #{e.message}") + Rollbar.error(e) if defined?(Rollbar) + head :internal_server_error + end + + private + + def api_connection + @api_connection ||= Faraday.new(url: ExportLocation.default_location.api_base_url) do |faraday| faraday.request :json faraday.response :json faraday.adapter Faraday.default_adapter end - - response = conn.post(export_location.templates_endpoint) do |req| - # req.headers['Authorization'] = "Bearer #{export_location.authorization_token}" lol - req.body = request.raw_post.present? ? JSON.parse(request.raw_post) : params.to_unsafe_h - req.body.merge!(export_location.extra_params) if export_location.extra_params - end - - if response.success? - head :ok # alert: I18n.t('exports.templates.success') - else - Rails.logger.error("Failed to send to third party Faraday: #{response.status}") - Rollbar.error("#{export_location.name} API error: #{response.status}") if defined?(Rollbar) - head :ok # templates_path, alert: I18n.t('exports.templates.api_error') - end - rescue Faraday::Error => e - Rails.logger.error("Failed to send to third party Faraday: #{e.message}") - Rollbar.error("Failed to send to third party: #{e.message}") if defined?(Rollbar) - redirect_to templates_path, alert: I18n.t('exports.templates.api_error') rescue StandardError => e - Rails.logger.error("Failed to send to third party: #{e.message}") + Rails.logger.error("Failed to create API connection: #{e.message}") Rollbar.error(e) if defined?(Rollbar) - redirect_to templates_path, alert: I18n.t('exports.templates.error') + nil + end + + def post_to_api(data, endpoint, extra_params = nil) + connection = api_connection + return nil unless connection + + connection.post(endpoint) do |req| + # req.headers['Authorization'] = "Bearer #{export_location.authorization_token}" lol + + # Merge extra_params into data if provided + data = data.merge(extra_params) if extra_params.present? && data.is_a?(Hash) + + req.body = data.is_a?(String) ? data : data.to_json + end end end diff --git a/app/javascript/template_builder/builder.vue b/app/javascript/template_builder/builder.vue index e36f8d6f..f14555ab 100644 --- a/app/javascript/template_builder/builder.vue +++ b/app/javascript/template_builder/builder.vue @@ -1824,8 +1824,9 @@ export default { method: 'PUT', body: JSON.stringify({ template: { + id: this.template.id, name: this.template.name, - schema: this.template.schema, + schema: this.template.schema[0], submitters: this.template.submitters, fields: this.template.fields } diff --git a/app/models/document_generation_event.rb b/app/models/document_generation_event.rb index f4e0a701..24d71ba3 100644 --- a/app/models/document_generation_event.rb +++ b/app/models/document_generation_event.rb @@ -13,7 +13,7 @@ # Indexes # # index_document_generation_events_on_submitter_id (submitter_id) -# index_document_generation_events_on_submitter_id_and_event_name (submitter_id,event_name) UNIQUE WHERE ((event_name)::text = ANY ((ARRAY['start'::character varying, 'complete'::character varying])::text[])) +# index_document_generation_events_on_submitter_id_and_event_name (submitter_id,event_name) UNIQUE WHERE ((event_name)::text = ANY (ARRAY[('start'::character varying)::text, ('complete'::character varying)::text])) # # Foreign Keys # diff --git a/app/models/email_event.rb b/app/models/email_event.rb index 3c6aac61..3aaa5db9 100644 --- a/app/models/email_event.rb +++ b/app/models/email_event.rb @@ -20,7 +20,7 @@ # # index_email_events_on_account_id_and_event_datetime (account_id,event_datetime) # index_email_events_on_email (email) -# index_email_events_on_email_event_types (email) WHERE ((event_type)::text = ANY ((ARRAY['bounce'::character varying, 'soft_bounce'::character varying, 'complaint'::character varying, 'soft_complaint'::character varying])::text[])) +# index_email_events_on_email_event_types (email) WHERE ((event_type)::text = ANY (ARRAY[('bounce'::character varying)::text, ('soft_bounce'::character varying)::text, ('complaint'::character varying)::text, ('soft_complaint'::character varying)::text])) # index_email_events_on_emailable (emailable_type,emailable_id) # index_email_events_on_message_id (message_id) #