From 05096d4c8f393f39e1160ee29fcb4e2eb5cc9634 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Loi=CC=88c=20Delmaire?= Date: Thu, 25 Jul 2024 19:10:57 +0200 Subject: [PATCH 1/7] Introduce APIParticulier::ReportersController --- .../api_particulier/reporters_controller.rb | 20 ++++++++ .../api_particulier/reporters/show.html.erb | 1 + config/credentials/test.yml.enc | 2 +- config/routes/api_particulier.rb | 2 +- .../api_particulier/reporters_spec.rb | 47 +++++++++++++++++++ 5 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 app/controllers/api_particulier/reporters_controller.rb create mode 100644 app/views/api_particulier/reporters/show.html.erb create mode 100644 spec/features/api_particulier/reporters_spec.rb diff --git a/app/controllers/api_particulier/reporters_controller.rb b/app/controllers/api_particulier/reporters_controller.rb new file mode 100644 index 000000000..4b55ec121 --- /dev/null +++ b/app/controllers/api_particulier/reporters_controller.rb @@ -0,0 +1,20 @@ +class APIParticulier::ReportersController < APIParticulier::AuthenticatedUsersController + def show + if reporters_config.exclude?(reporter_group) || reporters_config[reporter_group].exclude?(current_user.email) + redirect_to_root + return + end + + @datapasses_for_group_url = MetabaseEmbedService.new(487, { group: params[:id] }).url + end + + private + + def reporter_group + params[:id].to_sym + end + + def reporters_config + Rails.application.credentials.api_particulier_reporters + end +end diff --git a/app/views/api_particulier/reporters/show.html.erb b/app/views/api_particulier/reporters/show.html.erb new file mode 100644 index 000000000..c21f6204f --- /dev/null +++ b/app/views/api_particulier/reporters/show.html.erb @@ -0,0 +1 @@ +<%= render partial: 'shared/metabase', locals: { metabase_url: @datapasses_for_group_url } %> diff --git a/config/credentials/test.yml.enc b/config/credentials/test.yml.enc index 997d480be..c5c70969f 100644 --- a/config/credentials/test.yml.enc +++ b/config/credentials/test.yml.enc @@ -1 +1 @@ -lHp2jcmiXvV33gX7o71HcUGSGUsu5Cur7gmCB6egk/Z7JWFmKLmqqH6baCEWHUMAZGsF/6P5mho9hOuhnUb5x4bMYi9k9wBnGmj/lvR9IdNcHrjZEpzWbDIVISY3rKmvFK58XBitqZ77ajhrNgLn4i4qpNU/i5q6legfMv5mfk4AKN/+hMnApCf86mGpQT7vW8GTc5Vwy3q0nE2rYuIQxGKrwGzW6Jf68OWBA0+eSj+6ELGLu0wF6CnQHYZ5yFeS8MXHMvfjH5LLc3GVVSlwKygq+3g5s/2BPbRSr1rFN6hTBw7z7eGp81FhNnoslyc4anHND6jxP4XLjKRvExlzLxZr5iLN6UoDFdAPZ0YzEJusLVrW6LHpTOY5SmcrxeYR+CQuurbe+vRmlu4Ysrq19Byf80QQqv+mUrxnr8AxnJil79lgLJ72nHilEh/DII6GCFEm+/cbkpEIn7TOU2gcJVDHWa9w0LWEQm3PNvuOebReW8pDDb6VuuoCUB3vRC/qVMaYmKO6FNpGv0C8Apa7go4xDsbznCSzuWS3nLd05sKLFU5lZNeysZhqF/uzO83EXTUUZBXM/TjIunY9D74Z8wn6cctt3aNrH8sGhdIvd1/siyZqaV1xe2igsyktMRlkO6DxPd4fOWDxNJVsamoApg0ed4xScnJa3rdExrRAkQLx6LsP/PQjXZa6BjIRvltjQ31oRJr7GYxVG9wFE37Q3x9GNCPjEy0xoAL1gwce8jB9cJbuQmvRpGTK6zCa8nqwvckz8K+AwLTbLRVnwsAo9BP8KZpfa99qI11nGImCxCYSHjTxaAhlObcofsZJZeQmxtB47vdZXWqCazw0UnJg4ettS/wPDI9YwRPJYOzs2P2XyPZGAB7CDlkoE9yQg1UQSrjI66Rm2IUy88yOqRhLtwuhcYSofpFNcAqAghHi8xsT5kmKA1VG2ktzbbetcmGX0JdXq+n9KSkrXIoM7EfD3BaHVh7v5R/nPf21J840BBa9JQb8Lqwz22V2LU12rNNCkr5oIeDypzw4WFspgZ55wTWIfDvLd9lavROC/7E25AKS0FVUnb//F2gZJcLCi4bI9J9KVE5Cax7Np2PWFvQcLvi6+ZMvWt0gmJzP/G1j3nDzw2oFlZWgw2zrQWGidsmjX8X/4plaXKgqZtyXW51/GlnsqIN3hE6NnCBp3F+3KJmPGqAXakSkXRTQ7gmuIvlb3eA4u01D+QFBIVp5Dn5u7mO04cvhs4volbF1P5etuFtTQMZa997HJWs6JKbxbD5dXHirreWx1ePxysz0R3LP8YbBsrvT9lR8JFsC3t9xK3CZGtMsy9bmsazrt80csxlB+BsyBFyntO2wdhNpzaTNAgqmQOitv1xy8YkE5SaSqRitNlvxed8rZqfoE6L56wm0Zrt9OtJxe14SW3Wf+J8dLdZfkofS9qTg42M38uQDatHFnnrcsON0/w5qMcZ7dQ3Uh1+iZ8VtiCZk--ofXTPPvApMx26e85--KCiB/DR3eRUz/seUFc5fgA== \ No newline at end of file +tonkgh6Sc7Corqbt4DpG61lEEgMpniBzoq74Bp8yuSI+1sUZ9ceu7UdZyWvlKQfG2LpU6GSHsmKv5N9x4unJk+BS0A0AVEv81kxH8KLnUVMfwMp4uBceghzDzJTOYOGXNtxQgFxB9CwRJmHrCQMcwZ2wGWFPwDxRbTtJ7gUQWTD5Zdqf2jL0VREKtxQ7B5Ols6Y/Eacf/tQ3V6GjKXON6MkFIPs2YdMrnhau8mjJtGy3virbbSDlgJL03jMB40ipUFFd3dp0yuGI70LebIMCNMTZ43Wtypt+5EnsfkYdl17EkzLENyhu22of+3lNJwbx4fQJe1c+X4QmRDDhzRtjuTMohiEqXLsroucPw7Ae/4q3FMS/kCxPe5uGSLrUDvTWgmaQ8yuJkIgX42m7a+Gl7sVl/hn7hal5+APkNuWW7CWJNrnz3jgVwkYsWNQlqu9kDdWUc8yMWNqyux4BXyr2Aum718j0NDYtUdVjUKhEOWThMQ35VY8DjvilQO1L43dbMl9xkc++jV9a2m9snyvGMrbaxkgE0KS6GevSEFzfQ8FU3/GyKiZKyg2nNcrAyS7yoCdCHzvHsU9wxo99cjhth1nfvM40gWwwQyVGvVT7r7l47qBsSDV1IDQP6IHe7whlDGXPjApfvnmC2k/dUeZh2QXzS01Zj3RCjnbYRZ4zoGaMukn8r4VNjbPhgvZu6dhOwSTBi/s680lDaQZonUTjFB6RCl0q6T+RabIkNnFuk0/ZImdcCiwfweOfQtAlCVXoKjo2KnF3DeYI/cdE2Z88SivDGlkWm1j08xJuHmhTOg3NtiNbxDLtwKV0sMJILKcefWbSpDfW7+hwsa8QsMVQWDeci/O4OVei27wi7chblIF+pHsyjT1uSPrxHh+nSom+CWbJsIHZE8pGNpDRnkHSas54C+ocilSmhvPAYH7FYLHiaJc/nM0gE1uy//RfbMEhy08PQMnVZoKQuQfkwLjMvACW6fqgsS5MR/NKiCev9ZCB/fQrS+Agn0UAEfysiMGul9PenuPdhH1FQTM/M5F2gevaU/g52Z76srKXprYv6tJjrXRiS1expQI3oIO9kEhYC1kbMyAF1VXg/ix51dMKfaxKnv4Kv9a/n2TYsGuBxkeJ6llAr2qcJfWdszn9OyEP7070uIl9QopkPU73fqHqwSNKfguQpvbYuGjTCObQAZcgmnK6QIw2+BxOheV+5RWa14iXJsDgtljyxHzP4j3zFhw/Sy1H01k/22myTdO1jOh3JhR+/Qtn9tQegltqdtmJRsI5vtGlwVSp95hTg8CfNzwbKunqt3ytNUUkb8nbMuFRRY5KIhYnLpqgMYZ/SFDtuvSmgHRWgaRTGwqUiBkxLGGhPwNw0vPPxLaAHmQ1vq2cD8lzDEdgz3LbPDWYEPcxDSc2LaOpmPNQz7qnOHRz095OhZ4aY0bHkoq6TurdSNTtEv45nQBIot7zuc+hXy4ZiIpeBaP+Q3NgxAPou844iL4TZLlmnmqPGXUhLXWadjhwtaMslKgUbTaOUKP8jg1yGDW305P1c9bqVoyyEaWPtmpbkC4W4zaU6ERoALIsQSOuKo+9TEv6VYV8Wjv7HSzdLLDviR/9GWbbeN2sltpuv9TbZUWsHQImrfPfkE/lK645l/Zb5wXvVrEN8hkjZKDFbdSCEco5--DCJ+0i2AHh2fGr4H--yfGDk4WRVS8L0U0MIgM+sA== \ No newline at end of file diff --git a/config/routes/api_particulier.rb b/config/routes/api_particulier.rb index e459d4cb1..91412735e 100644 --- a/config/routes/api_particulier.rb +++ b/config/routes/api_particulier.rb @@ -73,6 +73,6 @@ get '/donnees_personnelles', to: 'pages#donnees_personnelles', as: :donnees_personnelles get '/accessibilite', to: 'pages#accessibility', as: :accessibilite - + get '/datapass/:id', to: 'reporters#show', as: :dashboard_reporter end end diff --git a/spec/features/api_particulier/reporters_spec.rb b/spec/features/api_particulier/reporters_spec.rb new file mode 100644 index 000000000..4965713a0 --- /dev/null +++ b/spec/features/api_particulier/reporters_spec.rb @@ -0,0 +1,47 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe 'API Particulier', app: :api_particulier do + subject(:visit_dashboard) do + visit api_particulier_dashboard_reporter_path(id:) + end + + before do + login_as(user) + end + + context 'with valid user and id' do + let(:id) { 'cnaf' } + let(:user) { create(:user, email: 'user@yopmail.com') } + + it 'renders metabase view' do + visit_dashboard + + expect(page).to have_current_path(api_particulier_dashboard_reporter_path(id:)) + expect(page.html).to include('metabase.entreprise.api.gouv.fr') + end + end + + context 'with invalid user' do + let(:id) { 'cnaf' } + let(:user) { create(:user, email: 'datapass@yopmail.com') } + + it 'redirects to root path' do + visit_dashboard + + expect(page).to have_current_path(root_path) + end + end + + context 'with invalid id' do + let(:id) { 'whatever' } + let(:user) { create(:user, email: 'user@yopmail.com') } + + it 'redirects to root path' do + visit_dashboard + + expect(page).to have_current_path(root_path) + end + end +end From 28ff196100317de7bbd86be3afd1187a35abf587 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Loi=CC=88c=20Delmaire?= Date: Thu, 25 Jul 2024 19:11:17 +0200 Subject: [PATCH 2/7] ReportersMailers for DataPass webhooks --- .../api_particulier/reporters_mailer.rb | 23 +++++++++++++++++++ .../reporters_mailer/approve.text.erb | 8 +++++++ .../reporters_mailer/submit.text.erb | 8 +++++++ config/i18n-tasks.yml | 2 ++ config/locales/mailers.fr.yml | 8 ++++++- .../api_particulier/reporters_mailer_spec.rb | 15 ++++++++++++ .../reporters_mailer_preview.rb | 16 +++++++++++++ 7 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 app/mailers/api_particulier/reporters_mailer.rb create mode 100644 app/views/api_particulier/reporters_mailer/approve.text.erb create mode 100644 app/views/api_particulier/reporters_mailer/submit.text.erb create mode 100644 spec/mailers/api_particulier/reporters_mailer_spec.rb create mode 100644 spec/mailers/previews/api_particulier/reporters_mailer_preview.rb diff --git a/app/mailers/api_particulier/reporters_mailer.rb b/app/mailers/api_particulier/reporters_mailer.rb new file mode 100644 index 000000000..799a72941 --- /dev/null +++ b/app/mailers/api_particulier/reporters_mailer.rb @@ -0,0 +1,23 @@ +class APIParticulier::ReportersMailer < APIParticulierMailer + %w[ + submit + approve + ].each do |event| + define_method(event) do + group = params[:group] + + return if reporters_config[group].blank? + + mail( + to: reporters_config[group], + subject: t('.subject', group:) + ) + end + end + + private + + def reporters_config + Rails.application.credentials.api_particulier_reporters + end +end diff --git a/app/views/api_particulier/reporters_mailer/approve.text.erb b/app/views/api_particulier/reporters_mailer/approve.text.erb new file mode 100644 index 000000000..5a772fe4a --- /dev/null +++ b/app/views/api_particulier/reporters_mailer/approve.text.erb @@ -0,0 +1,8 @@ +Bonjour, + +Une nouvelle demande vient d'être validée pour l'ensemble de données associé au groupe '<%= params[:group] %>'. + +Vous pouvez consulter la liste des demandes relatives aux données associé au groupe '<%= params[:group] %>' sur le lien suivant : <%= api_particulier_dashboard_reporter_url(id: params[:group]) %> + +Cordialement, +L'équipe API Particulier diff --git a/app/views/api_particulier/reporters_mailer/submit.text.erb b/app/views/api_particulier/reporters_mailer/submit.text.erb new file mode 100644 index 000000000..04e027205 --- /dev/null +++ b/app/views/api_particulier/reporters_mailer/submit.text.erb @@ -0,0 +1,8 @@ +Bonjour, + +Une nouvelle demande vient d'être déposée pour l'ensemble de données associé au groupe '<%= params[:group] %>'. + +Vous pouvez consulter la liste des demandes relatives aux données associé au groupe '<%= params[:group] %>' sur le lien suivant : <%= api_particulier_dashboard_reporter_url(id: params[:group]) %> + +Cordialement, +L'équipe API Particulier diff --git a/config/i18n-tasks.yml b/config/i18n-tasks.yml index e0ba9e339..62577c451 100644 --- a/config/i18n-tasks.yml +++ b/config/i18n-tasks.yml @@ -102,6 +102,7 @@ ignore_missing: - 'concerns.token_mailers_commons.*' - 'api_*.authorization_request_mailer.subject' - 'api_*.token_mailer.subject' + - 'api_particulier.reporters_mailer.*' # - 'errors.messages.{accepted,blank,invalid,too_short,too_long}' # - '{devise,simple_form}.*' @@ -124,6 +125,7 @@ ignore_unused: - 'api_{entreprise,particulier}.token_mailer.*' - 'api_{entreprise,particulier}.authorization_request_mailer.*' - 'api_{entreprise,particulier}.endpoints.show.error.record_not_found' + - 'api_particulier.reporters_mailer.*' # - 'activerecord.attributes.*' # - '{devise,kaminari,will_paginate}.*' # - 'simple_form.{yes,no}' diff --git a/config/locales/mailers.fr.yml b/config/locales/mailers.fr.yml index 5e71ba95a..d8328852e 100644 --- a/config/locales/mailers.fr.yml +++ b/config/locales/mailers.fr.yml @@ -29,7 +29,7 @@ fr: subject: 📬 Votre demande d'accès à l'API Entreprise a bien été reçue par nos services. reassurance_demande_recue: subject: ⚙️ Votre demande est en cours de traitement. - + update_embarquement_brouillon_en_attente: subject: 🔧 Besoin d'aide pour finaliser votre demande de mise à jour ? update_embarquement_demande_refusee: @@ -118,3 +118,9 @@ fr: subject: 🔑 Lien d'accès temporaire au jeton API Particulier signature: L'équipe API Particulier link_description: Un lien vers un jeton d'accès API Particulier vient d'être généré à votre intention. Vous pouvez accéder à ce jeton via le lien + + reporters_mailer: + submit: + subject: Une nouvelle demande a été déposé pour API Particulier pour le groupe de donnée %{group} + approve: + subject: Une nouvelle demande a été validé pour API Particulier pour le groupe de donnée %{group} diff --git a/spec/mailers/api_particulier/reporters_mailer_spec.rb b/spec/mailers/api_particulier/reporters_mailer_spec.rb new file mode 100644 index 000000000..a888f7bb6 --- /dev/null +++ b/spec/mailers/api_particulier/reporters_mailer_spec.rb @@ -0,0 +1,15 @@ +RSpec.describe APIParticulier::ReportersMailer do + before do + create(:user, email: 'user@yopmail.com') + end + + describe '#submit' do + subject(:mail) do + described_class.with(group: 'cnaf').submit + end + + it 'sends an email to reporters associated to this group' do + expect(mail.to).to include('user@yopmail.com') + end + end +end diff --git a/spec/mailers/previews/api_particulier/reporters_mailer_preview.rb b/spec/mailers/previews/api_particulier/reporters_mailer_preview.rb new file mode 100644 index 000000000..5055260af --- /dev/null +++ b/spec/mailers/previews/api_particulier/reporters_mailer_preview.rb @@ -0,0 +1,16 @@ +class APIParticulier::ReportersMailerPreview < ActionMailer::Preview + %w[ + submitted + validated + ].each do |event| + define_method(event) do + APIParticulier::ReportersMailer.with(group:).send(event) + end + end + + private + + def group + 'cnaf' + end +end From 4adffcca0b6979166ac8b963d78e1cb929e5d306 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Loi=CC=88c=20Delmaire?= Date: Thu, 25 Jul 2024 19:13:12 +0200 Subject: [PATCH 3/7] Introduce DatapassWebhook::APIParticulier::NotifyReporters --- .../api_particulier/notify_reporters.rb | 23 ++++++++ .../datapass_webhook/api_particulier.rb | 3 +- .../api_particulier/notify_reporters_spec.rb | 53 +++++++++++++++++++ 3 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 app/interactors/datapass_webhook/api_particulier/notify_reporters.rb create mode 100644 spec/interactors/datapass_webhook/api_particulier/notify_reporters_spec.rb diff --git a/app/interactors/datapass_webhook/api_particulier/notify_reporters.rb b/app/interactors/datapass_webhook/api_particulier/notify_reporters.rb new file mode 100644 index 000000000..fe3ce18bb --- /dev/null +++ b/app/interactors/datapass_webhook/api_particulier/notify_reporters.rb @@ -0,0 +1,23 @@ +class DatapassWebhook::APIParticulier::NotifyReporters < ApplicationInteractor + def call + return if %w[submit approve].exclude?(context.event) + + reporters_config.each_key do |group_name| + next unless scopes.any? { |scope| scope.start_with?("#{group_name}_") } + + APIParticulier::ReportersMailer.with(group: group_name).send(context.event).deliver_later + end + end + + private + + def reporters_config + Rails.application.credentials.api_particulier_reporters + end + + def scopes + context.data['pass']['scopes'].map { |code, bool| + code if bool + }.compact + end +end diff --git a/app/organizers/datapass_webhook/api_particulier.rb b/app/organizers/datapass_webhook/api_particulier.rb index b3ada3b70..0ff90188f 100644 --- a/app/organizers/datapass_webhook/api_particulier.rb +++ b/app/organizers/datapass_webhook/api_particulier.rb @@ -19,6 +19,7 @@ class APIParticulier < ApplicationOrganizer ::DatapassWebhook::RevokeCurrentToken, ::DatapassWebhook::UpdateMailjetContacts, ::DatapassWebhook::ExtractMailjetVariables, - ::DatapassWebhook::ScheduleAuthorizationRequestEmails + ::DatapassWebhook::ScheduleAuthorizationRequestEmails, + ::DatapassWebhook::APIParticulier::NotifyReporters end end diff --git a/spec/interactors/datapass_webhook/api_particulier/notify_reporters_spec.rb b/spec/interactors/datapass_webhook/api_particulier/notify_reporters_spec.rb new file mode 100644 index 000000000..541bcfe86 --- /dev/null +++ b/spec/interactors/datapass_webhook/api_particulier/notify_reporters_spec.rb @@ -0,0 +1,53 @@ +RSpec.describe DatapassWebhook::APIParticulier::NotifyReporters, type: :interactor do + include ActiveJob::TestHelper + + subject { described_class.call(datapass_webhook_params) } + + let(:datapass_webhook_params) do + build(:datapass_webhook, + event:, + authorization_request_attributes: { + scopes: + }) + end + let(:event) { 'approve' } + let(:scopes) { { 'cnaf_quotient_familial' => true } } + + describe 'reporters notification' do + describe 'when it is a submit event' do + let(:event) { 'submit' } + + context 'when authorization request has scopes from reporters group' do + let(:scopes) { { 'cnaf_quotient_familial' => true } } + + it { is_expected.to be_success } + + it 'notifies reporters' do + expect { + perform_enqueued_jobs do + subject + end + }.to change { ActionMailer::Base.deliveries.count }.by(1) + + mail = ActionMailer::Base.deliveries.last + + expect(mail.subject).to match(/Une nouvelle demande a été déposé pour API Particulier/) + end + + context 'when authorization request has no scopes from reporters group' do + let(:scopes) { { 'cnaf_quotient_familial' => false, 'whatever' => true } } + + it { is_expected.to be_success } + + it 'does not notify reporters' do + expect { + perform_enqueued_jobs do + subject + end + }.not_to change { ActionMailer::Base.deliveries.count } + end + end + end + end + end +end From 6289e550fcb64ecaf7dc65b73888999e628c189d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Loi=CC=88c=20Delmaire?= Date: Mon, 29 Jul 2024 17:45:20 +0200 Subject: [PATCH 4/7] Add all emails for reporters groups --- config/credentials/production.yml.enc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/credentials/production.yml.enc b/config/credentials/production.yml.enc index ac7109a30..0c63d438e 100644 --- a/config/credentials/production.yml.enc +++ b/config/credentials/production.yml.enc @@ -1 +1 @@ -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--wZkWHgUfL6lLzi0R--/f5HhUSn4ZFkcAzEAzHasg== \ No newline at end of file +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--hpa6kdxWs1vSDRAp--wzFaYuz1J8qtvz7H1rUiBQ== \ No newline at end of file From 10e9d2936ef3d0e620168a44ce80a0a0017d6390 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Loi=CC=88c=20Delmaire?= Date: Mon, 29 Jul 2024 18:29:09 +0200 Subject: [PATCH 5/7] APIParticulier::ReportersMailer: use bcc instead of to --- app/mailers/api_particulier/reporters_mailer.rb | 2 +- spec/mailers/api_particulier/reporters_mailer_spec.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/mailers/api_particulier/reporters_mailer.rb b/app/mailers/api_particulier/reporters_mailer.rb index 799a72941..cc39aac3c 100644 --- a/app/mailers/api_particulier/reporters_mailer.rb +++ b/app/mailers/api_particulier/reporters_mailer.rb @@ -9,7 +9,7 @@ class APIParticulier::ReportersMailer < APIParticulierMailer return if reporters_config[group].blank? mail( - to: reporters_config[group], + bcc: reporters_config[group], subject: t('.subject', group:) ) end diff --git a/spec/mailers/api_particulier/reporters_mailer_spec.rb b/spec/mailers/api_particulier/reporters_mailer_spec.rb index a888f7bb6..54bde96a9 100644 --- a/spec/mailers/api_particulier/reporters_mailer_spec.rb +++ b/spec/mailers/api_particulier/reporters_mailer_spec.rb @@ -9,7 +9,7 @@ end it 'sends an email to reporters associated to this group' do - expect(mail.to).to include('user@yopmail.com') + expect(mail.bcc).to include('user@yopmail.com') end end end From f7fb6b7979efe9b5a177b30cd16bbbd79edddefb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Loi=CC=88c=20Delmaire?= Date: Tue, 30 Jul 2024 09:54:18 +0200 Subject: [PATCH 6/7] API Particulier reporters: add a title to view --- app/views/api_particulier/reporters/show.html.erb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/views/api_particulier/reporters/show.html.erb b/app/views/api_particulier/reporters/show.html.erb index c21f6204f..5256ccc33 100644 --- a/app/views/api_particulier/reporters/show.html.erb +++ b/app/views/api_particulier/reporters/show.html.erb @@ -1 +1,4 @@ +

+ Habilitations liées aux données '<%= params[:id] %>' +

<%= render partial: 'shared/metabase', locals: { metabase_url: @datapasses_for_group_url } %> From b9bc624293924ea103e5c7df709589d7b2e7d515 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Loi=CC=88c=20Delmaire?= Date: Tue, 30 Jul 2024 09:56:31 +0200 Subject: [PATCH 7/7] Revert all reporters to one email For tests purpose --- config/credentials/production.yml.enc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/credentials/production.yml.enc b/config/credentials/production.yml.enc index 0c63d438e..f531f1a0e 100644 --- a/config/credentials/production.yml.enc +++ b/config/credentials/production.yml.enc @@ -1 +1 @@ -ZgdB4pnES5fG1JaVvkqjwHYJbu3UmC0zfMxLIEDqbsuqOsEl0IOGLWo6Ggyr/zxsQ49eyO5TeUdAUvmNl69WIiVUnAbehfo60Dqjma3zr7hBsV0PN2zPG1EKZOCJYFVumhjgtilQj+NsBpNnpZbR1bhI8D/iIlpgeiQLuyYpVCGbWOWREdFnWIIieJ/wg3ipUZKi3h0tAAbq+vqxi1TThF/qrRQqHHSCJTJWER4aYsp/6CaHuPBSqRYlbyb+7G10sre1rLHRVKRHRVZugGSk+VGuxDYzMI3W8peIfV+2Y3l8QpBv6fp4ksgU8waOas9e1JjwW2jrrNr0MzTogSO+SFHCDFMmhCuc23RrZ58t1y69GCaL8rbCHBaXD2a/J9EoFYEE6o0JhGWn9GTHZxoF+ZLN6qoDkRyWwMnJxo/KmDZTHAsmAIzu+iP1bL0ut/Z46FSLZ9+/RGncDGq92Yr5BaQk3VNoNoryWUtWv8lHnrDwMLpz1gBx2HYcn+b6XqjUnrcx/LB2T5Tbv3bnD4dGJFT7qq687wULsvIfWwVsjBAqVlBSFBHQDf0JMwnU+94YKBYO2SXUt2Umo5g9H0xmC+C/dFp+GNfQDsLd4ghAmeFyLBVvlNSFvFgL+CKoIS59AGl7VfjyiUNVofG4ZY0/qh47RIi31s1AHob/XH7M/tZhcz28sDL0yPYthdzOWvSjNjIrDSUp8RYtb4FrrqKpk58KvfIAYCLjH3N38mGeH3V+Y1BX/Zg9YI8Dcuw9IicnOv3+Pe98w1wmnB6coTgLsuw/a/akroyB/hDrbg0S4hFxK56SbIW2InqnZxJXYrzLJQQ5EI1wgb1ovlC1riZIxEXXNAIUVAkVtM6VZAJ09BEnATQKigTwHxawkPaHA2AL5L6w/XFR2pOmgGN1Y2B4GTYqnwAsEpVMh01ZBuk0RHxpTGW/z8cTKKnVJNO2R5GPuLUQ/0gXgP6GdHoMBZ+potv8GeGNZwsxTvhXDJf8rFdSCi/0n3V/m23hSIrwYwLufJsPLdES6xovX6DAMV6Cd3UMZa7KVxV3ycj+Bi4uc9A4QhZ1oQVEAvXSAiZBQa90LGi7AndCJgMCYyr9adHgVanbDHOSlF3t/UOQcUskGmJFlxycNLXrvQnvWZape8Qz6yucdf5OFkquLkPIk0/dSbcXZdDtCqWl9hpz6coEOEHu07A4+o8UF/gNJsMLHcOAzzlUlMs5flwX1QFtQjKHhDLb70J0pKURBUyK+ZKoZWCYInMF4R+37hY2y0mdYn5bMr3tAT2BgnFTysuErSvlg49Czugk6MJH49h9CDfzI/FR6ihZlac7FX7dKKuOpiwgC9V+MOZGrYnrAS0CpsLd1vPIyLV5D3p3H9/O0zaVwjmnPOdtMKbtCaKu/CNG3Pmz6pAfOQWKs/J92XFRhD06YVaXOIc5uFIzdq1tnwCmtuPK6Sf5RrOI7DSw8fb0EAY7TjL8kLJR1MS1LCpwr+VAmG0UHFpRDrs1v7Kf7I3P1Px+G01IHZg21yCJDUqXP1bQfsu/59WXdVe3oQ05ANOroU5YZs8d6PaZgz1rJ4o1fcgcX/bxheTGEPI2hWU08X4dvaUKHq8ZvW6HUcMVb9FpdQoD5iLej30VxyDEozFZ0ivqV8Cnu/PlWIMtV8ZaWiwGPBro95xkpJqquVirA+yItK1oY8ekaY6Galg/PWpbjKQCj3XfutixiQZLnLymQdOcD+nByIAPCLPxu8QxF6h1oP8REe59ligjnz0VrrSgF22p2zqAXtRKqPHsIP5nPCGGkqMl7pUvno7Q86VremhJIcc1XuBpPw98f6EGzyUm2niOZqQoEuq/ELYRm824w9/4p4HmIDNh/lptiZs+i48/MmDziinR854RrOXpEsb5kE/7P8FBhdImqR3U9CUoQE2rmxYWa5O2qAdKWnPkPVLtkAanRSlcTUy4568D3BD2oaUxcIiZoiUn0/o/4G8CWWijL/eSyOXpHQchZTPazi1usUau3wJr+Ut5cZOYy6iC7jwu1GxrWvD/oxdxn3u6fcnpuVELqgEulltGLJttY/CilV7/48yHjyyavmu5O3LT8CMOXz/Zy9HcWfRTX4ZJyJHIXgYjui/f0693gEL7+DLlUlg8iAUFumsTQtmjuS7BZdysMwL51TVsgskBEfNAHb3zj5aBW03j2Ihs119IFGJi5A+cXuUl+RjHmKp40WXJFexO33J9YnDnZcUAOPmrHPoumS3w9/xpn5HyxGECVXB1k3eZ/2hk4FwmlpbRll9y1QaCl0RODCxL2XK1aBudpW4mrCn9lfwgqLO7PcUvszdd77HgFvY2Ld4uLbFhJoUiDCn1NAfMXsbPI2eWEXkkMaL6Yf3OfwcEfgxyu+M7W7BpxoLs+M8JcMEeH0gmCMZ45tmmMvbF/gLmqrSGgUpShrsWwJ8Tj7Frb9sTgPLEAYWdJVTgkH1uMmsZ6RaOXCpXBP7xZC43RW01ijwgQWjZUqykSOVlg21hS+fe7dGOj15MlmKzQRaeYSHI3bur/2CU5i+2AbzFH32UCA5jsUMfA35bxgntSNt60mMiQJPZT3ia+XwIP9UUnNC18VJfJyOitg99KTY0DpuJDsAFn3kzvQYkH+ec2BilWHdU4vAfza9Ij70Fg5a3DNv6dMzFajqdfvH6hykHypwutVB4lT0TRn56vHcTArzd38NGHvr7Z3oH4lFN2zNR/iQDZ+Q447EDJ+fRg/xk+2dIJTeLzfWe8S7uucGifs+I8iYUC/7bqx/UTkHLJEFKCxAQzK8yD+srkR3JiCtLRE6gqGbzhd3R/zsRDJRC7j+oLMex1wOHNmUuBpe2AGuGAFudO4J798ZsyV9tMwMVn8sif1r3oev2sZsXRLImhtKjJtnwcIdW3PyEGrrxZdDbDMuU97sUkU+kt4QURG9wb9D0z0W97edlYWZIlIuTvsLGc03tSzbdOK2PKu0GXr3UCVyE9wkklMZi9UOjboVTfwhui8ThW4xw4B+4S6YpvGTXaxXZdLrh3k3JaQvjMh60sOyXkWLcqmtFnsY9Iwr1Bvn41Djtfh9bOzwarJX1+yug6DUWWPwcKdOfjWIznsBeZVPkFMbd0MqbKPI4laFAA/IQ4upjyRQxoiHJRew5KtcnADRCSBaQgaYVCH54Ls4b9M08so1h3dfvInsDKK1EoZGJ+UtQ8LVsRFbf8d1VP0TtWGEc86oCMOR6zwBKDXyf0qIhjrIbDrpaO1cmwhE07nZTgl7xlxUVLusaHP0gStDGV1pRKYRwtRYbkoCyGJg482wGoWkpZNmgQlprMjYd4tKtd/yTe9+JzMRozuMTcVy3q3DwbPo28f45L+S+VGm4d8dP8S67WoBr0ujEDrzWONhZvsnlinrvQHWCDE6tusirKN/kEBpTa5buTrk6x7X52ZDlK194T6kC0+tvT+Kv2ErxzipVlZLgbYZKl2RTy2a9zALx1geUA6LmH9ESut8Gfj57fGTLZiqVGLvFXUhAvMsojwwj1RcYGdIhk8m6PIVRfvnAtHVXDKjZXxSaMT1m1Q+kHyis//x85Wck8axCp6Fn/lXalR/mYZwES3BZIcuVoU/q973tNThTpmDA5Ds85SSKYZo+38NxeoJjseJUuDEFlXKVTv7pop66QTDuHBIswsj/F5jFkT8D6nkFJ3t7ir5+eVFjaDWdSTZamWpXAwbJ0UAOGU54FOqcYODVaSBJCbtnAwBc7ydscScDAwYWQrNwbFF0TXcq6/QuMDX81LQszhlA078sd+tRG8hM4T2hW5gxdWS4IAhtGZEdpGTC4ys1Wh+p4p73BLk/JEqXc+K1babj0GKI2r06fhfB5LghznLpY6JHPNtOA8KjaHEuyZk4czjdxOLrNSOZ0yStTgfhSzK+KvcOrPWctvDQRIKZXFa9vq+UTq4W8Ba7lTbvZ66hl1rvVO18pbJXj2/8luNrxjiU7XNHzZJOURLahM/3dKRv9Wpz/RBK8mA3CaJoclX0U5IrJAG4R53lsv97QCxcItcRBQUH01axYW4pgrm8PV2GX29CtAqZU00O7mHTessf1wcsf2phjajrNRPI68n3M5KNmkNprk1t2gMuKz5xRqCJyLNR6ZMKGI9uhv97tMLtFU6yD0j365P4nRAfJWHNCl7LKrTXl7bvlmQ8ERkU7ru3o9IoV9SKNIikQsMrjwHmcbFikGKXQYjgBVOHO7CBrLzDhER9vtLKbcb6icg=--hpa6kdxWs1vSDRAp--wzFaYuz1J8qtvz7H1rUiBQ== \ No newline at end of file +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--FO56xoX3UESfA+1w--PE0dYB1f5zklm7xitQ4Slw== \ No newline at end of file