From 46c19014f9fc043b9a38df27378c69636aa250b8 Mon Sep 17 00:00:00 2001 From: seb-by-ouidou Date: Mon, 6 Nov 2023 13:55:31 +0000 Subject: [PATCH 1/2] feat: notify administrateur and gestionnaire by email when new commentaire + for administrateur highlight card and commentaires if any unread --- .../commentaire_component.rb | 2 +- .../groupe_gestionnaire_controller.rb | 8 +++ ...pe_gestionnaire_commentaires_controller.rb | 9 ++-- app/mailers/groupe_gestionnaire_mailer.rb | 11 ++++ app/models/administrateur.rb | 8 +++ app/models/gestionnaire.rb | 8 +-- .../commentaires.html.haml | 2 +- .../groupe_gestionnaire/show.html.haml | 4 +- .../procedures/_main_menu.html.haml | 8 --- .../destroy.turbo_stream.haml | 2 +- ..._commentaire_groupe_gestionnaire.html.haml | 12 +++++ ...taire_groupe_gestionnaire_footer.html.haml | 2 + .../fr.yml | 4 ++ config/locales/views/layouts/mailers/fr.yml | 2 + ..._commentaire_seen_at_to_administrateurs.rb | 5 ++ db/schema.rb | 17 ++++--- .../groupe_gestionnaire_mailer_spec.rb | 17 +++++++ .../groupe_gestionnaire_mailer_preview.rb | 9 ++++ spec/models/administrateur_spec.rb | 51 +++++++++++++++++++ spec/models/gestionnaire_spec.rb | 12 ++--- 20 files changed, 159 insertions(+), 34 deletions(-) delete mode 100644 app/views/administrateurs/procedures/_main_menu.html.haml create mode 100644 app/views/groupe_gestionnaire_mailer/notify_new_commentaire_groupe_gestionnaire.html.haml create mode 100644 app/views/layouts/mailers/_commentaire_groupe_gestionnaire_footer.html.haml create mode 100644 config/locales/views/groupe_gestionnaire_mailer/notify_new_commentaire_groupe_gestionnaire/fr.yml create mode 100644 db/migrate/20231106104916_add_commentaire_seen_at_to_administrateurs.rb diff --git a/app/components/groupe_gestionnaire/groupe_gestionnaire_list_commentaires/commentaire_component.rb b/app/components/groupe_gestionnaire/groupe_gestionnaire_list_commentaires/commentaire_component.rb index 2ea54f48c..a4dcc1898 100644 --- a/app/components/groupe_gestionnaire/groupe_gestionnaire_list_commentaires/commentaire_component.rb +++ b/app/components/groupe_gestionnaire/groupe_gestionnaire_list_commentaires/commentaire_component.rb @@ -25,7 +25,7 @@ class GroupeGestionnaire::GroupeGestionnaireListCommentaires::CommentaireCompone end def highlight? - commentaire_seen_at = current_gestionnaire.commentaire_seen_at(@groupe_gestionnaire, @commentaire.sender) + commentaire_seen_at = current_gestionnaire.commentaire_seen_at(@groupe_gestionnaire, @commentaire.sender_id, @commentaire.sender_type) commentaire_seen_at.nil? || commentaire_seen_at < @commentaire.created_at end end diff --git a/app/controllers/administrateurs/groupe_gestionnaire_controller.rb b/app/controllers/administrateurs/groupe_gestionnaire_controller.rb index 6511f262e..0c927ade4 100644 --- a/app/controllers/administrateurs/groupe_gestionnaire_controller.rb +++ b/app/controllers/administrateurs/groupe_gestionnaire_controller.rb @@ -3,6 +3,7 @@ module Administrateurs before_action :retrieve_groupe_gestionnaire, only: [:show, :administrateurs, :gestionnaires, :commentaires, :create_commentaire] def show + @unread_commentaires = current_administrateur.unread_commentaires? end def administrateurs @@ -12,13 +13,20 @@ module Administrateurs end def commentaires + @commentaire_seen_at = current_administrateur.commentaire_seen_at @commentaire = CommentaireGroupeGestionnaire.new + current_administrateur.mark_commentaire_as_seen end def create_commentaire @commentaire = @groupe_gestionnaire.commentaire_groupe_gestionnaires.create(commentaire_params.merge(sender: current_administrateur)) if @commentaire.errors.empty? + commentaire_url = gestionnaire_groupe_gestionnaire_commentaire_url(@groupe_gestionnaire, @commentaire) + @groupe_gestionnaire.gestionnaires.each do |gestionnaire| + GroupeGestionnaireMailer.notify_new_commentaire_groupe_gestionnaire(@groupe_gestionnaire, @commentaire, @commentaire.sender_email, gestionnaire.email, commentaire_url).deliver_later + end + current_administrateur.mark_commentaire_as_seen flash.notice = "Message envoyé" redirect_to admin_groupe_gestionnaire_commentaires_path else diff --git a/app/controllers/gestionnaires/groupe_gestionnaire_commentaires_controller.rb b/app/controllers/gestionnaires/groupe_gestionnaire_commentaires_controller.rb index 2ddd7cfdb..1f8c40c57 100644 --- a/app/controllers/gestionnaires/groupe_gestionnaire_commentaires_controller.rb +++ b/app/controllers/gestionnaires/groupe_gestionnaire_commentaires_controller.rb @@ -7,16 +7,18 @@ module Gestionnaires end def show - @commentaire_seen_at = current_gestionnaire.commentaire_seen_at(@groupe_gestionnaire, @last_commentaire.sender) + @commentaire_seen_at = current_gestionnaire.commentaire_seen_at(@groupe_gestionnaire, @last_commentaire.sender_id, @last_commentaire.sender_type) @commentaire = CommentaireGroupeGestionnaire.new - current_gestionnaire.mark_commentaire_as_seen(@groupe_gestionnaire, @last_commentaire.sender) + current_gestionnaire.mark_commentaire_as_seen(@groupe_gestionnaire, @last_commentaire.sender_id, @last_commentaire.sender_type) end def create - @commentaire = @groupe_gestionnaire.commentaire_groupe_gestionnaires.create(commentaire_params.merge(sender: @last_commentaire.sender, gestionnaire: current_gestionnaire)) + @commentaire = @groupe_gestionnaire.commentaire_groupe_gestionnaires.create(commentaire_params.merge(sender_id: @last_commentaire.sender_id, sender_type: @last_commentaire.sender_type, gestionnaire: current_gestionnaire)) if @commentaire.errors.empty? + GroupeGestionnaireMailer.notify_new_commentaire_groupe_gestionnaire(@groupe_gestionnaire, @commentaire, current_gestionnaire.email, @commentaire.sender_email, admin_groupe_gestionnaire_commentaires_path).deliver_later flash.notice = "Message envoyé" + current_gestionnaire.mark_commentaire_as_seen(@groupe_gestionnaire, @commentaire.sender_id, @commentaire.sender_type) redirect_to gestionnaire_groupe_gestionnaire_commentaire_path(@groupe_gestionnaire, @commentaire) else flash.alert = @commentaire.errors.full_messages @@ -27,6 +29,7 @@ module Gestionnaires def destroy if @last_commentaire.soft_deletable?(current_gestionnaire) @last_commentaire.soft_delete! + @commentaire_seen_at = current_gestionnaire.commentaire_seen_at(@groupe_gestionnaire, @last_commentaire.sender_id, @last_commentaire.sender_type) flash.notice = t('.notice') else diff --git a/app/mailers/groupe_gestionnaire_mailer.rb b/app/mailers/groupe_gestionnaire_mailer.rb index ef1dcac23..1dc5f54bd 100644 --- a/app/mailers/groupe_gestionnaire_mailer.rb +++ b/app/mailers/groupe_gestionnaire_mailer.rb @@ -1,4 +1,5 @@ class GroupeGestionnaireMailer < ApplicationMailer + helper MailerHelper layout 'mailers/layout' def notify_removed_gestionnaire(groupe_gestionnaire, removed_gestionnaire_email, current_super_admin_email) @@ -37,6 +38,16 @@ class GroupeGestionnaireMailer < ApplicationMailer mail(bcc: added_administrateur_emails, subject: subject) end + def notify_new_commentaire_groupe_gestionnaire(groupe_gestionnaire, commentaire, sender_email, recipient_email, commentaire_url) + @groupe_gestionnaire = groupe_gestionnaire + @commentaire = commentaire + @sender_email = sender_email + @commentaire_url = commentaire_url + @subject = "Vous avez un nouveau message dans le groupe gestionnaire \"#{groupe_gestionnaire.name}\"" + + mail(to: recipient_email, subject: @subject) + end + def self.critical_email?(action_name) false end diff --git a/app/models/administrateur.rb b/app/models/administrateur.rb index f99d17c98..594e2b4a7 100644 --- a/app/models/administrateur.rb +++ b/app/models/administrateur.rb @@ -145,4 +145,12 @@ class Administrateur < ApplicationRecord # required to display feature flags field in manager def features end + + def unread_commentaires? + commentaire_seen_at.nil? || commentaire_seen_at < commentaire_groupe_gestionnaires.last.created_at + end + + def mark_commentaire_as_seen + update(commentaire_seen_at: Time.zone.now) + end end diff --git a/app/models/gestionnaire.rb b/app/models/gestionnaire.rb index 355659dea..6e57052f5 100644 --- a/app/models/gestionnaire.rb +++ b/app/models/gestionnaire.rb @@ -44,17 +44,17 @@ class Gestionnaire < ApplicationRecord .exists? end - def commentaire_seen_at(groupe_gestionnaire, sender) + def commentaire_seen_at(groupe_gestionnaire, sender_id, sender_type) FollowCommentaireGroupeGestionnaire - .where(gestionnaire: self, groupe_gestionnaire:, sender:) + .where(gestionnaire: self, groupe_gestionnaire:, sender_id:, sender_type:) .order(id: :desc) .last &.commentaire_seen_at end - def mark_commentaire_as_seen(groupe_gestionnaire, sender) + def mark_commentaire_as_seen(groupe_gestionnaire, sender_id, sender_type) FollowCommentaireGroupeGestionnaire - .where(gestionnaire: self, groupe_gestionnaire: groupe_gestionnaire, sender: sender, unfollowed_at: nil) + .where(gestionnaire: self, groupe_gestionnaire:, sender_id:, sender_type:, unfollowed_at: nil) .first_or_initialize.update(commentaire_seen_at: Time.zone.now) end end diff --git a/app/views/administrateurs/groupe_gestionnaire/commentaires.html.haml b/app/views/administrateurs/groupe_gestionnaire/commentaires.html.haml index 06fd68983..b95a9db5e 100644 --- a/app/views/administrateurs/groupe_gestionnaire/commentaires.html.haml +++ b/app/views/administrateurs/groupe_gestionnaire/commentaires.html.haml @@ -9,5 +9,5 @@ %ul.messages-list{ data: { controller: 'scroll-to' } } - current_administrateur.commentaire_groupe_gestionnaires.where(groupe_gestionnaire: @groupe_gestionnaire).each do |commentaire| %li.message{ class: commentaire_is_from_me_class(commentaire, current_administrateur), id: dom_id(commentaire) } - = render(GroupeGestionnaire::GroupeGestionnaireCommentaires::CommentaireComponent.new(commentaire: commentaire, connected_user: current_administrateur, is_gestionnaire: false)) + = render(GroupeGestionnaire::GroupeGestionnaireCommentaires::CommentaireComponent.new(commentaire: commentaire, connected_user: current_administrateur, is_gestionnaire: false, commentaire_seen_at: @commentaire_seen_at)) = render partial: "shared/groupe_gestionnaires/commentaires/form", locals: { commentaire: @commentaire, form_url: admin_groupe_gestionnaire_create_commentaire_path } diff --git a/app/views/administrateurs/groupe_gestionnaire/show.html.haml b/app/views/administrateurs/groupe_gestionnaire/show.html.haml index eebc4780a..9b4524bd2 100644 --- a/app/views/administrateurs/groupe_gestionnaire/show.html.haml +++ b/app/views/administrateurs/groupe_gestionnaire/show.html.haml @@ -4,7 +4,7 @@ .fr-container %h2= "Gestion du groupe gestionnaire \"#{@groupe_gestionnaire.name}\"" - .fr-grid-row.fr-grid-row--gutters.fr-mb-5w + .fr-grid-row.fr-grid-row--gutters.fr-mb-5w.fr-groupe_gestionnaire_cards = render GroupeGestionnaire::Card::GestionnairesComponent.new(groupe_gestionnaire: @groupe_gestionnaire, path: admin_groupe_gestionnaire_gestionnaires_path, is_gestionnaire: false) = render GroupeGestionnaire::Card::AdministrateursComponent.new(groupe_gestionnaire: @groupe_gestionnaire, path: admin_groupe_gestionnaire_administrateurs_path, is_gestionnaire: false) - = render GroupeGestionnaire::Card::CommentairesComponent.new(groupe_gestionnaire: @groupe_gestionnaire, administrateur: current_administrateur, path: admin_groupe_gestionnaire_commentaires_path) + = render GroupeGestionnaire::Card::CommentairesComponent.new(groupe_gestionnaire: @groupe_gestionnaire, administrateur: current_administrateur, path: admin_groupe_gestionnaire_commentaires_path, unread_commentaires: @unread_commentaires) diff --git a/app/views/administrateurs/procedures/_main_menu.html.haml b/app/views/administrateurs/procedures/_main_menu.html.haml deleted file mode 100644 index d34efdfbf..000000000 --- a/app/views/administrateurs/procedures/_main_menu.html.haml +++ /dev/null @@ -1,8 +0,0 @@ -.fr-container - %nav#header-navigation.fr-nav{ role: 'navigation', 'aria-label': 'Menu principal administrateur' } - %ul.fr-nav__list - %li.fr-nav__item= link_to 'Mes démarches', admin_procedures_path, class:'fr-nav__link', 'aria-current': current_page?(controller: 'procedures', action: :index) ? 'true' : nil - - if Rails.application.config.ds_zonage_enabled - %li.fr-nav__item= link_to 'Toutes les démarches', all_admin_procedures_path(zone_ids: current_administrateur.zones), class:'fr-nav__link', 'aria-current': current_page?(all_admin_procedures_path) ? 'page' : nil - - if current_administrateur.groupe_gestionnaire_id - %li.fr-nav__item= link_to 'Mon groupe gestionnaire', admin_groupe_gestionnaire_path, class:'fr-nav__link', 'aria-current': current_page?(admin_groupe_gestionnaire_path) ? 'page' : nil diff --git a/app/views/gestionnaires/groupe_gestionnaire_commentaires/destroy.turbo_stream.haml b/app/views/gestionnaires/groupe_gestionnaire_commentaires/destroy.turbo_stream.haml index cbf383795..96c22e9e3 100644 --- a/app/views/gestionnaires/groupe_gestionnaire_commentaires/destroy.turbo_stream.haml +++ b/app/views/gestionnaires/groupe_gestionnaire_commentaires/destroy.turbo_stream.haml @@ -1,3 +1,3 @@ - if @last_commentaire.discarded? = turbo_stream.update @last_commentaire do - = render(GroupeGestionnaire::GroupeGestionnaireCommentaires::CommentaireComponent.new(commentaire: @last_commentaire, connected_user: current_gestionnaire)) + = render(GroupeGestionnaire::GroupeGestionnaireCommentaires::CommentaireComponent.new(commentaire: @last_commentaire, connected_user: current_gestionnaire, commentaire_seen_at: @commentaire_seen_at)) diff --git a/app/views/groupe_gestionnaire_mailer/notify_new_commentaire_groupe_gestionnaire.html.haml b/app/views/groupe_gestionnaire_mailer/notify_new_commentaire_groupe_gestionnaire.html.haml new file mode 100644 index 000000000..b99ccf964 --- /dev/null +++ b/app/views/groupe_gestionnaire_mailer/notify_new_commentaire_groupe_gestionnaire.html.haml @@ -0,0 +1,12 @@ +- content_for(:title, "#{@subject}") + +%p= t(:hello, scope: [:views, :shared, :greetings]) + +%p + = t('.body', groupe_gestionnaire_name: @groupe_gestionnaire.name, sender_email: @sender_email) +%p= round_button("consulter le message", @commentaire_url, :primary) + += render partial: "layouts/mailers/signature" + +- content_for :footer do + = render 'layouts/mailers/commentaire_groupe_gestionnaire_footer' diff --git a/app/views/layouts/mailers/_commentaire_groupe_gestionnaire_footer.html.haml b/app/views/layouts/mailers/_commentaire_groupe_gestionnaire_footer.html.haml new file mode 100644 index 000000000..39c36de80 --- /dev/null +++ b/app/views/layouts/mailers/_commentaire_groupe_gestionnaire_footer.html.haml @@ -0,0 +1,2 @@ +%strong + = t('.do_not_reply_html', application_name: APPLICATION_NAME, sender_email: @sender_email) diff --git a/config/locales/views/groupe_gestionnaire_mailer/notify_new_commentaire_groupe_gestionnaire/fr.yml b/config/locales/views/groupe_gestionnaire_mailer/notify_new_commentaire_groupe_gestionnaire/fr.yml new file mode 100644 index 000000000..5dffa340d --- /dev/null +++ b/config/locales/views/groupe_gestionnaire_mailer/notify_new_commentaire_groupe_gestionnaire/fr.yml @@ -0,0 +1,4 @@ +fr: + groupe_gestionnaire_mailer: + notify_new_commentaire_groupe_gestionnaire: + body: Vous avez un nouveau message envoyé de la part de %{sender_email} dans la messagerie du groupe gestionnaire %{groupe_gestionnaire_name} diff --git a/config/locales/views/layouts/mailers/fr.yml b/config/locales/views/layouts/mailers/fr.yml index 0a23ca4e0..314d426f9 100644 --- a/config/locales/views/layouts/mailers/fr.yml +++ b/config/locales/views/layouts/mailers/fr.yml @@ -25,3 +25,5 @@ fr: accepte: a été accepté le %{processed_at}. refuse: a été refusé le %{processed_at}. sans_suite: a été classé sans suite le %{processed_at}. + commentaire_groupe_gestionnaire_footer: + do_not_reply_html: Merci de ne pas répondre à cet email. Consultez votre message sur %{application_name} ou contactez votre expéditeur par mail diff --git a/db/migrate/20231106104916_add_commentaire_seen_at_to_administrateurs.rb b/db/migrate/20231106104916_add_commentaire_seen_at_to_administrateurs.rb new file mode 100644 index 000000000..236a2a073 --- /dev/null +++ b/db/migrate/20231106104916_add_commentaire_seen_at_to_administrateurs.rb @@ -0,0 +1,5 @@ +class AddCommentaireSeenAtToAdministrateurs < ActiveRecord::Migration[7.0] + def change + add_column :administrateurs, :commentaire_seen_at, :datetime + end +end diff --git a/db/schema.rb b/db/schema.rb index 19982ebfc..d95129761 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -61,6 +61,7 @@ ActiveRecord::Schema[7.0].define(version: 2024_01_26_071130) do end create_table "administrateurs", id: :serial, force: :cascade do |t| + t.datetime "commentaire_seen_at" t.datetime "created_at", precision: nil t.bigint "groupe_gestionnaire_id" t.datetime "updated_at", precision: nil @@ -266,15 +267,15 @@ ActiveRecord::Schema[7.0].define(version: 2024_01_26_071130) do create_table "commentaire_groupe_gestionnaires", force: :cascade do |t| t.string "body" - t.datetime "created_at", precision: 6, null: false - t.datetime "discarded_at", precision: 6 + t.datetime "created_at", null: false + t.datetime "discarded_at" t.string "gestionnaire_email" t.bigint "gestionnaire_id" t.bigint "groupe_gestionnaire_id" t.string "sender_email" t.bigint "sender_id", null: false t.string "sender_type", null: false - t.datetime "updated_at", precision: 6, null: false + t.datetime "updated_at", null: false t.index ["gestionnaire_id"], name: "index_commentaire_groupe_gestionnaires_on_gestionnaire_id" t.index ["groupe_gestionnaire_id"], name: "index_commentaire_groupe_gestionnaires_on_groupe_gestionnaire" end @@ -414,8 +415,8 @@ ActiveRecord::Schema[7.0].define(version: 2024_01_26_071130) do create_table "dossier_transfers", force: :cascade do |t| t.datetime "created_at", null: false t.string "email", null: false - t.datetime "updated_at", null: false t.boolean "from_support", default: false, null: false + t.datetime "updated_at", null: false t.index ["email"], name: "index_dossier_transfers_on_email" end @@ -610,14 +611,14 @@ ActiveRecord::Schema[7.0].define(version: 2024_01_26_071130) do end create_table "follow_commentaire_groupe_gestionnaires", force: :cascade do |t| - t.datetime "commentaire_seen_at", precision: 6 - t.datetime "created_at", precision: 6, null: false + t.datetime "commentaire_seen_at" + t.datetime "created_at", null: false t.bigint "gestionnaire_id", null: false t.bigint "groupe_gestionnaire_id" t.bigint "sender_id" t.string "sender_type" - t.datetime "unfollowed_at", precision: 6, precision: nil - t.datetime "updated_at", precision: 6, null: false + t.datetime "unfollowed_at", precision: nil + t.datetime "updated_at", null: false t.index ["gestionnaire_id", "groupe_gestionnaire_id", "sender_id", "sender_type", "unfollowed_at"], name: "index_follow_commentaire_on_groupe_gestionnaire_unfollow", unique: true t.index ["gestionnaire_id"], name: "index_follow_commentaire_on_gestionnaire" t.index ["groupe_gestionnaire_id"], name: "index_follow_commentaire_on_groupe_gestionnaire" diff --git a/spec/mailers/groupe_gestionnaire_mailer_spec.rb b/spec/mailers/groupe_gestionnaire_mailer_spec.rb index 5fae5ce86..8076875ef 100644 --- a/spec/mailers/groupe_gestionnaire_mailer_spec.rb +++ b/spec/mailers/groupe_gestionnaire_mailer_spec.rb @@ -54,4 +54,21 @@ RSpec.describe GroupeGestionnaireMailer, type: :mailer do it { expect(subject.body).to include('Vous venez d’être nommé administrateur du groupe gestionnaire') } it { expect(subject.bcc).to match_array(['int3@g', 'int4@g']) } end + + describe '#notify_new_commentaire_groupe_gestionnaire' do + let(:groupe_gestionnaire) { create(:groupe_gestionnaire) } + + let(:gestionnaire) { create(:gestionnaire, email: 'int3@g') } + + let(:admin) { create(:administrateur, email: 'toto@email.com') } + + let(:commentaire) { create(:commentaire_groupe_gestionnaire, sender: admin) } + + let(:commentaire_url) { gestionnaire_groupe_gestionnaire_commentaire_url(groupe_gestionnaire, commentaire) } + + subject { described_class.notify_new_commentaire_groupe_gestionnaire(groupe_gestionnaire, commentaire, admin.email, gestionnaire.email, commentaire_url) } + + it { expect(subject.body).to include('Vous avez un nouveau message dans le groupe gestionnaire') } + it { expect(subject.to).to match_array(['int3@g']) } + end end diff --git a/spec/mailers/previews/groupe_gestionnaire_mailer_preview.rb b/spec/mailers/previews/groupe_gestionnaire_mailer_preview.rb index a5f6d5137..4a9ceb01e 100644 --- a/spec/mailers/previews/groupe_gestionnaire_mailer_preview.rb +++ b/spec/mailers/previews/groupe_gestionnaire_mailer_preview.rb @@ -27,6 +27,15 @@ class GroupeGestionnaireMailerPreview < ActionMailer::Preview GroupeGestionnaireMailer.notify_added_administrateurs(groupe_gestionnaire, administrateurs, current_super_admin_email) end + def notify_new_commentaire_groupe_gestionnaire + groupe_gestionnaire = GroupeGestionnaire.new(id: 1, name: 'un groupe gestionnaire') + commentaire = CommentaireGroupeGestionnaire.new(id: 1) + admin_email = 'admin@dgfip.com' + gestionnaire = Gestionnaire.new(user: user) + commentaire_url = Rails.application.routes.url_helpers.gestionnaire_groupe_gestionnaire_commentaire_url(groupe_gestionnaire, commentaire) + GroupeGestionnaireMailer.notify_new_commentaire_groupe_gestionnaire(groupe_gestionnaire, commentaire, admin_email, gestionnaire.email, commentaire_url) + end + private def user diff --git a/spec/models/administrateur_spec.rb b/spec/models/administrateur_spec.rb index 53b0ef59f..50d97976f 100644 --- a/spec/models/administrateur_spec.rb +++ b/spec/models/administrateur_spec.rb @@ -285,4 +285,55 @@ describe Administrateur, type: :model do expect(admin.zones).to eq [zone1, zone2] end end + + describe "#unread_commentaires?" do + context "commentaire_seen_at is nil" do + let(:gestionnaire) { create(:gestionnaire) } + let(:administrateur) { create(:administrateur) } + let(:groupe_gestionnaire) { create(:groupe_gestionnaire, gestionnaires: [gestionnaire]) } + let!(:commentaire_groupe_gestionnaire) { create(:commentaire_groupe_gestionnaire, groupe_gestionnaire: groupe_gestionnaire, sender: administrateur, gestionnaire: gestionnaire, created_at: 12.hours.ago) } + + it do + expect(administrateur.unread_commentaires?).to eq true + end + end + + context "commentaire_seen_at before last commentaire" do + let(:gestionnaire) { create(:gestionnaire) } + let(:administrateur) { create(:administrateur, commentaire_seen_at: 1.day.ago) } + let(:groupe_gestionnaire) { create(:groupe_gestionnaire, gestionnaires: [gestionnaire]) } + let!(:commentaire_groupe_gestionnaire) { create(:commentaire_groupe_gestionnaire, groupe_gestionnaire: groupe_gestionnaire, sender: administrateur, gestionnaire: gestionnaire, created_at: 12.hours.ago) } + + it do + expect(administrateur.unread_commentaires?).to eq true + end + end + + context "commentaire_seen_at after last commentaire" do + let(:gestionnaire) { create(:gestionnaire) } + let(:administrateur) { create(:administrateur, commentaire_seen_at: 1.hour.ago) } + let(:groupe_gestionnaire) { create(:groupe_gestionnaire, gestionnaires: [gestionnaire]) } + let!(:commentaire_groupe_gestionnaire) { create(:commentaire_groupe_gestionnaire, groupe_gestionnaire: groupe_gestionnaire, sender: administrateur, gestionnaire: gestionnaire, created_at: 12.hours.ago) } + + it do + expect(administrateur.unread_commentaires?).to eq false + end + end + end + + describe "#mark_commentaire_as_seen" do + let(:now) { Time.zone.now.beginning_of_minute } + let(:gestionnaire) { create(:gestionnaire) } + let(:administrateur) { create(:administrateur) } + let(:groupe_gestionnaire) { create(:groupe_gestionnaire, gestionnaires: [gestionnaire]) } + let!(:commentaire_groupe_gestionnaire) { create(:commentaire_groupe_gestionnaire, groupe_gestionnaire: groupe_gestionnaire, sender: administrateur, created_at: 12.hours.ago) } + + before do + Timecop.freeze(now) do + administrateur.mark_commentaire_as_seen + end + end + + it { expect(administrateur.commentaire_seen_at).to eq now } + end end diff --git a/spec/models/gestionnaire_spec.rb b/spec/models/gestionnaire_spec.rb index d26be8655..7fb5bbd2a 100644 --- a/spec/models/gestionnaire_spec.rb +++ b/spec/models/gestionnaire_spec.rb @@ -133,7 +133,7 @@ describe Gestionnaire, type: :model do let!(:commentaire_groupe_gestionnaire) { create(:commentaire_groupe_gestionnaire, groupe_gestionnaire: groupe_gestionnaire, sender: administrateur, created_at: 12.hours.ago) } let!(:follow_commentaire_groupe_gestionnaire) { create(:follow_commentaire_groupe_gestionnaire, groupe_gestionnaire: groupe_gestionnaire, gestionnaire: gestionnaire, sender: administrateur, commentaire_seen_at: Time.zone.now) } - it { expect(gestionnaire.commentaire_seen_at(groupe_gestionnaire, administrateur).to_date).to eq Date.current } + it { expect(gestionnaire.commentaire_seen_at(groupe_gestionnaire, administrateur.id, "Administrateur").to_date).to eq Date.current } end context "when never seen commentaire" do @@ -142,7 +142,7 @@ describe Gestionnaire, type: :model do let(:groupe_gestionnaire) { create(:groupe_gestionnaire, gestionnaires: [gestionnaire]) } let!(:commentaire_groupe_gestionnaire) { create(:commentaire_groupe_gestionnaire, groupe_gestionnaire: groupe_gestionnaire, sender: administrateur, created_at: 12.hours.ago) } - it { expect(gestionnaire.commentaire_seen_at(groupe_gestionnaire, administrateur)).to eq nil } + it { expect(gestionnaire.commentaire_seen_at(groupe_gestionnaire, administrateur.id, "Administrateur")).to eq nil } end end @@ -157,13 +157,13 @@ describe Gestionnaire, type: :model do subject do travel_to(now) do - gestionnaire.mark_commentaire_as_seen(groupe_gestionnaire, administrateur) + gestionnaire.mark_commentaire_as_seen(groupe_gestionnaire, administrateur.id, "Administrateur") end end it do subject - expect(gestionnaire.commentaire_seen_at(groupe_gestionnaire, administrateur)).to eq now + expect(gestionnaire.commentaire_seen_at(groupe_gestionnaire, administrateur.id, "Administrateur")).to eq now end end @@ -176,13 +176,13 @@ describe Gestionnaire, type: :model do subject do travel_to(now) do - gestionnaire.mark_commentaire_as_seen(groupe_gestionnaire, administrateur) + gestionnaire.mark_commentaire_as_seen(groupe_gestionnaire, administrateur.id, "Administrateur") end end it do subject - expect(gestionnaire.commentaire_seen_at(groupe_gestionnaire, administrateur)).to eq now + expect(gestionnaire.commentaire_seen_at(groupe_gestionnaire, administrateur.id, "Administrateur")).to eq now end end end From 6945e34a4abc6323ca5336dfcd7902dbdc3480ef Mon Sep 17 00:00:00 2001 From: Colin Darie Date: Fri, 2 Feb 2024 14:58:00 +0100 Subject: [PATCH 2/2] fix(schema): resync columns options for commentaires --- db/schema.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/db/schema.rb b/db/schema.rb index d95129761..f4dbdfedc 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -98,6 +98,7 @@ ActiveRecord::Schema[7.0].define(version: 2024_01_26_071130) do t.datetime "created_at", null: false t.string "encrypted_token", null: false t.date "expiration_notices_sent_at", default: [], array: true + t.date "expires_at" t.datetime "last_v1_authenticated_at" t.datetime "last_v2_authenticated_at" t.string "name", null: false @@ -105,7 +106,6 @@ ActiveRecord::Schema[7.0].define(version: 2024_01_26_071130) do t.datetime "updated_at", null: false t.integer "version", default: 3, null: false t.boolean "write_access", default: true, null: false - t.date "expires_at" t.index ["administrateur_id"], name: "index_api_tokens_on_administrateur_id" end @@ -268,7 +268,7 @@ ActiveRecord::Schema[7.0].define(version: 2024_01_26_071130) do create_table "commentaire_groupe_gestionnaires", force: :cascade do |t| t.string "body" t.datetime "created_at", null: false - t.datetime "discarded_at" + t.datetime "discarded_at", precision: nil t.string "gestionnaire_email" t.bigint "gestionnaire_id" t.bigint "groupe_gestionnaire_id" @@ -611,7 +611,7 @@ ActiveRecord::Schema[7.0].define(version: 2024_01_26_071130) do end create_table "follow_commentaire_groupe_gestionnaires", force: :cascade do |t| - t.datetime "commentaire_seen_at" + t.datetime "commentaire_seen_at", precision: nil t.datetime "created_at", null: false t.bigint "gestionnaire_id", null: false t.bigint "groupe_gestionnaire_id"