Skip to content

Commit

Permalink
Merge pull request demarches-simplifiees#9668 from adullact/feature-o…
Browse files Browse the repository at this point in the history
…uidou/admin_creation_delegation_commentaire_email_notification

Délégation de compte admin: notification par email à l'ajout d'un commentaire
  • Loading branch information
colinux authored Feb 2, 2024
2 parents ee167c0 + 6945e34 commit 4602407
Show file tree
Hide file tree
Showing 20 changed files with 160 additions and 35 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ def see_button
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
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ class GroupeGestionnaireController < AdministrateurController
before_action :retrieve_groupe_gestionnaire, only: [:show, :administrateurs, :gestionnaires, :commentaires, :create_commentaire]

def show
@unread_commentaires = current_administrateur.unread_commentaires?
end

def administrateurs
Expand All @@ -12,13 +13,20 @@ def gestionnaires
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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,18 @@ def index
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
Expand All @@ -27,6 +29,7 @@ def create
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
Expand Down
11 changes: 11 additions & 0 deletions app/mailers/groupe_gestionnaire_mailer.rb
Original file line number Diff line number Diff line change
@@ -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)
Expand Down Expand Up @@ -37,6 +38,16 @@ def notify_added_administrateurs(groupe_gestionnaire, added_administrateurs, cur
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
Expand Down
8 changes: 8 additions & 0 deletions app/models/administrateur.rb
Original file line number Diff line number Diff line change
Expand Up @@ -145,4 +145,12 @@ def zones
# 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
8 changes: 4 additions & 4 deletions app/models/gestionnaire.rb
Original file line number Diff line number Diff line change
Expand Up @@ -44,17 +44,17 @@ def unread_commentaires?(groupe_gestionnaire)
.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
Original file line number Diff line number Diff line change
Expand Up @@ -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 }
4 changes: 2 additions & 2 deletions app/views/administrateurs/groupe_gestionnaire/show.html.haml
Original file line number Diff line number Diff line change
Expand Up @@ -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)
8 changes: 0 additions & 8 deletions app/views/administrateurs/procedures/_main_menu.html.haml

This file was deleted.

Original file line number Diff line number Diff line change
@@ -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))
Original file line number Diff line number Diff line change
@@ -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'
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
%strong
= t('.do_not_reply_html', application_name: APPLICATION_NAME, sender_email: @sender_email)
Original file line number Diff line number Diff line change
@@ -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}
2 changes: 2 additions & 0 deletions config/locales/views/layouts/mailers/fr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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 <a href="mailto:%{sender_email}">mail</a>
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
class AddCommentaireSeenAtToAdministrateurs < ActiveRecord::Migration[7.0]
def change
add_column :administrateurs, :commentaire_seen_at, :datetime
end
end
19 changes: 10 additions & 9 deletions db/schema.rb
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@
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
Expand Down Expand Up @@ -97,14 +98,14 @@
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
t.inet "stored_ips", default: [], array: true
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

Expand Down Expand Up @@ -266,15 +267,15 @@

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", precision: nil
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
Expand Down Expand Up @@ -414,8 +415,8 @@
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

Expand Down Expand Up @@ -610,14 +611,14 @@
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", precision: nil
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"
Expand Down
17 changes: 17 additions & 0 deletions spec/mailers/groupe_gestionnaire_mailer_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -54,4 +54,21 @@
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
9 changes: 9 additions & 0 deletions spec/mailers/previews/groupe_gestionnaire_mailer_preview.rb
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,15 @@ def notify_added_administrateurs
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
Expand Down
51 changes: 51 additions & 0 deletions spec/models/administrateur_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -285,4 +285,55 @@
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
Loading

0 comments on commit 4602407

Please sign in to comment.