Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[FEATURE] Mettre à jour le contenu de l'email "Création de compte" (PIX-12924) #9417

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ const createAndReconcileUserToOrganizationLearner = async function (
password: payload.password,
campaignCode: payload['campaign-code'],
locale,
i18n: request.i18n,
});

return h.response().code(204);
Expand Down
26 changes: 9 additions & 17 deletions api/lib/domain/services/mail-service.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,7 @@ import { LOCALE } from '../../../src/shared/domain/constants.js';
import { tokenService } from '../../../src/shared/domain/services/token-service.js';
import { urlBuilder } from '../../../src/shared/infrastructure/utils/url-builder.js';
import { mailer } from '../../../src/shared/mail/infrastructure/services/mailer.js';
import enTranslations from '../../../translations/en.json' with { type: 'json' };
import frTranslations from '../../../translations/fr.json' with { type: 'json' };
import { es as esTranslations } from '../../../translations/index.js';
import nlTranslations from '../../../translations/nl.json' with { type: 'json' };
import * as translations from '../../../translations/index.js';
import { config } from '../../config.js';

const { ENGLISH_SPOKEN, FRENCH_FRANCE, FRENCH_SPOKEN, DUTCH_SPOKEN, SPANISH_SPOKEN } = LOCALE;
Expand Down Expand Up @@ -46,20 +43,14 @@ const PIX_HELPDESK_URL_INTERNATIONAL = {
fr: 'https://pix.org/fr/support',
nl: 'https://pix.org/nl-be/support',
};
const translations = {
en: enTranslations,
es: esTranslations,
fr: frTranslations,
nl: nlTranslations,
};

/**
* @param email
* @param locale
* @param redirectionUrl
* @returns {Promise<EmailingAttempt>}
*/
function sendAccountCreationEmail({ email, locale = FRENCH_FRANCE, token, redirectionUrl }) {
function sendAccountCreationEmail({ email, firstName, locale = FRENCH_FRANCE, token, redirectionUrl, i18n }) {
const mailerConfig = _getMailerConfig(locale);
const redirectUrl = redirectionUrl || mailerConfig.pixAppConnectionUrl;

Expand All @@ -70,6 +61,7 @@ function sendAccountCreationEmail({ email, locale = FRENCH_FRANCE, token, redire
helpdeskUrl: mailerConfig.helpdeskUrl,
displayNationalLogo: mailerConfig.displayNationalLogo,
...mailerConfig.translation['pix-account-creation-email'].params,
title: i18n.__({ phrase: 'pix-account-creation-email.params.title', locale }, { firstName }),
};
const pixName = mailerConfig.translation['email-sender-name']['pix-app'];
const accountCreationEmailSubject = mailerConfig.translation['pix-account-creation-email'].subject;
Expand Down Expand Up @@ -107,7 +99,7 @@ function sendCertificationResultEmail({
sessionId,
sessionDate: formattedSessionDate,
fr: {
...frTranslations['certification-result-email'].params,
...translations.fr['certification-result-email'].params,
homeName: PIX_HOME_NAME_FRENCH_FRANCE,
homeUrl: PIX_HOME_URL_FRENCH_FRANCE,
homeNameInternational: PIX_HOME_NAME_INTERNATIONAL,
Expand All @@ -116,7 +108,7 @@ function sendCertificationResultEmail({
link: `${link}?lang=fr`,
},
en: {
...enTranslations['certification-result-email'].params,
...translations.en['certification-result-email'].params,
homeName: PIX_HOME_NAME_INTERNATIONAL,
homeUrl: PIX_HOME_URL_INTERNATIONAL.en,
title: translate({ phrase: 'certification-result-email.title', locale: 'en' }, { sessionId }),
Expand All @@ -126,7 +118,7 @@ function sendCertificationResultEmail({

return mailer.sendEmail({
from: EMAIL_ADDRESS_NO_RESPONSE,
fromName: `${frTranslations['email-sender-name']['pix-app']} / ${enTranslations['email-sender-name']['pix-app']}`,
fromName: `${translations.fr['email-sender-name']['pix-app']} / ${translations.en['email-sender-name']['pix-app']}`,
to: email,
template: mailer.certificationResultTemplateId,
variables: templateVariables,
Expand Down Expand Up @@ -365,7 +357,7 @@ function sendVerificationCodeEmail({ code, email, locale = FRENCH_FRANCE, transl
function sendCpfEmail({ email, generatedFiles }) {
const options = {
from: EMAIL_ADDRESS_NO_RESPONSE,
fromName: frTranslations['email-sender-name']['pix-app'],
fromName: translations.fr['email-sender-name']['pix-app'],
to: email,
template: mailer.cpfEmailTemplateId,
variables: { generatedFiles },
Expand All @@ -379,7 +371,7 @@ function sendNotificationToCertificationCenterRefererForCleaResults({ email, ses

const options = {
from: EMAIL_ADDRESS_NO_RESPONSE,
fromName: frTranslations['email-sender-name']['pix-app'],
fromName: translations.fr['email-sender-name']['pix-app'],
to: email,
template: mailer.acquiredCleaResultTemplateId,
variables: { sessionId, sessionDate: formattedSessionDate },
Expand All @@ -391,7 +383,7 @@ function sendNotificationToCertificationCenterRefererForCleaResults({ email, ses
function sendNotificationToOrganizationMembersForTargetProfileDetached({ email, complementaryCertificationName }) {
const options = {
from: EMAIL_ADDRESS_NO_RESPONSE,
fromName: frTranslations['email-sender-name']['pix-app'],
fromName: translations.fr['email-sender-name']['pix-app'],
to: email,
template: mailer.targetProfileNotCertifiableTemplateId,
variables: { complementaryCertificationName },
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ const createAndReconcileUserToOrganizationLearner = async function ({
userService,
passwordValidator,
userValidator,
i18n,
}) {
const campaign = await campaignRepository.getByCode(campaignCode);
if (!campaign) {
Expand Down Expand Up @@ -83,7 +84,14 @@ const createAndReconcileUserToOrganizationLearner = async function ({
if (!isUsernameMode) {
const redirectionUrl = urlBuilder.getCampaignUrl(locale, campaignCode);
const token = await emailValidationDemandRepository.save(createdUser.id);
await mailService.sendAccountCreationEmail({ email: createdUser.email, locale, token, redirectionUrl });
await mailService.sendAccountCreationEmail({
email: createdUser.email,
firstName: createdUser.firstName,
locale,
token,
redirectionUrl,
i18n,
});
}
return createdUser;
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,7 @@ const save = async function (request, h, dependencies = { userSerializer, reques
password,
campaignCode,
localeFromHeader,
i18n: request.i18n,
});

return h.response(dependencies.userSerializer.serialize(savedUser)).created();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ const createUser = async function ({
userService,
userValidator,
passwordValidator,
i18n,
}) {
const isValid = await _validateData({
password,
Expand Down Expand Up @@ -70,9 +71,11 @@ const createUser = async function ({
const token = await emailValidationDemandRepository.save(savedUser.id);
await mailService.sendAccountCreationEmail({
email: savedUser.email,
firstName: savedUser.firstName,
locale: localeFromHeader,
token,
redirectionUrl,
i18n,
});

return savedUser;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { identityAccessManagementRoutes } from '../../../../src/identity-access-management/application/routes.js';
import * as i18nPlugin from '../../../../src/shared/infrastructure/plugins/i18n.js';
import { expect, HttpTestServer } from '../../../test-helper.js';

const routesUnderTest = identityAccessManagementRoutes[0];
Expand All @@ -8,6 +9,7 @@ describe('Integration | Identity Access Management | Application | Route | User'

beforeEach(async function () {
httpTestServer = new HttpTestServer();
await httpTestServer.register(i18nPlugin);
await httpTestServer.register(routesUnderTest);
});

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { User } from '../../../../../src/identity-access-management/domain/models/User.js';
import { usecases } from '../../../../../src/identity-access-management/domain/usecases/index.js';
import { expect } from '../../../../test-helper.js';
import { getI18n } from '../../../../tooling/i18n/i18n.js';

describe('Integration | Identity Access Management | Domain | UseCase | create-user', function () {
it('returns the saved user', async function () {
Expand All @@ -10,7 +11,7 @@ describe('Integration | Identity Access Management | Domain | UseCase | create-u
const password = 'P@ssW0rd';

// when
const savedUser = await usecases.createUser({ password, user });
const savedUser = await usecases.createUser({ password, user, i18n: getI18n() });

// then
expect(savedUser).to.be.instanceOf(User);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,7 @@ describe('Unit | Identity Access Management | Application | Controller | User',
password,
localeFromHeader,
campaignCode: null,
i18n: undefined,
};

dependencies.localeService.getCanonicalLocale.returns(localeFromCookie);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -469,9 +469,11 @@ describe('Unit | Identity Access Management | Domain | UseCase | create-user', f
// then
expect(mailService.sendAccountCreationEmail).to.have.been.calledWithExactly({
email: userEmail,
firstName: user.firstName,
locale: localeFromHeader,
token,
redirectionUrl: expectedRedirectionUrl,
i18n: undefined,
});
});

Expand Down Expand Up @@ -503,9 +505,11 @@ describe('Unit | Identity Access Management | Domain | UseCase | create-user', f
// then
expect(mailService.sendAccountCreationEmail).to.have.been.calledWithExactly({
email: userEmail,
firstName: user.firstName,
locale: localeFromHeader,
token,
redirectionUrl: expectedRedirectionUrl,
i18n: undefined,
});
});
});
Expand Down Expand Up @@ -539,9 +543,11 @@ describe('Unit | Identity Access Management | Domain | UseCase | create-user', f
// then
expect(mailService.sendAccountCreationEmail).to.have.been.calledWithExactly({
email: userEmail,
firstName: user.firstName,
locale: localeFromHeader,
token,
redirectionUrl: expectedRedirectionUrl,
i18n: undefined,
});
});
});
Expand Down Expand Up @@ -575,10 +581,12 @@ describe('Unit | Identity Access Management | Domain | UseCase | create-user', f
// then
expect(emailValidationDemandRepository.save).to.have.been.calledWith(userId);
expect(mailService.sendAccountCreationEmail).to.have.been.calledWith({
email: savedUser.email,
email: user.email,
firstName: user.firstName,
locale: localeFromHeader,
token,
redirectionUrl,
i18n: undefined,
});
expect(createdUser).to.deep.equal(savedUser);
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@ import * as userService from '../../../../src/shared/domain/services/user-servic
import * as passwordValidator from '../../../../src/shared/domain/validators/password-validator.js';
import * as userValidator from '../../../../src/shared/domain/validators/user-validator.js';
import { catchErr, databaseBuilder, expect } from '../../../test-helper.js';
import { getI18n } from '../../../tooling/i18n/i18n.js';

const i18n = getI18n();

describe('Integration | UseCases | create-and-reconcile-user-to-organization-learner', function () {
const pickUserAttributes = ['firstName', 'lastName', 'email', 'username', 'cgu'];
Expand Down Expand Up @@ -50,6 +53,7 @@ describe('Integration | UseCases | create-and-reconcile-user-to-organization-lea
obfuscationService,
userReconciliationService,
userService,
i18n,
});

// then
Expand Down Expand Up @@ -86,6 +90,7 @@ describe('Integration | UseCases | create-and-reconcile-user-to-organization-lea
obfuscationService,
userReconciliationService,
userService,
i18n,
});

// then
Expand Down Expand Up @@ -135,6 +140,7 @@ describe('Integration | UseCases | create-and-reconcile-user-to-organization-lea
obfuscationService,
userReconciliationService,
userService,
i18n,
});

// then
Expand Down Expand Up @@ -195,6 +201,7 @@ describe('Integration | UseCases | create-and-reconcile-user-to-organization-lea
userService,
passwordValidator,
userValidator,
i18n,
});

// then
Expand Down Expand Up @@ -238,6 +245,7 @@ describe('Integration | UseCases | create-and-reconcile-user-to-organization-lea
obfuscationService,
userReconciliationService,
userService,
i18n,
});

// then
Expand All @@ -258,6 +266,7 @@ describe('Integration | UseCases | create-and-reconcile-user-to-organization-lea
locale,
password,
userAttributes,
i18n,
});

// then
Expand Down Expand Up @@ -325,6 +334,7 @@ describe('Integration | UseCases | create-and-reconcile-user-to-organization-lea
obfuscationService,
userReconciliationService,
userService,
i18n,
});

// then
Expand Down Expand Up @@ -366,6 +376,7 @@ describe('Integration | UseCases | create-and-reconcile-user-to-organization-lea
userService,
passwordValidator,
userValidator,
i18n,
});

// then
Expand Down
Loading