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] 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"