From 9d840d91541c494fde563c71247c80bf6b5d3df9 Mon Sep 17 00:00:00 2001 From: Benjamin Levesque <14175665+benjlevesque@users.noreply.github.com> Date: Mon, 13 Jan 2025 12:30:58 +0100 Subject: [PATCH 1/7] =?UTF-8?q?=E2=9C=A8=20Consid=C3=A9rer=20les=20emails?= =?UTF-8?q?=20case-insensitive?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/candidature/attestation/attestation.saga.ts | 4 ++-- .../src/candidature/attestation/buildCertificate.ts | 6 +++--- .../subscribers/candidature/candidature.notification.ts | 5 ++++- .../p\303\251riode/p\303\251riode.notification.ts" | 2 +- packages/applications/request-context/src/convertToken.ts | 5 +++-- .../src/app/candidatures/[identifiant]/corriger/page.tsx | 2 +- .../d\303\251tails/D\303\251tailsCandidature.page.tsx" | 4 +++- .../d\303\251tails/D\303\251tailsCandidature.stories.tsx" | 4 ++-- .../pages/candidature/lister/CandidatureList.stories.tsx | 4 ++-- .../pages/candidature/lister/CandidatureListItem.tsx | 8 ++++---- .../src/consulter/consulterCandidature.query.ts | 4 ++-- .../src/importer/importerCandidature.behavior.ts | 6 +++--- .../src/importer/importerCandidature.command.ts | 2 +- .../src/importer/importerCandidature.usecase.ts | 2 +- .../candidature/src/lister/listerCandidatures.query.ts | 4 ++-- packages/domain/common/src/valueTypes/email.valueType.ts | 6 +++--- .../saga/abandonAccord\303\251.saga.ts" | 2 +- .../saga/laur\303\251atNotifi\303\251.saga.ts" | 2 +- .../utilisateur/src/identifiantUtilisateur.valueType.ts | 4 ++-- packages/domain/utilisateur/src/utilisateur.valueType.ts | 6 +++--- .../repr\303\251sentantL\303\251gal.when.ts" | 2 +- 21 files changed, 45 insertions(+), 39 deletions(-) diff --git a/packages/applications/document-builder/src/candidature/attestation/attestation.saga.ts b/packages/applications/document-builder/src/candidature/attestation/attestation.saga.ts index c3092c2799..5c34f2f09b 100644 --- a/packages/applications/document-builder/src/candidature/attestation/attestation.saga.ts +++ b/packages/applications/document-builder/src/candidature/attestation/attestation.saga.ts @@ -5,7 +5,7 @@ import { getLogger } from '@potentiel-libraries/monitoring'; import { Candidature } from '@potentiel-domain/candidature'; import { Option } from '@potentiel-libraries/monads'; import { AppelOffre } from '@potentiel-domain/appel-offre'; -import { IdentifiantProjet } from '@potentiel-domain/common'; +import { Email, IdentifiantProjet } from '@potentiel-domain/common'; import { buildCertificate, BuildCertificateProps } from './buildCertificate'; @@ -170,7 +170,7 @@ export const register = () => { const mapCorrectionToCandidature = ( payload: Candidature.CandidatureCorrigéeEvent['payload'], ): BuildCertificateProps['candidature'] => ({ - emailContact: payload.emailContact, + emailContact: Email.convertirEnValueType(payload.emailContact), evaluationCarboneSimplifiée: payload.evaluationCarboneSimplifiée, localité: payload.localité, nomCandidat: payload.nomCandidat, diff --git a/packages/applications/document-builder/src/candidature/attestation/buildCertificate.ts b/packages/applications/document-builder/src/candidature/attestation/buildCertificate.ts index 833d80dc45..c0dcf2aba6 100644 --- a/packages/applications/document-builder/src/candidature/attestation/buildCertificate.ts +++ b/packages/applications/document-builder/src/candidature/attestation/buildCertificate.ts @@ -3,7 +3,7 @@ import path from 'node:path'; import ReactPDF, { Font } from '@react-pdf/renderer'; import { AppelOffre } from '@potentiel-domain/appel-offre'; -import { DateTime, IdentifiantProjet } from '@potentiel-domain/common'; +import { DateTime, Email, IdentifiantProjet } from '@potentiel-domain/common'; import { Candidature } from '@potentiel-domain/candidature'; import { fontsFolderPath, imagesFolderPath } from '../../assets'; @@ -48,7 +48,7 @@ export type BuildCertificateProps = { }; nomCandidat: string; nomReprésentantLégal: string; - emailContact: string; + emailContact: Email.ValueType; puissanceProductionAnnuelle: number; prixReference: number; technologie: Candidature.TypeTechnologie.ValueType; @@ -133,7 +133,7 @@ const mapToCertificateData = ({ nomCandidat: candidature.nomCandidat, nomRepresentantLegal: candidature.nomReprésentantLégal, - email: candidature.emailContact, + email: candidature.emailContact.formatter(), evaluationCarbone: candidature.evaluationCarboneSimplifiée, prixReference: candidature.prixReference, diff --git a/packages/applications/notifications/src/subscribers/candidature/candidature.notification.ts b/packages/applications/notifications/src/subscribers/candidature/candidature.notification.ts index 802bb7ec8d..616b25a8a1 100644 --- a/packages/applications/notifications/src/subscribers/candidature/candidature.notification.ts +++ b/packages/applications/notifications/src/subscribers/candidature/candidature.notification.ts @@ -49,7 +49,10 @@ export const register = ({ sendEmail }: RegisterCandidatureNotificationDependenc templateId: templateId.attestationRegénéréePorteur, messageSubject: `Potentiel - Une nouvelle attestation est disponible pour le projet ${candidature.nomProjet}`, recipients: [ - { email: candidature.emailContact, fullName: candidature.nomReprésentantLégal }, + { + email: candidature.emailContact.formatter(), + fullName: candidature.nomReprésentantLégal, + }, ], variables: { nom_projet: candidature.nomProjet, diff --git "a/packages/applications/notifications/src/subscribers/p\303\251riode/p\303\251riode.notification.ts" "b/packages/applications/notifications/src/subscribers/p\303\251riode/p\303\251riode.notification.ts" index 0184ed9ee2..b7d56a68fa 100644 --- "a/packages/applications/notifications/src/subscribers/p\303\251riode/p\303\251riode.notification.ts" +++ "b/packages/applications/notifications/src/subscribers/p\303\251riode/p\303\251riode.notification.ts" @@ -109,7 +109,7 @@ async function getEmailPayloads( templateId: templateId.notifierPorteur, recipients: [ { - email, + email: email.formatter(), fullName, }, ], diff --git a/packages/applications/request-context/src/convertToken.ts b/packages/applications/request-context/src/convertToken.ts index 67c078bcef..7d82dcf004 100644 --- a/packages/applications/request-context/src/convertToken.ts +++ b/packages/applications/request-context/src/convertToken.ts @@ -2,8 +2,9 @@ import { z } from 'zod'; import { jwtVerify } from 'jose'; import { PlainType } from '@potentiel-domain/core'; -import { Role, Groupe, IdentifiantUtilisateur, Utilisateur } from '@potentiel-domain/utilisateur'; +import { Role, Groupe, Utilisateur } from '@potentiel-domain/utilisateur'; import { Option } from '@potentiel-libraries/monads'; +import { Email } from '@potentiel-domain/common'; import { getJwks } from './openid'; @@ -36,6 +37,6 @@ export const convertToken = async ( role: Role.convertirEnValueType(role ?? ''), groupe: groupe ? Groupe.convertirEnValueType(groupe) : Option.none, nom, - identifiantUtilisateur: IdentifiantUtilisateur.convertirEnValueType(email), + identifiantUtilisateur: Email.convertirEnValueType(email), }; }; diff --git a/packages/applications/ssr/src/app/candidatures/[identifiant]/corriger/page.tsx b/packages/applications/ssr/src/app/candidatures/[identifiant]/corriger/page.tsx index 5fe0f47672..34140e6e79 100644 --- a/packages/applications/ssr/src/app/candidatures/[identifiant]/corriger/page.tsx +++ b/packages/applications/ssr/src/app/candidatures/[identifiant]/corriger/page.tsx @@ -52,7 +52,7 @@ const mapToProps: MapToProps = (candidature) => ({ nomProjet: candidature.nomProjet, nomCandidat: candidature.nomCandidat, nomRepresentantLegal: candidature.nomReprésentantLégal, - emailContact: candidature.emailContact, + emailContact: candidature.emailContact.formatter(), puissanceProductionAnnuelle: candidature.puissanceProductionAnnuelle, prixReference: candidature.prixReference, societeMere: candidature.sociétéMère, diff --git "a/packages/applications/ssr/src/components/pages/candidature/d\303\251tails/D\303\251tailsCandidature.page.tsx" "b/packages/applications/ssr/src/components/pages/candidature/d\303\251tails/D\303\251tailsCandidature.page.tsx" index 2f7401a9a1..b24156fc23 100644 --- "a/packages/applications/ssr/src/components/pages/candidature/d\303\251tails/D\303\251tailsCandidature.page.tsx" +++ "b/packages/applications/ssr/src/components/pages/candidature/d\303\251tails/D\303\251tailsCandidature.page.tsx" @@ -142,7 +142,9 @@ export const DétailsCandidaturePage: FC = ({ {candidature.nomReprésentantLégal} - {candidature.emailContact} + + {candidature.emailContact.email} + diff --git "a/packages/applications/ssr/src/components/pages/candidature/d\303\251tails/D\303\251tailsCandidature.stories.tsx" "b/packages/applications/ssr/src/components/pages/candidature/d\303\251tails/D\303\251tailsCandidature.stories.tsx" index 40787b8dc6..fc5f87da71 100644 --- "a/packages/applications/ssr/src/components/pages/candidature/d\303\251tails/D\303\251tailsCandidature.stories.tsx" +++ "b/packages/applications/ssr/src/components/pages/candidature/d\303\251tails/D\303\251tailsCandidature.stories.tsx" @@ -25,7 +25,7 @@ export const CandidatureNonNotifiée: Story = { statut: Candidature.StatutCandidature.classé, nomProjet: 'Nom projet', nomCandidat: 'Candidat', - emailContact: 'porteur@test.test', + emailContact: Email.convertirEnValueType('porteur@test.test'), localité: { commune: 'Commune', département: 'Département', @@ -63,7 +63,7 @@ export const CandidatureNotifiée: Story = { statut: Candidature.StatutCandidature.classé, nomProjet: 'Nom projet', nomCandidat: 'Candidat', - emailContact: 'porteur@test.test', + emailContact: Email.convertirEnValueType('porteur@test.test'), localité: { commune: 'Commune', département: 'Département', diff --git a/packages/applications/ssr/src/components/pages/candidature/lister/CandidatureList.stories.tsx b/packages/applications/ssr/src/components/pages/candidature/lister/CandidatureList.stories.tsx index 5355b7b4c3..d8600a813a 100644 --- a/packages/applications/ssr/src/components/pages/candidature/lister/CandidatureList.stories.tsx +++ b/packages/applications/ssr/src/components/pages/candidature/lister/CandidatureList.stories.tsx @@ -1,6 +1,6 @@ import type { Meta, StoryObj } from '@storybook/react'; -import { IdentifiantProjet } from '@potentiel-domain/common'; +import { Email, IdentifiantProjet } from '@potentiel-domain/common'; import { Candidature } from '@potentiel-domain/candidature'; import { CandidatureListPage, CandidatureListPageProps } from './CandidatureList.page'; @@ -29,7 +29,7 @@ const commonItem: CommonItem = { statut: Candidature.StatutCandidature.classé, nomProjet: 'Nom projet', nomCandidat: 'Candidat', - emailContact: 'porteur@test.test', + emailContact: Email.convertirEnValueType('porteur@test.test'), localité: { commune: 'Commune', département: 'Département', diff --git a/packages/applications/ssr/src/components/pages/candidature/lister/CandidatureListItem.tsx b/packages/applications/ssr/src/components/pages/candidature/lister/CandidatureListItem.tsx index 4f2e65f433..d988237f7f 100644 --- a/packages/applications/ssr/src/components/pages/candidature/lister/CandidatureListItem.tsx +++ b/packages/applications/ssr/src/components/pages/candidature/lister/CandidatureListItem.tsx @@ -1,7 +1,7 @@ import { FC } from 'react'; import { PlainType } from '@potentiel-domain/core'; -import { IdentifiantProjet } from '@potentiel-domain/common'; +import { Email, IdentifiantProjet } from '@potentiel-domain/common'; import { Candidature } from '@potentiel-domain/candidature'; import { AppelOffre } from '@potentiel-domain/appel-offre'; @@ -21,7 +21,7 @@ export type CandidatureListItemProps = { nomProjet: Candidature.ConsulterCandidatureReadModel['nomProjet']; nomCandidat: Candidature.ConsulterCandidatureReadModel['nomCandidat']; nomReprésentantLégal: Candidature.ConsulterCandidatureReadModel['nomReprésentantLégal']; - emailContact: Candidature.ConsulterCandidatureReadModel['emailContact']; + emailContact: PlainType; puissanceProductionAnnuelle: Candidature.ConsulterCandidatureReadModel['puissanceProductionAnnuelle']; prixReference: Candidature.ConsulterCandidatureReadModel['prixReference']; evaluationCarboneSimplifiée: Candidature.ConsulterCandidatureReadModel['evaluationCarboneSimplifiée']; @@ -91,8 +91,8 @@ export const CandidatureListItem: FC = ({ />
{nomReprésentantLégal}
-
- {emailContact} +
+ {emailContact.email}
diff --git a/packages/domain/candidature/src/consulter/consulterCandidature.query.ts b/packages/domain/candidature/src/consulter/consulterCandidature.query.ts index a178b1db8f..db4f318911 100644 --- a/packages/domain/candidature/src/consulter/consulterCandidature.query.ts +++ b/packages/domain/candidature/src/consulter/consulterCandidature.query.ts @@ -27,7 +27,7 @@ export type ConsulterCandidatureReadModel = { }; nomCandidat: string; nomReprésentantLégal: string; - emailContact: string; + emailContact: Email.ValueType; puissanceProductionAnnuelle: number; prixReference: number; technologie: TypeTechnologie.ValueType; @@ -115,7 +115,7 @@ export const mapToReadModel = ({ localité, nomCandidat, nomReprésentantLégal, - emailContact, + emailContact: Email.convertirEnValueType(emailContact), puissanceProductionAnnuelle, prixReference, sociétéMère, diff --git a/packages/domain/candidature/src/importer/importerCandidature.behavior.ts b/packages/domain/candidature/src/importer/importerCandidature.behavior.ts index f91245ecc7..acca1804bb 100644 --- a/packages/domain/candidature/src/importer/importerCandidature.behavior.ts +++ b/packages/domain/candidature/src/importer/importerCandidature.behavior.ts @@ -30,7 +30,7 @@ export type CandidatureImportéeEventCommonPayload = { prixReference: number; noteTotale: number; nomReprésentantLégal: string; - emailContact: string; + emailContact: Email.RawType; localité: { adresse1: string; adresse2: string; @@ -70,7 +70,7 @@ export type ImporterCandidatureBehaviorCommonOptions = { prixReference: number; noteTotale: number; nomReprésentantLégal: string; - emailContact: string; + emailContact: Email.ValueType; localité: { adresse1: string; adresse2: string; @@ -194,7 +194,7 @@ export const mapToEventPayload = (candidature: ImporterCandidatureBehaviorCommon prixReference: candidature.prixReference, noteTotale: candidature.noteTotale, nomReprésentantLégal: candidature.nomReprésentantLégal, - emailContact: candidature.emailContact, + emailContact: candidature.emailContact.formatter(), localité: candidature.localité, motifÉlimination: candidature.motifÉlimination, puissanceALaPointe: candidature.puissanceALaPointe, diff --git a/packages/domain/candidature/src/importer/importerCandidature.command.ts b/packages/domain/candidature/src/importer/importerCandidature.command.ts index 4914c59b61..9d19fbeaf5 100644 --- a/packages/domain/candidature/src/importer/importerCandidature.command.ts +++ b/packages/domain/candidature/src/importer/importerCandidature.command.ts @@ -22,7 +22,7 @@ export type ImporterCandidatureCommandCommonOptions = { prixReference: number; noteTotale: number; nomReprésentantLégal: string; - emailContact: string; + emailContact: Email.ValueType; localité: { adresse1: string; adresse2: string; diff --git a/packages/domain/candidature/src/importer/importerCandidature.usecase.ts b/packages/domain/candidature/src/importer/importerCandidature.usecase.ts index 92f72deed9..50a54883a2 100644 --- a/packages/domain/candidature/src/importer/importerCandidature.usecase.ts +++ b/packages/domain/candidature/src/importer/importerCandidature.usecase.ts @@ -105,7 +105,7 @@ export const mapPayloadForCommand = (payload: ImporterCandidatureUseCaseCommonPa historiqueAbandon: HistoriqueAbandon.convertirEnValueType(payload.historiqueAbandonValue), nomProjet: payload.nomProjetValue, localité: payload.localitéValue, - emailContact: payload.emailContactValue, + emailContact: Email.convertirEnValueType(payload.emailContactValue), evaluationCarboneSimplifiée: payload.evaluationCarboneSimplifiéeValue, nomCandidat: payload.nomCandidatValue, nomReprésentantLégal: payload.nomReprésentantLégalValue, diff --git a/packages/domain/candidature/src/lister/listerCandidatures.query.ts b/packages/domain/candidature/src/lister/listerCandidatures.query.ts index b1353f471f..d01cb28581 100644 --- a/packages/domain/candidature/src/lister/listerCandidatures.query.ts +++ b/packages/domain/candidature/src/lister/listerCandidatures.query.ts @@ -1,7 +1,7 @@ import { Message, MessageHandler, mediator } from 'mediateur'; import { List, RangeOptions, Where } from '@potentiel-domain/entity'; -import { IdentifiantProjet } from '@potentiel-domain/common'; +import { Email, IdentifiantProjet } from '@potentiel-domain/common'; import { DocumentProjet } from '@potentiel-domain/document'; import * as StatutCandidature from '../statutCandidature.valueType'; @@ -120,7 +120,7 @@ export const mapToReadModel = ({ nomProjet, nomCandidat, nomReprésentantLégal, - emailContact, + emailContact: Email.convertirEnValueType(emailContact), puissanceProductionAnnuelle, prixReference, evaluationCarboneSimplifiée, diff --git a/packages/domain/common/src/valueTypes/email.valueType.ts b/packages/domain/common/src/valueTypes/email.valueType.ts index 3d3d039757..9519e9baf6 100644 --- a/packages/domain/common/src/valueTypes/email.valueType.ts +++ b/packages/domain/common/src/valueTypes/email.valueType.ts @@ -22,13 +22,13 @@ export const bind = ({ email }: PlainType): ValueType => { export const convertirEnValueType = (value: string): ValueType => { return bind({ - email: value, + email: value?.toLowerCase(), }); }; -const regexEmail = /^[a-zA-Z0-9.+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/; +const regexEmail = /^[a-z0-9.+/=?^_`{|}~-]+@[a-z0-9-]+(?:\.[a-z0-9-]+)*$/; -export const system = () => convertirEnValueType('system@system'); +export const system = convertirEnValueType('system@system'); function estValide(value: string): asserts value is RawType { const isValid = regexEmail.test(value); diff --git "a/packages/domain/laur\303\251at/src/repr\303\251sentantL\303\251gal/saga/abandonAccord\303\251.saga.ts" "b/packages/domain/laur\303\251at/src/repr\303\251sentantL\303\251gal/saga/abandonAccord\303\251.saga.ts" index a3b714f065..efc90adb40 100644 --- "a/packages/domain/laur\303\251at/src/repr\303\251sentantL\303\251gal/saga/abandonAccord\303\251.saga.ts" +++ "b/packages/domain/laur\303\251at/src/repr\303\251sentantL\303\251gal/saga/abandonAccord\303\251.saga.ts" @@ -15,7 +15,7 @@ export const abandonAccordéSaga = async ({ payload }: AbandonAccordéEvent) => type: 'Lauréat.ReprésentantLégal.Command.SupprimerChangementReprésentantLégal', data: { identifiantProjet, - identifiantUtilisateur: Email.system(), + identifiantUtilisateur: Email.system, dateSuppression: DateTime.now(), }, }); diff --git "a/packages/domain/laur\303\251at/src/repr\303\251sentantL\303\251gal/saga/laur\303\251atNotifi\303\251.saga.ts" "b/packages/domain/laur\303\251at/src/repr\303\251sentantL\303\251gal/saga/laur\303\251atNotifi\303\251.saga.ts" index 913088294c..964c2cc2f1 100644 --- "a/packages/domain/laur\303\251at/src/repr\303\251sentantL\303\251gal/saga/laur\303\251atNotifi\303\251.saga.ts" +++ "b/packages/domain/laur\303\251at/src/repr\303\251sentantL\303\251gal/saga/laur\303\251atNotifi\303\251.saga.ts" @@ -13,6 +13,6 @@ export const lauréatNotifiéSaga = async ({ data: { identifiantProjet: IdentifiantProjet.convertirEnValueType(identifiantProjet), importéLe: DateTime.convertirEnValueType(notifiéLe), - importéPar: Email.system(), + importéPar: Email.system, }, }); diff --git a/packages/domain/utilisateur/src/identifiantUtilisateur.valueType.ts b/packages/domain/utilisateur/src/identifiantUtilisateur.valueType.ts index 21f9950ee9..466260bd2b 100644 --- a/packages/domain/utilisateur/src/identifiantUtilisateur.valueType.ts +++ b/packages/domain/utilisateur/src/identifiantUtilisateur.valueType.ts @@ -34,14 +34,14 @@ export const bind = ({ email }: PlainType): ValueType => { */ export const convertirEnValueType = (value: string): ValueType => { return bind({ - email: value, + email: value?.toLowerCase(), }); }; /** * @deprecated Use potentiel-domain/common Email ValueType instead */ -const regexEmail = /^[a-zA-Z0-9.+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/; +const regexEmail = /^[a-z0-9.+/=?^_`{|}~-]+@[a-z0-9-]+(?:\.[a-z0-9-]+)*$/; /** * @deprecated Use potentiel-domain/common Email ValueType instead diff --git a/packages/domain/utilisateur/src/utilisateur.valueType.ts b/packages/domain/utilisateur/src/utilisateur.valueType.ts index 9322dc8302..b1db68441c 100644 --- a/packages/domain/utilisateur/src/utilisateur.valueType.ts +++ b/packages/domain/utilisateur/src/utilisateur.valueType.ts @@ -1,13 +1,13 @@ import { PlainType, ReadonlyValueType } from '@potentiel-domain/core'; import { Option } from '@potentiel-libraries/monads'; +import { Email } from '@potentiel-domain/common'; import * as Role from './role.valueType'; import * as Groupe from './groupe.valueType'; -import * as IdentifiantUtilisateur from './identifiantUtilisateur.valueType'; export type ValueType = ReadonlyValueType<{ nom: string; - identifiantUtilisateur: IdentifiantUtilisateur.ValueType; + identifiantUtilisateur: Email.ValueType; role: Role.ValueType; groupe: Option.Type; }>; @@ -18,7 +18,7 @@ export const bind = ({ groupe, role, }: PlainType): ValueType => { - const _identifiantUtilisateur = IdentifiantUtilisateur.bind(identifiantUtilisateur); + const _identifiantUtilisateur = Email.bind(identifiantUtilisateur); return { nom, role: Role.bind(role), diff --git "a/packages/specifications/src/projet/laur\303\251at/repr\303\251sentant-l\303\251gal/stepDefinitions/repr\303\251sentantL\303\251gal.when.ts" "b/packages/specifications/src/projet/laur\303\251at/repr\303\251sentant-l\303\251gal/stepDefinitions/repr\303\251sentantL\303\251gal.when.ts" index ce23a6044d..1f5b7697f7 100644 --- "a/packages/specifications/src/projet/laur\303\251at/repr\303\251sentant-l\303\251gal/stepDefinitions/repr\303\251sentantL\303\251gal.when.ts" +++ "b/packages/specifications/src/projet/laur\303\251at/repr\303\251sentant-l\303\251gal/stepDefinitions/repr\303\251sentantL\303\251gal.when.ts" @@ -19,7 +19,7 @@ Quand( data: { identifiantProjet: IdentifiantProjet.convertirEnValueType(identifiantProjet), importéLe: DateTime.convertirEnValueType(importéLe), - importéPar: Email.system(), + importéPar: Email.system, }, }); } catch (error) { From 22619c3bec823ac1df3772bdab5297bb66e35f0d Mon Sep 17 00:00:00 2001 From: Benjamin Levesque <14175665+benjlevesque@users.noreply.github.com> Date: Mon, 13 Jan 2025 17:40:14 +0100 Subject: [PATCH 2/7] =?UTF-8?q?=E2=9C=85=20Tests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../specifications/src/candidature/candidature.world.ts | 4 ++-- .../specifications/src/notification/notification.world.ts | 6 ++++-- .../specifications/src/utilisateur/fixtures/utilisateur.ts | 4 +++- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/specifications/src/candidature/candidature.world.ts b/packages/specifications/src/candidature/candidature.world.ts index 34d60f2f25..fc33e9a076 100644 --- a/packages/specifications/src/candidature/candidature.world.ts +++ b/packages/specifications/src/candidature/candidature.world.ts @@ -1,5 +1,5 @@ import { Candidature } from '@potentiel-domain/candidature'; -import { DateTime, IdentifiantProjet } from '@potentiel-domain/common'; +import { DateTime, Email, IdentifiantProjet } from '@potentiel-domain/common'; import { DocumentProjet } from '@potentiel-domain/document'; import { CorrigerCandidatureFixture } from './fixtures/corrigerCandidature.fixture'; @@ -91,7 +91,7 @@ export class CandidatureWorld { dateÉchéanceGf: expectedValues.dateÉchéanceGfValue ? DateTime.convertirEnValueType(expectedValues.dateÉchéanceGfValue) : undefined, - emailContact: expectedValues.emailContactValue, + emailContact: Email.convertirEnValueType(expectedValues.emailContactValue.toLowerCase()), evaluationCarboneSimplifiée: expectedValues.evaluationCarboneSimplifiéeValue, historiqueAbandon: Candidature.HistoriqueAbandon.convertirEnValueType( expectedValues.historiqueAbandonValue, diff --git a/packages/specifications/src/notification/notification.world.ts b/packages/specifications/src/notification/notification.world.ts index ee008e9250..cec321fe25 100644 --- a/packages/specifications/src/notification/notification.world.ts +++ b/packages/specifications/src/notification/notification.world.ts @@ -1,6 +1,7 @@ import { assert } from 'chai'; import { EmailPayload } from '@potentiel-applications/notifications'; +import { Email } from '@potentiel-domain/common'; export class NotificationWorld { #notifications: EmailPayload[] = []; @@ -9,10 +10,11 @@ export class NotificationWorld { this.#notifications.push(notification); } - récupérerNotification(email: string, sujet?: string) { + récupérerNotification(emailValue: string, sujet?: string) { + const email = Email.convertirEnValueType(emailValue); const notif = this.#notifications.find( (notif) => - notif.recipients.find((r) => r.email === email) && + notif.recipients.find((r) => Email.convertirEnValueType(r.email).estÉgaleÀ(email)) && (!sujet || notif.messageSubject.match(new RegExp(sujet))), ); assert(notif, 'Pas de notification'); diff --git a/packages/specifications/src/utilisateur/fixtures/utilisateur.ts b/packages/specifications/src/utilisateur/fixtures/utilisateur.ts index 00f10b71bb..91595ce066 100644 --- a/packages/specifications/src/utilisateur/fixtures/utilisateur.ts +++ b/packages/specifications/src/utilisateur/fixtures/utilisateur.ts @@ -1,5 +1,7 @@ import { faker } from '@faker-js/faker'; +import { Email } from '@potentiel-domain/common'; + export interface Utilisateur { id: string; email: string; @@ -39,7 +41,7 @@ export abstract class AbstractUtilisateur implements Utilisateur { protected créer(partial?: Partial'>>>): Readonly { const utilisateur: Utilisateur = { - email: faker.internet.email(), + email: Email.convertirEnValueType(faker.internet.email()).formatter(), nom: faker.person.fullName(), id: faker.string.uuid(), ...partial, From a1a8abf0c2e51bdc0e299d826869f82faa153af2 Mon Sep 17 00:00:00 2001 From: Benjamin Levesque <14175665+benjlevesque@users.noreply.github.com> Date: Wed, 15 Jan 2025 16:44:12 +0100 Subject: [PATCH 3/7] =?UTF-8?q?=F0=9F=94=80=20Merge?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../changemementRepr\303\251sentantL\303\251gal.when.ts" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/packages/specifications/src/projet/laur\303\251at/repr\303\251sentant-l\303\251gal/changement/stepDefinitions/changemementRepr\303\251sentantL\303\251gal.when.ts" "b/packages/specifications/src/projet/laur\303\251at/repr\303\251sentant-l\303\251gal/changement/stepDefinitions/changemementRepr\303\251sentantL\303\251gal.when.ts" index 4b6ec6b7f0..0fdfeb1666 100644 --- "a/packages/specifications/src/projet/laur\303\251at/repr\303\251sentant-l\303\251gal/changement/stepDefinitions/changemementRepr\303\251sentantL\303\251gal.when.ts" +++ "b/packages/specifications/src/projet/laur\303\251at/repr\303\251sentant-l\303\251gal/changement/stepDefinitions/changemementRepr\303\251sentantL\303\251gal.when.ts" @@ -273,7 +273,7 @@ async function instruireAutomatiquementChangement( if (instruction === 'accord') { this.lauréatWorld.représentantLégalWorld.changementReprésentantLégalWorld.accorderChangementReprésentantLégalFixture.créer( { - accordéePar: Email.system().formatter(), + accordéePar: Email.system.formatter(), nomReprésentantLégal: this.lauréatWorld.représentantLégalWorld.changementReprésentantLégalWorld .demanderChangementReprésentantLégalFixture.nomReprésentantLégal, @@ -286,7 +286,7 @@ async function instruireAutomatiquementChangement( this.lauréatWorld.représentantLégalWorld.changementReprésentantLégalWorld.rejeterChangementReprésentantLégalFixture.créer( { motif: 'Rejet automatique', - rejetéPar: Email.system().formatter(), + rejetéPar: Email.system.formatter(), }, ); } From 158aeb1f857f7c30ca46b54d7b44b6428fdd2043 Mon Sep 17 00:00:00 2001 From: Benjamin Levesque <14175665+benjlevesque@users.noreply.github.com> Date: Wed, 22 Jan 2025 09:55:14 +0100 Subject: [PATCH 4/7] =?UTF-8?q?=F0=9F=9A=9A=20System=20email?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/applications/cli/src/commands/actionnaire/migrer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/applications/cli/src/commands/actionnaire/migrer.ts b/packages/applications/cli/src/commands/actionnaire/migrer.ts index c8213647f7..5eda028bb8 100644 --- a/packages/applications/cli/src/commands/actionnaire/migrer.ts +++ b/packages/applications/cli/src/commands/actionnaire/migrer.ts @@ -201,7 +201,7 @@ export class Migrer extends Command { suppriméLe: DateTime.convertirEnValueType( new Date(modification.abandonedOn), ).formatter(), - suppriméPar: Email.system().formatter(), + suppriméPar: Email.system.formatter(), }, }); console.log(`🚮 Demande automatiquement supprimée pour ${identifiantProjet}`); From 0f00f37d4cd8cf98d162476e5ce60615fae43d32 Mon Sep 17 00:00:00 2001 From: Benjamin Levesque <14175665+benjlevesque@users.noreply.github.com> Date: Wed, 22 Jan 2025 10:52:56 +0100 Subject: [PATCH 5/7] =?UTF-8?q?=F0=9F=94=80=20Merge?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../raccordement/modifier-r\303\251f\303\251rence.ts" | 2 +- ...estionAutomatiqueDemandeChangementExecut\303\251e.saga.ts" | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git "a/packages/applications/cli/src/commands/raccordement/modifier-r\303\251f\303\251rence.ts" "b/packages/applications/cli/src/commands/raccordement/modifier-r\303\251f\303\251rence.ts" index 6772c9230d..3b73a3b02f 100644 --- "a/packages/applications/cli/src/commands/raccordement/modifier-r\303\251f\303\251rence.ts" +++ "b/packages/applications/cli/src/commands/raccordement/modifier-r\303\251f\303\251rence.ts" @@ -128,7 +128,7 @@ export default class ModifierRéférence extends Command { nouvelleRéférenceDossierRaccordementValue: row['referenceDossier corrigé GRD'], rôleValue: 'admin', modifiéeLeValue: DateTime.now().formatter(), - modifiéeParValue: Email.system().formatter(), + modifiéeParValue: Email.system.formatter(), }, }); } diff --git "a/packages/domain/laur\303\251at/src/repr\303\251sentantL\303\251gal/saga/t\303\242chePlanifi\303\251eGestionAutomatiqueDemandeChangementExecut\303\251e.saga.ts" "b/packages/domain/laur\303\251at/src/repr\303\251sentantL\303\251gal/saga/t\303\242chePlanifi\303\251eGestionAutomatiqueDemandeChangementExecut\303\251e.saga.ts" index 64d47abc92..5dd5ff3f3f 100644 --- "a/packages/domain/laur\303\251at/src/repr\303\251sentantL\303\251gal/saga/t\303\242chePlanifi\303\251eGestionAutomatiqueDemandeChangementExecut\303\251e.saga.ts" +++ "b/packages/domain/laur\303\251at/src/repr\303\251sentantL\303\251gal/saga/t\303\242chePlanifi\303\251eGestionAutomatiqueDemandeChangementExecut\303\251e.saga.ts" @@ -56,7 +56,7 @@ export const tâchePlanifiéeGestionAutomatiqueDemandeChangementExecutéeSaga = type: 'Lauréat.ReprésentantLégal.UseCase.AccorderChangementReprésentantLégal', data: { identifiantProjetValue: identifiantProjet.formatter(), - identifiantUtilisateurValue: Email.system().formatter(), + identifiantUtilisateurValue: Email.system.formatter(), dateAccordValue: DateTime.now().formatter(), accordAutomatiqueValue: true, }, @@ -67,7 +67,7 @@ export const tâchePlanifiéeGestionAutomatiqueDemandeChangementExecutéeSaga = type: 'Lauréat.ReprésentantLégal.UseCase.RejeterChangementReprésentantLégal', data: { identifiantProjetValue: identifiantProjet.formatter(), - identifiantUtilisateurValue: Email.system().formatter(), + identifiantUtilisateurValue: Email.system.formatter(), motifRejetValue: 'Rejet automatique', dateRejetValue: DateTime.now().formatter(), rejetAutomatiqueValue: true, From 5fc2f2765f433358be6dc8497d47880a070dbb51 Mon Sep 17 00:00:00 2001 From: Benjamin Levesque <14175665+benjlevesque@users.noreply.github.com> Date: Wed, 22 Jan 2025 10:54:52 +0100 Subject: [PATCH 6/7] =?UTF-8?q?=E2=8F=AA=EF=B8=8F=20Revert=20system()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/applications/cli/src/commands/actionnaire/migrer.ts | 2 +- .../raccordement/modifier-r\303\251f\303\251rence.ts" | 2 +- packages/domain/common/src/valueTypes/email.valueType.ts | 2 +- .../saga/abandonAccord\303\251.saga.ts" | 2 +- .../saga/laur\303\251atNotifi\303\251.saga.ts" | 2 +- ...estionAutomatiqueDemandeChangementExecut\303\251e.saga.ts" | 4 ++-- .../changemementRepr\303\251sentantL\303\251gal.when.ts" | 4 ++-- .../stepDefinitions/repr\303\251sentantL\303\251gal.when.ts" | 2 +- 8 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/applications/cli/src/commands/actionnaire/migrer.ts b/packages/applications/cli/src/commands/actionnaire/migrer.ts index 5eda028bb8..c8213647f7 100644 --- a/packages/applications/cli/src/commands/actionnaire/migrer.ts +++ b/packages/applications/cli/src/commands/actionnaire/migrer.ts @@ -201,7 +201,7 @@ export class Migrer extends Command { suppriméLe: DateTime.convertirEnValueType( new Date(modification.abandonedOn), ).formatter(), - suppriméPar: Email.system.formatter(), + suppriméPar: Email.system().formatter(), }, }); console.log(`🚮 Demande automatiquement supprimée pour ${identifiantProjet}`); diff --git "a/packages/applications/cli/src/commands/raccordement/modifier-r\303\251f\303\251rence.ts" "b/packages/applications/cli/src/commands/raccordement/modifier-r\303\251f\303\251rence.ts" index 3b73a3b02f..6772c9230d 100644 --- "a/packages/applications/cli/src/commands/raccordement/modifier-r\303\251f\303\251rence.ts" +++ "b/packages/applications/cli/src/commands/raccordement/modifier-r\303\251f\303\251rence.ts" @@ -128,7 +128,7 @@ export default class ModifierRéférence extends Command { nouvelleRéférenceDossierRaccordementValue: row['referenceDossier corrigé GRD'], rôleValue: 'admin', modifiéeLeValue: DateTime.now().formatter(), - modifiéeParValue: Email.system.formatter(), + modifiéeParValue: Email.system().formatter(), }, }); } diff --git a/packages/domain/common/src/valueTypes/email.valueType.ts b/packages/domain/common/src/valueTypes/email.valueType.ts index 9519e9baf6..89fb3a33cf 100644 --- a/packages/domain/common/src/valueTypes/email.valueType.ts +++ b/packages/domain/common/src/valueTypes/email.valueType.ts @@ -28,7 +28,7 @@ export const convertirEnValueType = (value: string): ValueType => { const regexEmail = /^[a-z0-9.+/=?^_`{|}~-]+@[a-z0-9-]+(?:\.[a-z0-9-]+)*$/; -export const system = convertirEnValueType('system@system'); +export const system = () => convertirEnValueType('system@system'); function estValide(value: string): asserts value is RawType { const isValid = regexEmail.test(value); diff --git "a/packages/domain/laur\303\251at/src/repr\303\251sentantL\303\251gal/saga/abandonAccord\303\251.saga.ts" "b/packages/domain/laur\303\251at/src/repr\303\251sentantL\303\251gal/saga/abandonAccord\303\251.saga.ts" index efc90adb40..a3b714f065 100644 --- "a/packages/domain/laur\303\251at/src/repr\303\251sentantL\303\251gal/saga/abandonAccord\303\251.saga.ts" +++ "b/packages/domain/laur\303\251at/src/repr\303\251sentantL\303\251gal/saga/abandonAccord\303\251.saga.ts" @@ -15,7 +15,7 @@ export const abandonAccordéSaga = async ({ payload }: AbandonAccordéEvent) => type: 'Lauréat.ReprésentantLégal.Command.SupprimerChangementReprésentantLégal', data: { identifiantProjet, - identifiantUtilisateur: Email.system, + identifiantUtilisateur: Email.system(), dateSuppression: DateTime.now(), }, }); diff --git "a/packages/domain/laur\303\251at/src/repr\303\251sentantL\303\251gal/saga/laur\303\251atNotifi\303\251.saga.ts" "b/packages/domain/laur\303\251at/src/repr\303\251sentantL\303\251gal/saga/laur\303\251atNotifi\303\251.saga.ts" index 964c2cc2f1..913088294c 100644 --- "a/packages/domain/laur\303\251at/src/repr\303\251sentantL\303\251gal/saga/laur\303\251atNotifi\303\251.saga.ts" +++ "b/packages/domain/laur\303\251at/src/repr\303\251sentantL\303\251gal/saga/laur\303\251atNotifi\303\251.saga.ts" @@ -13,6 +13,6 @@ export const lauréatNotifiéSaga = async ({ data: { identifiantProjet: IdentifiantProjet.convertirEnValueType(identifiantProjet), importéLe: DateTime.convertirEnValueType(notifiéLe), - importéPar: Email.system, + importéPar: Email.system(), }, }); diff --git "a/packages/domain/laur\303\251at/src/repr\303\251sentantL\303\251gal/saga/t\303\242chePlanifi\303\251eGestionAutomatiqueDemandeChangementExecut\303\251e.saga.ts" "b/packages/domain/laur\303\251at/src/repr\303\251sentantL\303\251gal/saga/t\303\242chePlanifi\303\251eGestionAutomatiqueDemandeChangementExecut\303\251e.saga.ts" index 5dd5ff3f3f..64d47abc92 100644 --- "a/packages/domain/laur\303\251at/src/repr\303\251sentantL\303\251gal/saga/t\303\242chePlanifi\303\251eGestionAutomatiqueDemandeChangementExecut\303\251e.saga.ts" +++ "b/packages/domain/laur\303\251at/src/repr\303\251sentantL\303\251gal/saga/t\303\242chePlanifi\303\251eGestionAutomatiqueDemandeChangementExecut\303\251e.saga.ts" @@ -56,7 +56,7 @@ export const tâchePlanifiéeGestionAutomatiqueDemandeChangementExecutéeSaga = type: 'Lauréat.ReprésentantLégal.UseCase.AccorderChangementReprésentantLégal', data: { identifiantProjetValue: identifiantProjet.formatter(), - identifiantUtilisateurValue: Email.system.formatter(), + identifiantUtilisateurValue: Email.system().formatter(), dateAccordValue: DateTime.now().formatter(), accordAutomatiqueValue: true, }, @@ -67,7 +67,7 @@ export const tâchePlanifiéeGestionAutomatiqueDemandeChangementExecutéeSaga = type: 'Lauréat.ReprésentantLégal.UseCase.RejeterChangementReprésentantLégal', data: { identifiantProjetValue: identifiantProjet.formatter(), - identifiantUtilisateurValue: Email.system.formatter(), + identifiantUtilisateurValue: Email.system().formatter(), motifRejetValue: 'Rejet automatique', dateRejetValue: DateTime.now().formatter(), rejetAutomatiqueValue: true, diff --git "a/packages/specifications/src/projet/laur\303\251at/repr\303\251sentant-l\303\251gal/changement/stepDefinitions/changemementRepr\303\251sentantL\303\251gal.when.ts" "b/packages/specifications/src/projet/laur\303\251at/repr\303\251sentant-l\303\251gal/changement/stepDefinitions/changemementRepr\303\251sentantL\303\251gal.when.ts" index 0fdfeb1666..4b6ec6b7f0 100644 --- "a/packages/specifications/src/projet/laur\303\251at/repr\303\251sentant-l\303\251gal/changement/stepDefinitions/changemementRepr\303\251sentantL\303\251gal.when.ts" +++ "b/packages/specifications/src/projet/laur\303\251at/repr\303\251sentant-l\303\251gal/changement/stepDefinitions/changemementRepr\303\251sentantL\303\251gal.when.ts" @@ -273,7 +273,7 @@ async function instruireAutomatiquementChangement( if (instruction === 'accord') { this.lauréatWorld.représentantLégalWorld.changementReprésentantLégalWorld.accorderChangementReprésentantLégalFixture.créer( { - accordéePar: Email.system.formatter(), + accordéePar: Email.system().formatter(), nomReprésentantLégal: this.lauréatWorld.représentantLégalWorld.changementReprésentantLégalWorld .demanderChangementReprésentantLégalFixture.nomReprésentantLégal, @@ -286,7 +286,7 @@ async function instruireAutomatiquementChangement( this.lauréatWorld.représentantLégalWorld.changementReprésentantLégalWorld.rejeterChangementReprésentantLégalFixture.créer( { motif: 'Rejet automatique', - rejetéPar: Email.system.formatter(), + rejetéPar: Email.system().formatter(), }, ); } diff --git "a/packages/specifications/src/projet/laur\303\251at/repr\303\251sentant-l\303\251gal/stepDefinitions/repr\303\251sentantL\303\251gal.when.ts" "b/packages/specifications/src/projet/laur\303\251at/repr\303\251sentant-l\303\251gal/stepDefinitions/repr\303\251sentantL\303\251gal.when.ts" index 1f5b7697f7..ce23a6044d 100644 --- "a/packages/specifications/src/projet/laur\303\251at/repr\303\251sentant-l\303\251gal/stepDefinitions/repr\303\251sentantL\303\251gal.when.ts" +++ "b/packages/specifications/src/projet/laur\303\251at/repr\303\251sentant-l\303\251gal/stepDefinitions/repr\303\251sentantL\303\251gal.when.ts" @@ -19,7 +19,7 @@ Quand( data: { identifiantProjet: IdentifiantProjet.convertirEnValueType(identifiantProjet), importéLe: DateTime.convertirEnValueType(importéLe), - importéPar: Email.system, + importéPar: Email.system(), }, }); } catch (error) { From 95ad56c62844c5b70458e93cecef66760f7a4df9 Mon Sep 17 00:00:00 2001 From: Benjamin Levesque <14175665+benjlevesque@users.noreply.github.com> Date: Fri, 31 Jan 2025 14:03:34 +0100 Subject: [PATCH 7/7] =?UTF-8?q?=F0=9F=90=9B=20PR=20review?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/domain/common/src/valueTypes/email.valueType.ts | 2 +- .../utilisateur/src/identifiantUtilisateur.valueType.ts | 2 +- packages/specifications/src/candidature/candidature.world.ts | 2 +- .../specifications/src/utilisateur/fixtures/utilisateur.ts | 4 +--- 4 files changed, 4 insertions(+), 6 deletions(-) diff --git a/packages/domain/common/src/valueTypes/email.valueType.ts b/packages/domain/common/src/valueTypes/email.valueType.ts index 89fb3a33cf..e4e1daa8d1 100644 --- a/packages/domain/common/src/valueTypes/email.valueType.ts +++ b/packages/domain/common/src/valueTypes/email.valueType.ts @@ -22,7 +22,7 @@ export const bind = ({ email }: PlainType): ValueType => { export const convertirEnValueType = (value: string): ValueType => { return bind({ - email: value?.toLowerCase(), + email: value.toLowerCase(), }); }; diff --git a/packages/domain/utilisateur/src/identifiantUtilisateur.valueType.ts b/packages/domain/utilisateur/src/identifiantUtilisateur.valueType.ts index 466260bd2b..e6be57d99c 100644 --- a/packages/domain/utilisateur/src/identifiantUtilisateur.valueType.ts +++ b/packages/domain/utilisateur/src/identifiantUtilisateur.valueType.ts @@ -34,7 +34,7 @@ export const bind = ({ email }: PlainType): ValueType => { */ export const convertirEnValueType = (value: string): ValueType => { return bind({ - email: value?.toLowerCase(), + email: value.toLowerCase(), }); }; diff --git a/packages/specifications/src/candidature/candidature.world.ts b/packages/specifications/src/candidature/candidature.world.ts index fc33e9a076..c8d29161da 100644 --- a/packages/specifications/src/candidature/candidature.world.ts +++ b/packages/specifications/src/candidature/candidature.world.ts @@ -91,7 +91,7 @@ export class CandidatureWorld { dateÉchéanceGf: expectedValues.dateÉchéanceGfValue ? DateTime.convertirEnValueType(expectedValues.dateÉchéanceGfValue) : undefined, - emailContact: Email.convertirEnValueType(expectedValues.emailContactValue.toLowerCase()), + emailContact: Email.convertirEnValueType(expectedValues.emailContactValue), evaluationCarboneSimplifiée: expectedValues.evaluationCarboneSimplifiéeValue, historiqueAbandon: Candidature.HistoriqueAbandon.convertirEnValueType( expectedValues.historiqueAbandonValue, diff --git a/packages/specifications/src/utilisateur/fixtures/utilisateur.ts b/packages/specifications/src/utilisateur/fixtures/utilisateur.ts index 91595ce066..288b40df08 100644 --- a/packages/specifications/src/utilisateur/fixtures/utilisateur.ts +++ b/packages/specifications/src/utilisateur/fixtures/utilisateur.ts @@ -1,7 +1,5 @@ import { faker } from '@faker-js/faker'; -import { Email } from '@potentiel-domain/common'; - export interface Utilisateur { id: string; email: string; @@ -41,7 +39,7 @@ export abstract class AbstractUtilisateur implements Utilisateur { protected créer(partial?: Partial'>>>): Readonly { const utilisateur: Utilisateur = { - email: Email.convertirEnValueType(faker.internet.email()).formatter(), + email: faker.internet.email().toLowerCase(), nom: faker.person.fullName(), id: faker.string.uuid(), ...partial,