Skip to content

Commit

Permalink
[FEATURE] Mettre à jour le contenu de l'email "Création de compte" (P…
Browse files Browse the repository at this point in the history
  • Loading branch information
pix-service-auto-merge committed Jul 11, 2024
2 parents 8d6d820 + 0d8d6a1 commit e876876
Show file tree
Hide file tree
Showing 17 changed files with 214 additions and 47 deletions.
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

0 comments on commit e876876

Please sign in to comment.