From 8031370b1e5d213997d53c8da393b3d9bba19be0 Mon Sep 17 00:00:00 2001 From: luciajanikova <19lucia99@gmail.com> Date: Tue, 4 Feb 2025 09:50:02 +0100 Subject: [PATCH 1/3] Mark only new significant inbox messages unread & mark their threads with InboxTag --- app/jobs/add_inbox_tag_to_thread_job.rb | 11 ++++++++++ app/jobs/add_inbox_tag_to_threads_job.rb | 5 +++++ app/models/govbox/message.rb | 14 ++++++++++-- app/models/inbox_tag.rb | 22 +++++++++++++++++++ app/models/tenant.rb | 2 ++ db/migrate/20250204074342_create_inbox_tag.rb | 12 ++++++++++ db/schema.rb | 2 +- 7 files changed, 65 insertions(+), 3 deletions(-) create mode 100644 app/jobs/add_inbox_tag_to_thread_job.rb create mode 100644 app/jobs/add_inbox_tag_to_threads_job.rb create mode 100644 app/models/inbox_tag.rb create mode 100644 db/migrate/20250204074342_create_inbox_tag.rb diff --git a/app/jobs/add_inbox_tag_to_thread_job.rb b/app/jobs/add_inbox_tag_to_thread_job.rb new file mode 100644 index 00000000..538a3bb3 --- /dev/null +++ b/app/jobs/add_inbox_tag_to_thread_job.rb @@ -0,0 +1,11 @@ +class AddInboxTagToThreadJob < ApplicationJob + def perform(message_thread) + message_thread.assign_tag(message_thread.tenant.inbox_tag) if message_thread.messages.any?{ |message| significant_inbox_message?(message) } + end + + private + + def significant_inbox_message?(message) + !message.outbox? && !Govbox::Message::INFORMATIONAL_MESSAGE_CLASSES.include?(message.metadata.dig('edesk_class')) + end +end diff --git a/app/jobs/add_inbox_tag_to_threads_job.rb b/app/jobs/add_inbox_tag_to_threads_job.rb new file mode 100644 index 00000000..69abb106 --- /dev/null +++ b/app/jobs/add_inbox_tag_to_threads_job.rb @@ -0,0 +1,5 @@ +class AddInboxTagToThreadsJob < ApplicationJob + def perform + MessageThread.find_each { |message_thread| AddInboxTagToThreadJob.perform_later(message_thread) } + end +end diff --git a/app/models/govbox/message.rb b/app/models/govbox/message.rb index 73cc9da8..9d92b36c 100644 --- a/app/models/govbox/message.rb +++ b/app/models/govbox/message.rb @@ -20,7 +20,7 @@ class Govbox::Message < ApplicationRecord EGOV_DOCUMENT_CLASS = 'EGOV_DOCUMENT' EGOV_NOTIFICATION_CLASS = 'EGOV_NOTIFICATION' - COLLAPSED_BY_DEFAULT_MESSAGE_CLASSES = ['ED_DELIVERY_REPORT', 'POSTING_CONFIRMATION', 'POSTING_INFORMATION'] + INFORMATIONAL_MESSAGE_CLASSES = ['ED_DELIVERY_REPORT', 'POSTING_CONFIRMATION', 'POSTING_INFORMATION'] GENERAL_AGENDA_SCHEMA = 'http://schemas.gov.sk/form/App.GeneralAgenda/1.9' DELIVERY_NOTIFICATION_TAG = 'delivery_notification' @@ -39,6 +39,7 @@ def self.create_message_with_thread!(govbox_message) title: message.metadata.dig("delivery_notification", "consignment", "subject").presence || message.title, delivered_at: govbox_message.delivered_at ) + message.thread.assign_tag(message.thread.tenant.inbox_tag) if !message.outbox? && !govbox_message.insignificant? message.save! @@ -66,7 +67,15 @@ def replyable? end def collapsed? - payload["class"].in?(COLLAPSED_BY_DEFAULT_MESSAGE_CLASSES) + insignificant? + end + + def read? + folder.outbox? || insignificant? + end + + def insignificant? + payload["class"].in?(INFORMATIONAL_MESSAGE_CLASSES) end def delivery_notification @@ -97,6 +106,7 @@ def self.create_message(govbox_message) replyable: govbox_message.replyable?, collapsed: govbox_message.collapsed?, outbox: govbox_message.folder.outbox?, + read: govbox_message.read?, metadata: { "correlation_id": govbox_message.payload["correlation_id"], "reference_id": govbox_message.payload["reference_id"], diff --git a/app/models/inbox_tag.rb b/app/models/inbox_tag.rb new file mode 100644 index 00000000..bf7e9ad3 --- /dev/null +++ b/app/models/inbox_tag.rb @@ -0,0 +1,22 @@ +# == Schema Information +# +# Table name: tags +# +# id :bigint not null, primary key +# color :enum +# external_name :string +# icon :string +# name :string not null +# tag_groups_count :integer default(0), not null +# type :string not null +# visible :boolean default(TRUE), not null +# created_at :datetime not null +# updated_at :datetime not null +# owner_id :bigint +# tenant_id :bigint not null +# +class InboxTag < Tag + def destroyable? + false + end +end diff --git a/app/models/tenant.rb b/app/models/tenant.rb index 1ba3c795..5d565c67 100644 --- a/app/models/tenant.rb +++ b/app/models/tenant.rb @@ -20,6 +20,7 @@ class Tenant < ApplicationRecord has_one :draft_tag, -> { where(owner_id: nil) } has_one :everything_tag + has_one :inbox_tag has_one :signature_requested_tag has_one :signed_tag has_one :signed_externally_tag @@ -117,6 +118,7 @@ def create_default_objects create_draft_tag!(name: "Rozpracované", visible: true) create_everything_tag!(name: "Všetky správy", visible: false) + create_inbox_tag!(name: "Doručené", visible: false) create_archived_tag!(name: "Archivované", color: "green", icon: "archive-box", visible: true) create_signature_requested_tag!(name: "Na podpis", visible: true, color: "yellow", icon: "pencil") create_signed_tag!(name: "Podpísané", visible: true, color: "green", icon: "fingerprint") diff --git a/db/migrate/20250204074342_create_inbox_tag.rb b/db/migrate/20250204074342_create_inbox_tag.rb new file mode 100644 index 00000000..be800e96 --- /dev/null +++ b/db/migrate/20250204074342_create_inbox_tag.rb @@ -0,0 +1,12 @@ +class CreateInboxTag < ActiveRecord::Migration[7.1] + def up + Tenant.find_each do |tenant| + tenant.create_inbox_tag!(name: "Doručené", visible: false) unless tenant.inbox_tag + AddInboxTagToThreadsJob.set(job_context: :later).perform_later + end + end + + def down + # noop + end +end diff --git a/db/schema.rb b/db/schema.rb index 7fa8c77d..d2665ff1 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.1].define(version: 2025_01_14_170638) do +ActiveRecord::Schema[7.1].define(version: 2025_02_04_074342) do # These are extensions that must be enabled in order to support this database enable_extension "pgcrypto" enable_extension "plpgsql" From 580ae9f00b2ebee7e60f483d3f1590897a364d9a Mon Sep 17 00:00:00 2001 From: luciajanikova <19lucia99@gmail.com> Date: Wed, 5 Feb 2025 16:22:21 +0100 Subject: [PATCH 2/3] Add test --- app/jobs/add_inbox_tag_to_thread_job.rb | 2 +- app/models/govbox/message.rb | 4 +- test/fixtures/govbox/messages.yml | 94 ++++++++++++++++++++++++- test/fixtures/tags.yml | 18 +++++ test/models/automation/rule_test.rb | 2 +- test/models/govbox/message_test.rb | 28 ++++++++ 6 files changed, 143 insertions(+), 5 deletions(-) diff --git a/app/jobs/add_inbox_tag_to_thread_job.rb b/app/jobs/add_inbox_tag_to_thread_job.rb index 538a3bb3..f3b788ca 100644 --- a/app/jobs/add_inbox_tag_to_thread_job.rb +++ b/app/jobs/add_inbox_tag_to_thread_job.rb @@ -6,6 +6,6 @@ def perform(message_thread) private def significant_inbox_message?(message) - !message.outbox? && !Govbox::Message::INFORMATIONAL_MESSAGE_CLASSES.include?(message.metadata.dig('edesk_class')) + !message.outbox? && !Govbox::Message::INSIGNIFICANT_MESSAGE_CLASSES.include?(message.metadata.dig('edesk_class')) end end diff --git a/app/models/govbox/message.rb b/app/models/govbox/message.rb index 9d92b36c..96d8389d 100644 --- a/app/models/govbox/message.rb +++ b/app/models/govbox/message.rb @@ -20,7 +20,7 @@ class Govbox::Message < ApplicationRecord EGOV_DOCUMENT_CLASS = 'EGOV_DOCUMENT' EGOV_NOTIFICATION_CLASS = 'EGOV_NOTIFICATION' - INFORMATIONAL_MESSAGE_CLASSES = ['ED_DELIVERY_REPORT', 'POSTING_CONFIRMATION', 'POSTING_INFORMATION'] + INSIGNIFICANT_MESSAGE_CLASSES = ['ED_DELIVERY_REPORT', 'POSTING_CONFIRMATION', 'POSTING_INFORMATION'] GENERAL_AGENDA_SCHEMA = 'http://schemas.gov.sk/form/App.GeneralAgenda/1.9' DELIVERY_NOTIFICATION_TAG = 'delivery_notification' @@ -75,7 +75,7 @@ def read? end def insignificant? - payload["class"].in?(INFORMATIONAL_MESSAGE_CLASSES) + payload["class"].in?(INSIGNIFICANT_MESSAGE_CLASSES) end def delivery_notification diff --git a/test/fixtures/govbox/messages.yml b/test/fixtures/govbox/messages.yml index bc011821..e12854c4 100644 --- a/test/fixtures/govbox/messages.yml +++ b/test/fixtures/govbox/messages.yml @@ -323,7 +323,7 @@ ssd_done_new: class: FORM content: Dummy -ssd_posting_confirmation: +ssd_main_done_posting_confirmation: message_id: <%= SecureRandom.uuid %> correlation_id: d2d6ab13-347e-49f4-9c3b-0b8390430870 edesk_message_id: 102 @@ -345,3 +345,95 @@ ssd_posting_confirmation: signed: false class: FORM content: Dummy + +ssd_egov_application: + message_id: <%= SecureRandom.uuid %> + correlation_id: f932fd8b-c996-4eb8-ba6c-af7714ef4069 + edesk_message_id: 103 + delivered_at: <%= DateTime.current %> + edesk_class: EGOV_APPLICATION + folder: ssd_sent + payload: + message_id: <%= SecureRandom.uuid %> + subject: MySubject + sender_name: MySender + sender_uri: MySenderURI + recipient_name: MyRecipient + delivered_at: <%= DateTime.current.to_s %> + original_html: MyHtml + class: EGOV_APPLICATION + objects: + - name: form + mime_type: application/x-eform-xml + signed: false + class: FORM + content: Dummy + +ssd_posting_confirmation: + message_id: <%= SecureRandom.uuid %> + correlation_id: f932fd8b-c996-4eb8-ba6c-af7714ef4069 + edesk_message_id: 104 + delivered_at: <%= DateTime.current %> + edesk_class: POSTING_CONFIRMATION + folder: ssd_one + payload: + message_id: <%= SecureRandom.uuid %> + subject: MySubject + sender_name: MySender + sender_uri: MySenderURI + recipient_name: MyRecipient + delivered_at: <%= DateTime.current.to_s %> + original_html: MyHtml + class: POSTING_CONFIRMATION + objects: + - name: form + mime_type: application/x-eform-xml + signed: false + class: FORM + content: Dummy + +ssd_delivery_report: + message_id: <%= SecureRandom.uuid %> + correlation_id: f932fd8b-c996-4eb8-ba6c-af7714ef4069 + edesk_message_id: 105 + delivered_at: <%= DateTime.current %> + edesk_class: ED_DELIVERY_REPORT + folder: ssd_one + payload: + message_id: <%= SecureRandom.uuid %> + subject: MySubject + sender_name: MySender + sender_uri: MySenderURI + recipient_name: MyRecipient + delivered_at: <%= DateTime.current.to_s %> + original_html: MyHtml + class: ED_DELIVERY_REPORT + objects: + - name: form + mime_type: application/x-eform-xml + signed: false + class: FORM + content: Dummy + +ssd_egov_document: + message_id: <%= SecureRandom.uuid %> + correlation_id: f932fd8b-c996-4eb8-ba6c-af7714ef4069 + edesk_message_id: 106 + delivered_at: <%= DateTime.current %> + edesk_class: EGOV_DOCUMENT + folder: ssd_one + payload: + message_id: <%= SecureRandom.uuid %> + subject: MySubject + sender_name: MySender + sender_uri: MySenderURI + recipient_name: MyRecipient + delivered_at: <%= DateTime.current.to_s %> + original_html: MyHtml + class: EGOV_DOCUMENT + objects: + - name: form + mime_type: application/x-eform-xml + signed: false + class: FORM + content: Dummy diff --git a/test/fixtures/tags.yml b/test/fixtures/tags.yml index 0754f3e3..f9de2845 100644 --- a/test/fixtures/tags.yml +++ b/test/fixtures/tags.yml @@ -44,6 +44,12 @@ ssd_everything: visible: false tenant: ssd +ssd_inbox: + name: Inbox + type: InboxTag + visible: false + tenant: ssd + ssd_signed_externally: name: SignedExternally type: SignedExternallyTag @@ -187,6 +193,12 @@ solver_everything: visible: false tenant: solver +solver_inbox: + name: Inbox + type: InboxTag + visible: false + tenant: solver + ssd_basic_user_drafts: name: Drafts-Basic user owner: basic @@ -240,6 +252,12 @@ accountants_everything: visible: false tenant: accountants +accountants_inbox: + name: Inbox + type: InboxTag + visible: false + tenant: accountants + accountants_signature_requested: name: Na podpis type: SignatureRequestedTag diff --git a/test/models/automation/rule_test.rb b/test/models/automation/rule_test.rb index ac53175a..df5c8d91 100644 --- a/test/models/automation/rule_test.rb +++ b/test/models/automation/rule_test.rb @@ -111,7 +111,7 @@ class Automation::RuleTest < ActiveSupport::TestCase test 'should not run an automation on message created outbox BooleanCondition, edesk_class MessageMetadataValueNotCondition UnassignMessageThreadTagAction if POSTING_CONFIRMATION delivered' do tag = tags(:ssd_done) message_thread = message_threads(:ssd_main_done) - govbox_message = govbox_messages(:ssd_posting_confirmation) + govbox_message = govbox_messages(:ssd_main_done_posting_confirmation) govbox_message.update_column(:correlation_id, 'd2d6ab13-347e-49f4-9c3b-0b8390430870') diff --git a/test/models/govbox/message_test.rb b/test/models/govbox/message_test.rb index b73a0776..f8c3de11 100644 --- a/test/models/govbox/message_test.rb +++ b/test/models/govbox/message_test.rb @@ -61,6 +61,34 @@ class Govbox::MessageTest < ActiveSupport::TestCase assert_equal message.recipient_name, "SSD main" end + test "#create_message_with_thread! should handle adding inbox tag to thread" do + Govbox::Message.create_message_with_thread!(govbox_messages(:ssd_egov_application)) + + message_thread = MessageThread.last + + # Inbox tag not added when outbox message processed + assert_not message_thread.tags.include?(tags(:ssd_inbox)) + + Govbox::Message.create_message_with_thread!(govbox_messages(:ssd_posting_confirmation)) + # Inbox tag not added when insignificant inbox message processed + assert_not message_thread.tags.include?(tags(:ssd_inbox)) + + Govbox::Message.create_message_with_thread!(govbox_messages(:ssd_delivery_report)) + # Inbox tag not added when another insignificant inbox message processed + assert_not message_thread.tags.include?(tags(:ssd_inbox)) + + # Outbox or insignificant messages are automatically marked read + assert message_thread.messages.reload.all?{|m| m.read?} + + Govbox::Message.create_message_with_thread!(govbox_messages(:ssd_egov_document)) + # Inbox tag is added when significant inbox message processed + assert message_thread.tags.include?(tags(:ssd_inbox)) + + # Significant inbox messages is marked unread + assert_not message_thread.messages.reload.all?{|m| m.read?} + assert_not message_thread.messages.last.read? + end + test "#create_message_with_thread! should include general agenda subject in message title" do govbox_message = govbox_messages(:ssd_general_agenda) From 1bf51337d9967bf8db4e511bcb789ee773b875d6 Mon Sep 17 00:00:00 2001 From: luciajanikova <19lucia99@gmail.com> Date: Thu, 6 Feb 2025 11:44:31 +0100 Subject: [PATCH 3/3] Change insignificant? method to significant? --- app/models/govbox/message.rb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/models/govbox/message.rb b/app/models/govbox/message.rb index 96d8389d..12bec93b 100644 --- a/app/models/govbox/message.rb +++ b/app/models/govbox/message.rb @@ -39,7 +39,7 @@ def self.create_message_with_thread!(govbox_message) title: message.metadata.dig("delivery_notification", "consignment", "subject").presence || message.title, delivered_at: govbox_message.delivered_at ) - message.thread.assign_tag(message.thread.tenant.inbox_tag) if !message.outbox? && !govbox_message.insignificant? + message.thread.assign_tag(message.thread.tenant.inbox_tag) if !message.outbox? && govbox_message.significant? message.save! @@ -67,15 +67,15 @@ def replyable? end def collapsed? - insignificant? + !significant? end def read? - folder.outbox? || insignificant? + folder.outbox? || !significant? end - def insignificant? - payload["class"].in?(INSIGNIFICANT_MESSAGE_CLASSES) + def significant? + !payload["class"].in?(INSIGNIFICANT_MESSAGE_CLASSES) end def delivery_notification