Skip to content

Commit

Permalink
feat(schema)!: do not set public access information when access is pr…
Browse files Browse the repository at this point in the history
…ivate
  • Loading branch information
marc-gavanier committed May 23, 2024
1 parent 16c728c commit 08f803f
Show file tree
Hide file tree
Showing 4 changed files with 204 additions and 35 deletions.
2 changes: 2 additions & 0 deletions src/models/modalite-acces/modalite-acces.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,5 @@ const isModalitesAcces = (modalitesAcces: ModaliteAcces[]): modalitesAcces is Mo
/* eslint-disable-next-line @typescript-eslint/naming-convention */
export const ModalitesAcces = (modalitesAcces: ModaliteAcces[]): ModalitesAcces =>
isModalitesAcces(modalitesAcces) ? modalitesAcces : throwModalitesAccesError(modalitesAcces);

export const toAccessibleLieu = (modalitesAcces: ModaliteAcces): boolean => modalitesAcces !== ModaliteAcces.PasDePublic;
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,31 @@

import {
Adresse,
FraisACharge,
Contact,
Courriel,
FraisACharge,
Itinerances,
LabelsNationaux,
Localisation,
ModaliteAcces,
ModalitesAcces,
ModalitesAccompagnement,
/* eslint-disable @typescript-eslint/no-shadow */
/* eslint-disable-next-line @typescript-eslint/no-shadow */
Presentation,
PublicsAccueillis,
Services,
toAccessibleLieu,
Typologies,
Url,
Itinerances,
Services
Url
} from '../../../models';
import { SchemaLieuMediationNumerique } from '../schema-lieux-de-mediation-numerique';

const toListOf = <T>(listItem: string): T => listItem as T;

export const listFromString = <T>(stringList: string): T[] => stringList.split('|').map(toListOf<T>);

const hasServices = (services?: Services): boolean => services != null && services.length > 0;

export const servicesIfAny = (services?: string): { services?: Services } =>
services == null ? {} : { services: Services(listFromString(services)) };

Expand Down Expand Up @@ -89,14 +94,19 @@ export const sourceIfAny = (source?: string): { source?: string } => (source ==
export const structureParenteIfAny = (structureParente?: string): { structure_parente?: string } =>
structureParente == null ? {} : { structure_parente: structureParente };

export const publicsAccueillisIfAny = (publicsAccueillis?: string): { publics_accueillis?: PublicsAccueillis } =>
publicsAccueillis == null ? {} : { publics_accueillis: PublicsAccueillis(listFromString(publicsAccueillis)) };
export const publicsAccueillisIfAny = (
publicsAccueillis?: string,
services?: Services
): { publics_accueillis?: PublicsAccueillis } =>
publicsAccueillis == null || !hasServices(services)
? {}
: { publics_accueillis: PublicsAccueillis(listFromString(publicsAccueillis)) };

export const fraisAChargeIfAny = (conditionsAcces?: string): { frais_a_charge?: FraisACharge } =>
conditionsAcces == null ? {} : { frais_a_charge: FraisACharge(listFromString(conditionsAcces)) };
export const fraisAChargeIfAny = (conditionsAcces?: string, services?: Services): { frais_a_charge?: FraisACharge } =>
conditionsAcces == null || !hasServices(services) ? {} : { frais_a_charge: FraisACharge(listFromString(conditionsAcces)) };

export const itinerancesIfAny = (itinerance?: string): { itinerance?: Itinerances } =>
itinerance == null ? {} : { itinerance: Itinerances(listFromString(itinerance)) };
export const itinerancesIfAny = (itinerance?: string, services?: Services): { itinerance?: Itinerances } =>
itinerance == null || !hasServices(services) ? {} : { itinerance: Itinerances(listFromString(itinerance)) };

export const labelsNationauxIfAny = (labelsNationaux?: string): { labels_nationaux?: LabelsNationaux } =>
labelsNationaux == null ? {} : { labels_nationaux: LabelsNationaux(listFromString(labelsNationaux)) };
Expand All @@ -105,12 +115,26 @@ export const labelsAutresIfAny = (labelsAutres?: string): { labels_autres?: stri
labelsAutres == null ? {} : { labels_autres: listFromString(labelsAutres) };

export const modalitesAccompagnementIfAny = (
modalitesAccompagnement?: string
modalitesAccompagnement?: string,
services?: Services
): { modalites_accompagnement?: ModalitesAccompagnement } =>
modalitesAccompagnement == null
modalitesAccompagnement == null || !hasServices(services)
? {}
: { modalites_accompagnement: ModalitesAccompagnement(listFromString(modalitesAccompagnement)) };

const PublicAccess = (modalitesAcces?: string): { modalites_acces?: ModalitesAcces } =>
modalitesAcces == null
? {}
: {
modalites_acces: ModalitesAcces(listFromString<ModaliteAcces>(modalitesAcces).filter(toAccessibleLieu))
};
const noPublicAccess = (): { modalites_acces: ModalitesAcces } => ({
modalites_acces: ModalitesAcces([ModaliteAcces.PasDePublic])
});

export const modalitesAccessIfAny = (modalitesAcces?: string, services?: Services): { modalites_acces?: ModalitesAcces } =>
hasServices(services) ? PublicAccess(modalitesAcces) : noPublicAccess();

export const accessibiliteIfAny = (accessibilite?: string): { accessibilite?: Url } =>
accessibilite == null ? {} : { accessibilite: Url(accessibilite) };

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,9 @@ import {
Typologies,
Url,
Itinerance,
Itinerances
Itinerances,
ModaliteAcces,
ModalitesAcces
} from '../../../models';
import { SchemaLieuMediationNumerique } from '../schema-lieux-de-mediation-numerique';
import { fromSchemaLieuxDeMediationNumerique } from './from-schema-lieux-de-mediation-numerique';
Expand Down Expand Up @@ -52,7 +54,40 @@ describe('from schema lieux de mediation numerique', (): void => {
commune: 'Reims',
voie: '12 BIS RUE DE LECLERCQ'
}),
date_maj: new Date('2022-10-10')
date_maj: new Date('2022-10-10'),
modalites_acces: ModalitesAcces([ModaliteAcces.PasDePublic])
}
]);
});

it('should necer have "Pas de public" modalite access when there is at least one service', (): void => {
const minimalSchemaLieuMediationNumerique: SchemaLieuMediationNumerique[] = [
{
id: 'structure-1',
nom: 'Anonymal',
pivot: '43493312300029',
commune: 'Reims',
code_postal: '51100',
adresse: '12 BIS RUE DE LECLERCQ',
date_maj: '2022-10-10',
services: `${Service.LoisirsEtCreationsNumeriques}`,
modalites_acces: [ModaliteAcces.SePresenter, ModaliteAcces.PasDePublic].join('|')
}
];

expect(fromSchemaLieuxDeMediationNumerique(minimalSchemaLieuMediationNumerique)).toStrictEqual<LieuMediationNumerique[]>([
{
id: Id('structure-1'),
nom: Nom('Anonymal'),
pivot: Pivot('43493312300029'),
adresse: Adresse({
code_postal: '51100',
commune: 'Reims',
voie: '12 BIS RUE DE LECLERCQ'
}),
date_maj: new Date('2022-10-10'),
services: Services([Service.LoisirsEtCreationsNumeriques]),
modalites_acces: ModalitesAcces([ModaliteAcces.SePresenter])
}
]);
});
Expand Down Expand Up @@ -93,6 +128,13 @@ describe('from schema lieux de mediation numerique', (): void => {
modalites_accompagnement: [ModaliteAccompagnement.AccompagnementIndividuel, ModaliteAccompagnement.EnAutonomie].join(
'|'
),
modalites_acces: [
ModaliteAcces.SePresenter,
ModaliteAcces.Telephoner,
ModaliteAcces.ContacterParMail,
ModaliteAcces.PrescriptionParMail,
ModaliteAcces.PrendreRdvEnLigne
].join('|'),
accessibilite:
'https://acceslibre.beta.gouv.fr/app/29-lampaul-plouarzel/a/bibliotheque-mediatheque/erp/mediatheque-13/',
prise_rdv: 'https://www.rdv-solidarites.fr/'
Expand Down Expand Up @@ -150,6 +192,102 @@ describe('from schema lieux de mediation numerique', (): void => {
ModaliteAccompagnement.AccompagnementIndividuel,
ModaliteAccompagnement.EnAutonomie
]),
modalites_acces: ModalitesAcces([
ModaliteAcces.SePresenter,
ModaliteAcces.Telephoner,
ModaliteAcces.ContacterParMail,
ModaliteAcces.PrescriptionParMail,
ModaliteAcces.PrendreRdvEnLigne
]),
accessibilite: Url(
'https://acceslibre.beta.gouv.fr/app/29-lampaul-plouarzel/a/bibliotheque-mediatheque/erp/mediatheque-13/'
),
prise_rdv: Url('https://www.rdv-solidarites.fr/')
}
]);
});

it('should convert full schema lieux mediation numérique without services to lieux de mediation numerique model', (): void => {
const fullSchemaLieuMediationNumerique: SchemaLieuMediationNumerique[] = [
{
id: 'structure-1',
nom: 'Anonymal',
pivot: '43493312300029',
commune: 'Reims',
code_postal: '51100',
adresse: '12 BIS RUE DE LECLERCQ',
date_maj: '2022-10-10',
code_insee: '51454',
complement_adresse: 'Le patio du bois de l’Aulne',
latitude: 43.52609,
longitude: 5.41423,
typologie: 'TIERS_LIEUX',
telephone: '+33180059880',
courriel: '[email protected]',
site_web: 'https://www.laquincaillerie.tl/|https://m.facebook.com/laquincaillerienumerique/',
horaires: 'Mo-Fr 09:00-12:00,14:00-18:30; Sa 08:30-12:00',
presentation_resume:
'Notre association propose des formations aux outils numériques à destination des personnes âgées.',
presentation_detail:
'Notre parcours d’initiation permet l’acquisition de compétences numériques de base. Nous proposons également un accompagnement à destination des personnes déjà initiées qui souhaiteraient approfondir leurs connaissances. Du matériel informatique est en libre accès pour nos adhérents tous les après-midis. En plus de d’accueillir les personnes dans notre lieu en semaine (sur rendez-vous), nous assurons une permanence le samedi matin dans la médiathèque XX.',
source: 'Hubik',
structure_parente: 'Pôle emploi',
publics_accueillis: 'Familles/enfants|Adultes|Déficience visuelle',
frais_a_charge:
"Payant : L'accès au lieu et/ou à ses services est payant|Gratuit sous condition : La gratuité est conditionnée à des critères (situation familiale, convention avec un organisme social...)",
itinerance: 'Fixe|Itinérant',
labels_nationaux: 'France Services|APTIC|Point relais CAF',
labels_autres: 'SudLabs|Nièvre médiation numérique',
modalites_accompagnement: [ModaliteAccompagnement.AccompagnementIndividuel, ModaliteAccompagnement.EnAutonomie].join(
'|'
),
modalites_acces: [
ModaliteAcces.SePresenter,
ModaliteAcces.Telephoner,
ModaliteAcces.ContacterParMail,
ModaliteAcces.PrescriptionParMail,
ModaliteAcces.PrendreRdvEnLigne
].join('|'),
accessibilite:
'https://acceslibre.beta.gouv.fr/app/29-lampaul-plouarzel/a/bibliotheque-mediatheque/erp/mediatheque-13/',
prise_rdv: 'https://www.rdv-solidarites.fr/'
}
];

expect(fromSchemaLieuxDeMediationNumerique(fullSchemaLieuMediationNumerique)).toStrictEqual<LieuMediationNumerique[]>([
{
id: Id('structure-1'),
nom: Nom('Anonymal'),
pivot: Pivot('43493312300029'),
adresse: Adresse({
code_postal: '51100',
code_insee: '51454',
commune: 'Reims',
voie: '12 BIS RUE DE LECLERCQ',
complement_adresse: 'Le patio du bois de l’Aulne'
}),
date_maj: new Date('2022-10-10'),
localisation: Localisation({
latitude: 43.52609,
longitude: 5.41423
}),
typologies: Typologies([Typologie.TIERS_LIEUX]),
contact: Contact({
telephone: '+33180059880',
courriel: [Courriel('[email protected]')],
site_web: [Url('https://www.laquincaillerie.tl/'), Url('https://m.facebook.com/laquincaillerienumerique/')]
}),
horaires: 'Mo-Fr 09:00-12:00,14:00-18:30; Sa 08:30-12:00',
presentation: {
resume: 'Notre association propose des formations aux outils numériques à destination des personnes âgées.',
detail:
'Notre parcours d’initiation permet l’acquisition de compétences numériques de base. Nous proposons également un accompagnement à destination des personnes déjà initiées qui souhaiteraient approfondir leurs connaissances. Du matériel informatique est en libre accès pour nos adhérents tous les après-midis. En plus de d’accueillir les personnes dans notre lieu en semaine (sur rendez-vous), nous assurons une permanence le samedi matin dans la médiathèque XX.'
},
source: 'Hubik',
structure_parente: 'Pôle emploi',
labels_nationaux: LabelsNationaux([LabelNational.FranceServices, LabelNational.APTIC, LabelNational.PointRelaisCAF]),
labels_autres: ['SudLabs', 'Nièvre médiation numérique'],
modalites_acces: ModalitesAcces([ModaliteAcces.PasDePublic]),
accessibilite: Url(
'https://acceslibre.beta.gouv.fr/app/29-lampaul-plouarzel/a/bibliotheque-mediatheque/erp/mediatheque-13/'
),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/* eslint-disable @typescript-eslint/naming-convention, camelcase */

import { Id, LieuMediationNumerique, Nom, Pivot } from '../../../models';
import { Id, LieuMediationNumerique, Nom, Pivot, Services } from '../../../models';
import { SchemaLieuMediationNumerique } from '../schema-lieux-de-mediation-numerique';
import {
accessibiliteIfAny,
Expand All @@ -19,27 +19,32 @@ import {
structureParenteIfAny,
typologiesIfAny,
itinerancesIfAny,
servicesIfAny
servicesIfAny,
modalitesAccessIfAny
} from './from-schema-lieux-de-mediation-numerique-fields';

const optionalFields = (schemaLieuMediationNumeriqueItem: SchemaLieuMediationNumerique): Partial<LieuMediationNumerique> => ({
...servicesIfAny(schemaLieuMediationNumeriqueItem.services),
...localisationIfAny(schemaLieuMediationNumeriqueItem.latitude, schemaLieuMediationNumeriqueItem.longitude),
...typologiesIfAny(schemaLieuMediationNumeriqueItem.typologie),
...contactIfAny(schemaLieuMediationNumeriqueItem),
...horairesIfAny(schemaLieuMediationNumeriqueItem.horaires),
...presentationIfAny(schemaLieuMediationNumeriqueItem),
...sourceIfAny(schemaLieuMediationNumeriqueItem.source),
...structureParenteIfAny(schemaLieuMediationNumeriqueItem.structure_parente),
...publicsAccueillisIfAny(schemaLieuMediationNumeriqueItem.publics_accueillis),
...fraisAChargeIfAny(schemaLieuMediationNumeriqueItem.frais_a_charge),
...itinerancesIfAny(schemaLieuMediationNumeriqueItem.itinerance),
...labelsNationauxIfAny(schemaLieuMediationNumeriqueItem.labels_nationaux),
...labelsAutresIfAny(schemaLieuMediationNumeriqueItem.labels_autres),
...modalitesAccompagnementIfAny(schemaLieuMediationNumeriqueItem.modalites_accompagnement),
...accessibiliteIfAny(schemaLieuMediationNumeriqueItem.accessibilite),
...priseRdvIfAny(schemaLieuMediationNumeriqueItem.prise_rdv)
});
const optionalFields = (schemaLieuMediationNumeriqueItem: SchemaLieuMediationNumerique): Partial<LieuMediationNumerique> => {
const servicesFound: { services?: Services } = servicesIfAny(schemaLieuMediationNumeriqueItem.services);
return {
...servicesFound,
...localisationIfAny(schemaLieuMediationNumeriqueItem.latitude, schemaLieuMediationNumeriqueItem.longitude),
...typologiesIfAny(schemaLieuMediationNumeriqueItem.typologie),
...contactIfAny(schemaLieuMediationNumeriqueItem),
...horairesIfAny(schemaLieuMediationNumeriqueItem.horaires),
...presentationIfAny(schemaLieuMediationNumeriqueItem),
...sourceIfAny(schemaLieuMediationNumeriqueItem.source),
...structureParenteIfAny(schemaLieuMediationNumeriqueItem.structure_parente),
...publicsAccueillisIfAny(schemaLieuMediationNumeriqueItem.publics_accueillis, servicesFound.services),
...fraisAChargeIfAny(schemaLieuMediationNumeriqueItem.frais_a_charge, servicesFound.services),
...itinerancesIfAny(schemaLieuMediationNumeriqueItem.itinerance, servicesFound.services),
...labelsNationauxIfAny(schemaLieuMediationNumeriqueItem.labels_nationaux),
...labelsAutresIfAny(schemaLieuMediationNumeriqueItem.labels_autres),
...modalitesAccompagnementIfAny(schemaLieuMediationNumeriqueItem.modalites_accompagnement, servicesFound.services),
...modalitesAccessIfAny(schemaLieuMediationNumeriqueItem.modalites_acces, servicesFound.services),
...accessibiliteIfAny(schemaLieuMediationNumeriqueItem.accessibilite),
...priseRdvIfAny(schemaLieuMediationNumeriqueItem.prise_rdv)
};
};

export const fromSchemaLieuDeMediationNumerique = (
schemaLieuMediationNumeriqueItem: SchemaLieuMediationNumerique
Expand Down

0 comments on commit 08f803f

Please sign in to comment.