From 1fe4f157c77d17adfddcaaece784471c67e0a303 Mon Sep 17 00:00:00 2001 From: stage-rl Date: Mon, 4 Dec 2023 14:39:29 +0100 Subject: [PATCH 1/8] First raw version of sync authorization --- .../authorize_delivery_notification_job.rb | 23 +++++++++++-------- app/lib/upvs/govbox_api.rb | 11 +++++---- .../authorize_delivery_notification_action.rb | 2 +- 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/app/jobs/govbox/authorize_delivery_notification_job.rb b/app/jobs/govbox/authorize_delivery_notification_job.rb index 9c25802bf..3a93ee9b2 100644 --- a/app/jobs/govbox/authorize_delivery_notification_job.rb +++ b/app/jobs/govbox/authorize_delivery_notification_job.rb @@ -2,20 +2,25 @@ class Govbox::AuthorizeDeliveryNotificationJob < ApplicationJob def perform(message, upvs_client: UpvsEnvironment.upvs_client) edesk_api = upvs_client.api(message.thread.box).edesk - success = edesk_api.authorize_delivery_notification(message.metadata["delivery_notification"]["authorize_url"]) + success, target_message_id = edesk_api.authorize_delivery_notification(message.metadata["delivery_notification"]["authorize_url"], mode: :sync) - unless success - message.metadata["authorized"] = nil - message.save! + handle_failed_authorization unless success - Govbox::Message.add_delivery_notification_tag(message) + message.metadata["authorized"] = true + message.save! - raise StandardError, "Delivery notification authorization failed!" - end + raise StandardError, "Target message download failed" unless target_message_id + raise StandardError, "Target message download failed" unless edesk_api.fetch_message(target_message_id) - message.metadata["authorized"] = true + # Govbox::SyncBoxJob.set(wait: 3.minutes).perform_later(message.thread.box) + end + + def handle_failed_authorization + message.metadata["authorized"] = nil message.save! - Govbox::SyncBoxJob.set(wait: 3.minutes).perform_later(message.thread.box) + Govbox::Message.add_delivery_notification_tag(message) + + raise StandardError, "Delivery notification authorization failed!" end end diff --git a/app/lib/upvs/govbox_api.rb b/app/lib/upvs/govbox_api.rb index ccef0d0ac..cc12441a8 100644 --- a/app/lib/upvs/govbox_api.rb +++ b/app/lib/upvs/govbox_api.rb @@ -12,7 +12,7 @@ def initialize(url, box:, handler: Faraday) @edesk = Edesk.new(self) @sktalk = SkTalk.new(self) @handler = handler - @handler.options.timeout = 900000 + @handler.options.timeout = 900_000 end class Edesk < Namespace @@ -28,16 +28,17 @@ def fetch_message(message_id) @api.request(:get, "#{@api.url}/api/edesk/messages/#{message_id}", {}, header) end - def authorize_delivery_notification(authorization_url) - response_status, response_body = @api.request(:post, authorization_url, {}, header) - authorization_successful?(response_status, response_body['code']) + def authorize_delivery_notification(authorization_url, mode: :async) + params = (mode == :sync ? { async: false } : {}) + response_status, response_body = @api.request(:post, authorization_url, params, header) + [authorization_successful?(response_status, response_body['code']), response_body['message_id']] end private def header { - "Authorization": authorization_payload, + "Authorization": authorization_payload } end diff --git a/app/models/govbox/authorize_delivery_notification_action.rb b/app/models/govbox/authorize_delivery_notification_action.rb index 7f8f541ee..f000e8e9d 100644 --- a/app/models/govbox/authorize_delivery_notification_action.rb +++ b/app/models/govbox/authorize_delivery_notification_action.rb @@ -7,7 +7,7 @@ def self.run(message) message.save! Govbox::Message.remove_delivery_notification_tag(message) - Govbox::AuthorizeDeliveryNotificationJob.perform_later(message) + Govbox::AuthorizeDeliveryNotificationJob.perform_now(message) EventBus.publish(:message_delivery_authorized, message) end From 84c56c6051260ef495cee8799f4dad47f47975a2 Mon Sep 17 00:00:00 2001 From: stage-rl Date: Wed, 6 Dec 2023 15:54:58 +0100 Subject: [PATCH 2/8] Sync delivery authorization --- app/jobs/govbox/authorize_delivery_notification_job.rb | 9 ++++++--- app/models/box.rb | 1 + .../govbox/authorize_delivery_notification_action.rb | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/app/jobs/govbox/authorize_delivery_notification_job.rb b/app/jobs/govbox/authorize_delivery_notification_job.rb index 3a93ee9b2..a6678cba8 100644 --- a/app/jobs/govbox/authorize_delivery_notification_job.rb +++ b/app/jobs/govbox/authorize_delivery_notification_job.rb @@ -10,9 +10,7 @@ def perform(message, upvs_client: UpvsEnvironment.upvs_client) message.save! raise StandardError, "Target message download failed" unless target_message_id - raise StandardError, "Target message download failed" unless edesk_api.fetch_message(target_message_id) - - # Govbox::SyncBoxJob.set(wait: 3.minutes).perform_later(message.thread.box) + raise StandardError, "Target message download failed" unless run_download_job(message, target_message_id) end def handle_failed_authorization @@ -23,4 +21,9 @@ def handle_failed_authorization raise StandardError, "Delivery notification authorization failed!" end + + def run_download_job(message, message_id) + folder = message.thread.box.folders.select(&:inbox?).first + Govbox::DownloadMessageJob.perform_later(folder, message_id) + end end diff --git a/app/models/box.rb b/app/models/box.rb index 2b41b62e7..5e716b69d 100644 --- a/app/models/box.rb +++ b/app/models/box.rb @@ -18,6 +18,7 @@ class Box < ApplicationRecord belongs_to :tenant belongs_to :api_connection + has_many :folders, class_name: "Govbox::Folder" has_many :message_threads, extend: MessageThreadsExtensions, dependent: :destroy has_many :messages, through: :message_threads has_many :message_drafts_imports, dependent: :destroy diff --git a/app/models/govbox/authorize_delivery_notification_action.rb b/app/models/govbox/authorize_delivery_notification_action.rb index f000e8e9d..7f8f541ee 100644 --- a/app/models/govbox/authorize_delivery_notification_action.rb +++ b/app/models/govbox/authorize_delivery_notification_action.rb @@ -7,7 +7,7 @@ def self.run(message) message.save! Govbox::Message.remove_delivery_notification_tag(message) - Govbox::AuthorizeDeliveryNotificationJob.perform_now(message) + Govbox::AuthorizeDeliveryNotificationJob.perform_later(message) EventBus.publish(:message_delivery_authorized, message) end From b1497bdfc667596ab32411217caeff2792da9dfe Mon Sep 17 00:00:00 2001 From: stage-rl Date: Thu, 7 Dec 2023 11:07:30 +0100 Subject: [PATCH 3/8] Refactor based on PR review --- .../authorize_delivery_notification_job.rb | 27 +++++++------------ app/jobs/govbox/download_message_job.rb | 23 ++++++++++++---- app/jobs/govbox/sync_folder_job.rb | 2 +- app/models/box.rb | 1 - 4 files changed, 29 insertions(+), 24 deletions(-) diff --git a/app/jobs/govbox/authorize_delivery_notification_job.rb b/app/jobs/govbox/authorize_delivery_notification_job.rb index a6678cba8..9e8056a72 100644 --- a/app/jobs/govbox/authorize_delivery_notification_job.rb +++ b/app/jobs/govbox/authorize_delivery_notification_job.rb @@ -4,26 +4,19 @@ def perform(message, upvs_client: UpvsEnvironment.upvs_client) success, target_message_id = edesk_api.authorize_delivery_notification(message.metadata["delivery_notification"]["authorize_url"], mode: :sync) - handle_failed_authorization unless success - - message.metadata["authorized"] = true - message.save! + if success + message.metadata["authorized"] = true + message.save! + else + message.metadata["authorized"] = nil + message.save! + Govbox::Message.add_delivery_notification_tag(message) + raise StandardError, "Delivery notification authorization failed!" + end raise StandardError, "Target message download failed" unless target_message_id - raise StandardError, "Target message download failed" unless run_download_job(message, target_message_id) - end - - def handle_failed_authorization - message.metadata["authorized"] = nil - message.save! - Govbox::Message.add_delivery_notification_tag(message) - - raise StandardError, "Delivery notification authorization failed!" + Govbox::DownloadMessageJob.perform_later(box: message.thread.box, target_message_id) end - def run_download_job(message, message_id) - folder = message.thread.box.folders.select(&:inbox?).first - Govbox::DownloadMessageJob.perform_later(folder, message_id) - end end diff --git a/app/jobs/govbox/download_message_job.rb b/app/jobs/govbox/download_message_job.rb index 97cdfbbf6..8e8b05b9c 100644 --- a/app/jobs/govbox/download_message_job.rb +++ b/app/jobs/govbox/download_message_job.rb @@ -2,13 +2,27 @@ module Govbox class DownloadMessageJob < ApplicationJob queue_as :default - def perform(govbox_folder, edesk_message_id, upvs_client: UpvsEnvironment.upvs_client) - edesk_api = upvs_client.api(govbox_folder.box).edesk - response_status, raw_message = edesk_api.fetch_message(edesk_message_id) + def perform(edesk_message_id:, govbox_folder: nil, box: nil, upvs_client: UpvsEnvironment.upvs_client) + setup_folder_and_box(box, govbox_folder) + + response_status, raw_message = upvs_client.api(@box).edesk.fetch_message(edesk_message_id) raise "Unable to fetch folder messages" if response_status != 200 - govbox_message = govbox_folder.messages.create!( + process_govbox_message(raw_message) + end + + def setup_folder_and_box(box, govbox_folder) + raise "Folder or Box must be specified" unless govbox_folder || box + + @box = box || govbox_folder.box + @govbox_folder = govbox_folder || Govbox::Folder.where(box: box, name: 'Inbox') + + raise "Folder must match specified box" unless @govbox_folder.box == box + end + + def process_govbox_message(raw_message) + govbox_message = @govbox_folder.messages.create!( edesk_message_id: raw_message["id"], message_id: raw_message["message_id"], correlation_id: raw_message["correlation_id"], @@ -17,7 +31,6 @@ def perform(govbox_folder, edesk_message_id, upvs_client: UpvsEnvironment.upvs_c body: raw_message["original_xml"], payload: raw_message ) - ProcessMessageJob.perform_later(govbox_message) end end diff --git a/app/jobs/govbox/sync_folder_job.rb b/app/jobs/govbox/sync_folder_job.rb index 5e0515411..d2710e757 100644 --- a/app/jobs/govbox/sync_folder_job.rb +++ b/app/jobs/govbox/sync_folder_job.rb @@ -34,7 +34,7 @@ def perform(folder, upvs_client: UpvsEnvironment.upvs_client, batch_size: 1000) end new_messages_ids.each do |edesk_message_id| - DownloadMessageJob.perform_later(folder, edesk_message_id) + DownloadMessageJob.perform_later(govbox_folder: folder, edesk_message_id) end end end diff --git a/app/models/box.rb b/app/models/box.rb index 5e716b69d..2b41b62e7 100644 --- a/app/models/box.rb +++ b/app/models/box.rb @@ -18,7 +18,6 @@ class Box < ApplicationRecord belongs_to :tenant belongs_to :api_connection - has_many :folders, class_name: "Govbox::Folder" has_many :message_threads, extend: MessageThreadsExtensions, dependent: :destroy has_many :messages, through: :message_threads has_many :message_drafts_imports, dependent: :destroy From 24c8f1d109adbdb74050c156a3714655690e3aae Mon Sep 17 00:00:00 2001 From: stage-rl Date: Thu, 7 Dec 2023 11:12:33 +0100 Subject: [PATCH 4/8] Fix typos --- app/jobs/govbox/authorize_delivery_notification_job.rb | 3 +-- app/jobs/govbox/sync_folder_job.rb | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/app/jobs/govbox/authorize_delivery_notification_job.rb b/app/jobs/govbox/authorize_delivery_notification_job.rb index 9e8056a72..99b296087 100644 --- a/app/jobs/govbox/authorize_delivery_notification_job.rb +++ b/app/jobs/govbox/authorize_delivery_notification_job.rb @@ -16,7 +16,6 @@ def perform(message, upvs_client: UpvsEnvironment.upvs_client) raise StandardError, "Target message download failed" unless target_message_id - Govbox::DownloadMessageJob.perform_later(box: message.thread.box, target_message_id) + Govbox::DownloadMessageJob.perform_later(box: message.thread.box, edesk_message_id: target_message_id) end - end diff --git a/app/jobs/govbox/sync_folder_job.rb b/app/jobs/govbox/sync_folder_job.rb index d2710e757..9d9f50279 100644 --- a/app/jobs/govbox/sync_folder_job.rb +++ b/app/jobs/govbox/sync_folder_job.rb @@ -26,7 +26,7 @@ def perform(folder, upvs_client: UpvsEnvironment.upvs_client, batch_size: 1000) end if moved_edesk_message_ids.any? - # TODO change tag + # TODO: change tag Govbox::Message.where(edesk_message_id: moved_edesk_message_ids).update_all(folder_id: folder.id) end @@ -34,7 +34,7 @@ def perform(folder, upvs_client: UpvsEnvironment.upvs_client, batch_size: 1000) end new_messages_ids.each do |edesk_message_id| - DownloadMessageJob.perform_later(govbox_folder: folder, edesk_message_id) + DownloadMessageJob.perform_later(govbox_folder: folder, edesk_message_id: edesk_message_id) end end end From 30bff7e94d485dd189b7f070fd18a9ba08529f2b Mon Sep 17 00:00:00 2001 From: stage-rl Date: Thu, 7 Dec 2023 11:30:02 +0100 Subject: [PATCH 5/8] PR review comments --- .../authorize_delivery_notification_job.rb | 3 ++- app/jobs/govbox/download_message_job.rb | 23 ++++--------------- 2 files changed, 7 insertions(+), 19 deletions(-) diff --git a/app/jobs/govbox/authorize_delivery_notification_job.rb b/app/jobs/govbox/authorize_delivery_notification_job.rb index 99b296087..61a13d1c2 100644 --- a/app/jobs/govbox/authorize_delivery_notification_job.rb +++ b/app/jobs/govbox/authorize_delivery_notification_job.rb @@ -16,6 +16,7 @@ def perform(message, upvs_client: UpvsEnvironment.upvs_client) raise StandardError, "Target message download failed" unless target_message_id - Govbox::DownloadMessageJob.perform_later(box: message.thread.box, edesk_message_id: target_message_id) + folder = Govbox::Folder.where(box: message.thread.box, name: "Inbox") + Govbox::DownloadMessageJob.perform_later(folder, target_message_id) end end diff --git a/app/jobs/govbox/download_message_job.rb b/app/jobs/govbox/download_message_job.rb index 8e8b05b9c..97cdfbbf6 100644 --- a/app/jobs/govbox/download_message_job.rb +++ b/app/jobs/govbox/download_message_job.rb @@ -2,27 +2,13 @@ module Govbox class DownloadMessageJob < ApplicationJob queue_as :default - def perform(edesk_message_id:, govbox_folder: nil, box: nil, upvs_client: UpvsEnvironment.upvs_client) - setup_folder_and_box(box, govbox_folder) - - response_status, raw_message = upvs_client.api(@box).edesk.fetch_message(edesk_message_id) + def perform(govbox_folder, edesk_message_id, upvs_client: UpvsEnvironment.upvs_client) + edesk_api = upvs_client.api(govbox_folder.box).edesk + response_status, raw_message = edesk_api.fetch_message(edesk_message_id) raise "Unable to fetch folder messages" if response_status != 200 - process_govbox_message(raw_message) - end - - def setup_folder_and_box(box, govbox_folder) - raise "Folder or Box must be specified" unless govbox_folder || box - - @box = box || govbox_folder.box - @govbox_folder = govbox_folder || Govbox::Folder.where(box: box, name: 'Inbox') - - raise "Folder must match specified box" unless @govbox_folder.box == box - end - - def process_govbox_message(raw_message) - govbox_message = @govbox_folder.messages.create!( + govbox_message = govbox_folder.messages.create!( edesk_message_id: raw_message["id"], message_id: raw_message["message_id"], correlation_id: raw_message["correlation_id"], @@ -31,6 +17,7 @@ def process_govbox_message(raw_message) body: raw_message["original_xml"], payload: raw_message ) + ProcessMessageJob.perform_later(govbox_message) end end From d2c676c0b1645ef402519ce287b6198ed7cd47b8 Mon Sep 17 00:00:00 2001 From: stage-rl Date: Thu, 7 Dec 2023 11:33:15 +0100 Subject: [PATCH 6/8] Revert sync_folder_job changes --- app/jobs/govbox/sync_folder_job.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/jobs/govbox/sync_folder_job.rb b/app/jobs/govbox/sync_folder_job.rb index 9d9f50279..461ac4c9f 100644 --- a/app/jobs/govbox/sync_folder_job.rb +++ b/app/jobs/govbox/sync_folder_job.rb @@ -34,7 +34,7 @@ def perform(folder, upvs_client: UpvsEnvironment.upvs_client, batch_size: 1000) end new_messages_ids.each do |edesk_message_id| - DownloadMessageJob.perform_later(govbox_folder: folder, edesk_message_id: edesk_message_id) + DownloadMessageJob.perform_later(folder, edesk_message_id) end end end From c989845d2cd3a3d5d1dbc4750fbe2388efa5f33a Mon Sep 17 00:00:00 2001 From: stage-rl Date: Thu, 7 Dec 2023 11:39:31 +0100 Subject: [PATCH 7/8] Explain folder extraction logic in authorize notification job --- app/jobs/govbox/authorize_delivery_notification_job.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/jobs/govbox/authorize_delivery_notification_job.rb b/app/jobs/govbox/authorize_delivery_notification_job.rb index 61a13d1c2..a483aec72 100644 --- a/app/jobs/govbox/authorize_delivery_notification_job.rb +++ b/app/jobs/govbox/authorize_delivery_notification_job.rb @@ -16,7 +16,8 @@ def perform(message, upvs_client: UpvsEnvironment.upvs_client) raise StandardError, "Target message download failed" unless target_message_id - folder = Govbox::Folder.where(box: message.thread.box, name: "Inbox") + # folder is not available in UPVS get_message response, therefore we're using corresponding inbox as target folder + folder = Govbox::Folder.where(box: message.thread.box, name: "Inbox", system: true) Govbox::DownloadMessageJob.perform_later(folder, target_message_id) end end From 836349309f8f2a9b664d6c2044bad6b458e6368b Mon Sep 17 00:00:00 2001 From: stage-rl Date: Fri, 8 Dec 2023 09:17:39 +0100 Subject: [PATCH 8/8] Fix sync delivery authorization --- app/jobs/govbox/authorize_delivery_notification_job.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/jobs/govbox/authorize_delivery_notification_job.rb b/app/jobs/govbox/authorize_delivery_notification_job.rb index a483aec72..86f8ca17a 100644 --- a/app/jobs/govbox/authorize_delivery_notification_job.rb +++ b/app/jobs/govbox/authorize_delivery_notification_job.rb @@ -17,7 +17,7 @@ def perform(message, upvs_client: UpvsEnvironment.upvs_client) raise StandardError, "Target message download failed" unless target_message_id # folder is not available in UPVS get_message response, therefore we're using corresponding inbox as target folder - folder = Govbox::Folder.where(box: message.thread.box, name: "Inbox", system: true) + folder = Govbox::Folder.where(box: message.thread.box, name: "Inbox", system: true).first Govbox::DownloadMessageJob.perform_later(folder, target_message_id) end end