Skip to content

Commit

Permalink
feat(schema)!: apply v1.0.1 changes (#51)
Browse files Browse the repository at this point in the history
* feat(schema)!: allow multi email in contact field

* feat(schema)!: pipes as contact courriels and websites separator

* feat(schema)!: update frais à charge

* feat(schema)!: update modalites accompagenment

* feat(schema): add RIDET as valid pivot

* feat(schema)!: pipes as typologies separator

* refactor(schema): order calling codes

* feat(schema)!: remove cle ban field

* feat(schema)!: add itinerance field

* feat(schema)!: update services values and make it otional

* feat(schema)!: add moalité acces

* feat(schema)!: do not set public access information when access is private

* feat(schema)!: split public accueillis field to prises en charge and publics addressés

* feat: add new typologies

* feat!: split labels nationaux and rename autres labels

* feat(schema)!: update modalités accompagnement values

* fix: frais à charge values

* feat(schema)!: rename field accessibilite to fiche_acces_libre

---------

Co-authored-by: Arthur Belkhayat <[email protected]>
  • Loading branch information
marc-gavanier and abelkhay authored Jun 13, 2024
1 parent 77cef20 commit 59efa7a
Show file tree
Hide file tree
Showing 92 changed files with 2,122 additions and 873 deletions.
2 changes: 1 addition & 1 deletion .tooling/.eslint/eslint.rules.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ module.exports = {
"max-lines-per-function": [
"error",
{
max: 24,
max: 30,
skipBlankLines: true,
skipComments: true,
},
Expand Down
16 changes: 0 additions & 16 deletions src/models/cle-ban/cle-ban.spec.ts

This file was deleted.

15 changes: 0 additions & 15 deletions src/models/cle-ban/cle-ban.ts

This file was deleted.

8 changes: 0 additions & 8 deletions src/models/cle-ban/errors/cle-ban.error.ts

This file was deleted.

1 change: 0 additions & 1 deletion src/models/cle-ban/errors/index.ts

This file was deleted.

2 changes: 0 additions & 2 deletions src/models/cle-ban/index.ts

This file was deleted.

22 changes: 0 additions & 22 deletions src/models/condition-acces/condition-acces.spec.ts

This file was deleted.

28 changes: 0 additions & 28 deletions src/models/condition-acces/condition-acces.ts

This file was deleted.

9 changes: 0 additions & 9 deletions src/models/condition-acces/errors/conditions-acces.error.ts

This file was deleted.

1 change: 0 additions & 1 deletion src/models/condition-acces/errors/index.ts

This file was deleted.

2 changes: 0 additions & 2 deletions src/models/condition-acces/index.ts

This file was deleted.

19 changes: 5 additions & 14 deletions src/models/contact/contact.spec.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
/* eslint-disable @typescript-eslint/naming-convention, camelcase */

import { Courriel } from '../courriel';
import { Url } from '../url';
import { Contact, ContactToValidate } from './contact';
import { CourrielError, TelephoneError } from './errors';
import { TelephoneError } from './errors';

describe('contact model', (): void => {
it('should create a valid contact', (): void => {
const contactData: ContactToValidate = {
telephone: '+33145896378',
courriel: '[email protected]',
courriel: [Courriel('[email protected]')],
site_web: [Url('http://www.cartographienationale.fr')]
};

Expand All @@ -29,7 +30,7 @@ describe('contact model', (): void => {

it('should create a valid contact with only courriel property', (): void => {
const contactData: ContactToValidate = {
courriel: '[email protected]'
courriel: [Courriel('[email protected]')]
};

const contact: Contact = Contact(contactData);
Expand All @@ -40,7 +41,7 @@ describe('contact model', (): void => {
it('should create a valid contact with a phone from French Guiana', (): void => {
const contactData: ContactToValidate = {
telephone: '+594694020905',
courriel: '[email protected]',
courriel: [Courriel('[email protected]')],
site_web: [Url('https://www.facebook.com/YenkumuLutuPapaichton/')]
};

Expand All @@ -49,16 +50,6 @@ describe('contact model', (): void => {
expect(contact).toStrictEqual({ ...contactData } as Contact);
});

it('should throw CourrielError when courriel is invalid', (): void => {
const contactData: ContactToValidate = {
courriel: 'error'
};

expect((): void => {
Contact(contactData);
}).toThrow(new CourrielError('error'));
});

it('should throw TelephoneError when telephone is invalid', (): void => {
const contactData: ContactToValidate = {
telephone: 'error'
Expand Down
20 changes: 6 additions & 14 deletions src/models/contact/contact.ts
Original file line number Diff line number Diff line change
@@ -1,38 +1,30 @@
import { Courriel } from '../courriel';
import { Model } from '../model';
import { Url } from '../url';
import { CourrielError, TelephoneError } from './errors';
import { TelephoneError } from './errors';

export type Contact = Model<
'Contact',
{
telephone?: string;
courriel?: string;
/* eslint-disable-next-line @typescript-eslint/naming-convention */
courriel?: Courriel[];
/* eslint-disable-next-line @typescript-eslint/naming-convention */
site_web?: Url[];
}
>;

export type ContactToValidate = Omit<Contact, 'isContact'>;

const COURRIEL_REG_EXP: RegExp =
/^[a-zA-Z0-9_][a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9])+$/u;

const TELEPHONE_REG_EXP: RegExp =
/^(?:(?:\+|00)(?:33|594|262|596|269|687|689|590|508|681)[\s.-]{0,3}(?:\(0\)[\s.-]{0,3})?|0)(?:(?:[1-9](?:[\s.-]?\d{2}){4}|\d{2}(?:[\s.-]\d{3}){2})|\d{6}|\s\d{3}(?:\s\d{2}){3})$/u;

export const isValidCourriel = (courriel: string): boolean => COURRIEL_REG_EXP.test(courriel);
/^(?:(?:\+|00)(?:33|262|269|508|590|594|596|681|687|689)[\s.-]{0,3}(?:\(0\)[\s.-]{0,3})?|0)(?:(?:[1-9](?:[\s.-]?\d{2}){4}|\d{2}(?:[\s.-]\d{3}){2})|\d{6}|\s\d{3}(?:\s\d{2}){3})$/u;

export const isValidTelephone = (telephone: string): boolean => TELEPHONE_REG_EXP.test(telephone);

const isValidContact = (contact: Omit<Contact, 'isContact'>): contact is Contact =>
(contact.courriel == null || isValidCourriel(contact.courriel)) &&
(contact.telephone == null || isValidTelephone(contact.telephone));
contact.telephone == null || isValidTelephone(contact.telephone);

const throwContactError = (contact: Omit<Contact, 'isContact'>): Contact => {
if (contact.courriel != null && !isValidCourriel(contact.courriel)) {
throw new CourrielError(contact.courriel);
}

if (contact.telephone != null && !isValidTelephone(contact.telephone)) {
throw new TelephoneError(contact.telephone);
}
Expand Down
1 change: 0 additions & 1 deletion src/models/contact/errors/index.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1 @@
export * from './courriel.error';
export * from './telephone.error';
20 changes: 20 additions & 0 deletions src/models/courriel/courriel.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { Courriel } from './courriel';
import { CourrielError } from './errors';

describe('courriel model', (): void => {
it('should create a valid courriel', (): void => {
const courrielData: string = '[email protected]';

const courriel: Courriel = Courriel(courrielData);

expect(courriel).toStrictEqual(courrielData as Courriel);
});

it('should throw CourrielError when email do not have at symbole or domain extension', (): void => {
const courrielData: string = 'test@gmail';

expect((): void => {
Courriel(courrielData);
}).toThrow(new CourrielError(courrielData));
});
});
16 changes: 16 additions & 0 deletions src/models/courriel/courriel.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { Model } from '../model';
import { CourrielError } from './errors';

export type Courriel = Model<'Courriel', string>;

const COURRIEL_REG_EXP: RegExp =
/^(?:[a-zA-Z0-9_][a-zA-Z0-9.!#$%&'*+\\=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9])+(?:;|$))+$/u;

const throwCourrielError = (courriel: string): Courriel => {
throw new CourrielError(courriel);
};

export const isValidCourriel = (courriel: string): courriel is Courriel => COURRIEL_REG_EXP.test(courriel);

/* eslint-disable-next-line @typescript-eslint/naming-convention */
export const Courriel = (courriel: string): Courriel => (isValidCourriel(courriel) ? courriel : throwCourrielError(courriel));
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import { ModelError } from '../../../errors';
import { Contact } from '../contact';

export class CourrielError extends ModelError<Contact> {
export class CourrielError extends ModelError<{ courriel: string }> {
constructor(courriel: string) {
super('courriel', `Le courriel ${courriel} n'est pas valide`);
}
Expand Down
1 change: 1 addition & 0 deletions src/models/courriel/errors/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './courriel.error';
2 changes: 2 additions & 0 deletions src/models/courriel/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export * from './errors';
export * from './courriel';
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { DispositifProgrammeNational, DispositifProgrammesNationaux } from './dispositif-programme-national';
import { DispositifProgrammeNationalError } from './errors';

describe('dispositif programme national model', (): void => {
it('should create valid dispositif programmes nationaux', (): void => {
const dispositifProgrammesNationaux: DispositifProgrammesNationaux = DispositifProgrammesNationaux([
DispositifProgrammeNational.ConseillersNumeriques
]);

expect(dispositifProgrammesNationaux).toStrictEqual([DispositifProgrammeNational.ConseillersNumeriques]);
});

it('should not create invalid dispositif programmes nationaux', (): void => {
expect((): void => {
DispositifProgrammesNationaux(['France Emploi' as DispositifProgrammeNational]);
}).toThrow(new DispositifProgrammeNationalError('France Emploi' as DispositifProgrammeNational));
});

it('should not create invalid dispositif programmes nationaux containing a valid and an invalid value', (): void => {
expect((): void => {
DispositifProgrammesNationaux([
DispositifProgrammeNational.ConseillersNumeriques,
'France Emploi' as DispositifProgrammeNational
]);
}).toThrow(new DispositifProgrammeNationalError('France Emploi' as DispositifProgrammeNational));
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import { Model } from '../model';
import { DispositifProgrammeNationalError } from './errors';

export enum DispositifProgrammeNational {
AidantsConnect = 'Aidants Connect',
BibliothequesNumeriqueDeReference = 'Bibliothèques numérique de référence',
CertificationPIX = 'Certification PIX',
ConseillersNumeriques = 'Conseillers numériques',
EmmausConnect = 'Emmaüs Connect',
FranceServices = 'France Services',
GrandeEcoleDuNumerique = 'Grande école du numérique',
LaCroixRouge = 'La Croix Rouge',
PointNumeriqueCAF = "Point d'accès numérique CAF",
PromeneursDuNet = 'Promeneurs du net',
RelaisNumeriqueEmmausConnect = 'Relais numérique (Emmaüs Connect)'
}

export type DispositifProgrammesNationaux = Model<'DispositifProgrammesNationaux', DispositifProgrammeNational[]>;

export type DispositifProgrammeNationalIndefini = 'dispositif ou programme national indéfini';

const firstInvalidDispositifProgrammeNational = (dispositifProgrammeNational: DispositifProgrammeNational): boolean =>
!Object.values(DispositifProgrammeNational).includes(dispositifProgrammeNational);

const throwDispositifProgrammesNationauxError = (
dispositifProgrammesNationaux: DispositifProgrammeNational[]
): DispositifProgrammesNationaux => {
throw new DispositifProgrammeNationalError(
dispositifProgrammesNationaux.find(firstInvalidDispositifProgrammeNational) ?? 'dispositif ou programme national indéfini'
);
};

const isDispositifProgrammesNationaux = (
dispositifProgrammesNationaux: DispositifProgrammeNational[]
): dispositifProgrammesNationaux is DispositifProgrammesNationaux =>
dispositifProgrammesNationaux.find(firstInvalidDispositifProgrammeNational) == null;

/* eslint-disable-next-line @typescript-eslint/naming-convention */
export const DispositifProgrammesNationaux = (
dispositifProgrammesNationaux: DispositifProgrammeNational[]
): DispositifProgrammesNationaux =>
isDispositifProgrammesNationaux(dispositifProgrammesNationaux)
? dispositifProgrammesNationaux
: throwDispositifProgrammesNationauxError(dispositifProgrammesNationaux);
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { ModelError } from '../../../errors';
import { DispositifProgrammeNational, DispositifProgrammeNationalIndefini } from '../dispositif-programme-national';
import { LieuMediationNumerique } from '../../lieu-mediation-numerique';

export class DispositifProgrammeNationalError extends ModelError<LieuMediationNumerique> {
constructor(dispositifProgrammeNational: DispositifProgrammeNational | DispositifProgrammeNationalIndefini) {
super(
'dispositif_programmes_nationaux',
`Le dispositif programmes national '${dispositifProgrammeNational}' n'est pas une valeur admise`
);
}
}
1 change: 1 addition & 0 deletions src/models/dispositif-programme-national/errors/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './dispositif-programme-national.error';
2 changes: 2 additions & 0 deletions src/models/dispositif-programme-national/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export * from './errors';
export * from './dispositif-programme-national';
9 changes: 9 additions & 0 deletions src/models/formation-label/errors/formation-label.error.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { ModelError } from '../../../errors';
import { FormationLabel, FormationLabelIndefini } from '../formation-label';
import { LieuMediationNumerique } from '../../lieu-mediation-numerique';

export class FormationLabelError extends ModelError<LieuMediationNumerique> {
constructor(formationLabel: FormationLabel | FormationLabelIndefini) {
super('formations_labels', `Le label de formation '${formationLabel}' n'est pas une valeur admise`);
}
}
1 change: 1 addition & 0 deletions src/models/formation-label/errors/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './formation-label.error';
Loading

0 comments on commit 59efa7a

Please sign in to comment.