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

Annuaire requêteurs #27

Merged
merged 5 commits into from
Sep 12, 2024
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
31 changes: 25 additions & 6 deletions src/api/pieceJustificative.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,29 @@ const {
ErreurCodePaysIntrouvable,
ErreurDestinataireInexistant,
ErreurReponseRequete,
ErreurRequeteurInexistant,
ErreurTypeJustificatifIntrouvable,
} = require('../erreurs');

const estErreurAbsenceReponse = (e) => e instanceof ErreurAbsenceReponseDestinataire;
const estErreurReponseRequete = (e) => e instanceof ErreurReponseRequete;
const estErreurMetier = (e) => estErreurAbsenceReponse(e) || estErreurReponseRequete(e);

const paramsRequete = (config, codeDemarche, codePays) => {
const { depotPointsAcces, depotServicesCommuns } = config;
const paramsRequete = (config, codeDemarche, codePays, idRequeteur) => {
const { depotPointsAcces, depotRequeteurs, depotServicesCommuns } = config;

return depotServicesCommuns.trouveTypesJustificatifsPourDemarche(codeDemarche)
.then((tjs) => tjs[0])
.then((tj) => depotServicesCommuns.trouveFournisseurs(tj.id, codePays)
.then((fs) => fs[0])
.then((f) => depotPointsAcces.trouvePointAcces(f.idPointAcces())
.then((pa) => ({ destinataire: pa, fournisseur: f, typeJustificatif: tj }))));
.then((pa) => depotRequeteurs.trouveRequeteur(idRequeteur)
.then((r) => ({
destinataire: pa,
fournisseur: f,
requeteur: r,
typeJustificatif: tj,
})))));
};

const pieceJustificativeRecue = (idConversation, adaptateurDomibus) => adaptateurDomibus
Expand All @@ -36,15 +43,26 @@ const pieceJustificative = (config, requete, reponse) => {
adaptateurUUID,
} = config;
const idConversation = adaptateurUUID.genereUUID();
const { codeDemarche, codePays, previsualisationRequise } = requete.query;
const {
codeDemarche,
codePays,
idRequeteur,
previsualisationRequise,
} = requete.query;

return paramsRequete(config, codeDemarche, codePays)
.then(({ destinataire, fournisseur, typeJustificatif }) => {
return paramsRequete(config, codeDemarche, codePays, idRequeteur)
.then(({
destinataire,
fournisseur,
requeteur,
typeJustificatif,
}) => {
adaptateurDomibus.envoieMessageRequete({
codeDemarche,
destinataire,
fournisseur,
idConversation,
requeteur,
typeJustificatif,
previsualisationRequise: (previsualisationRequise === 'true' || previsualisationRequise === ''),
});
Expand All @@ -66,6 +84,7 @@ const pieceJustificative = (config, requete, reponse) => {
e instanceof ErreurCodeDemarcheIntrouvable
|| e instanceof ErreurCodePaysIntrouvable
|| e instanceof ErreurDestinataireInexistant
|| e instanceof ErreurRequeteurInexistant
|| e instanceof ErreurTypeJustificatifIntrouvable
) {
reponse.status(422).json({ erreur: e.message });
Expand Down
22 changes: 22 additions & 0 deletions src/depots/depotRequeteurs.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
const { ErreurRequeteurInexistant } = require('../erreurs');
const Requeteur = require('../ebms/requeteur');

class DepotRequeteurs {
constructor(donnees) {
this.donnees = donnees;
}

trouveRequeteur(id) {
const donneesRequeteur = this.donnees[id];
if (typeof donneesRequeteur === 'undefined') {
return Promise.reject(
new ErreurRequeteurInexistant(`Le requêteur avec comme identifiant "${id}" est inexistant`),
);
}

const resultat = new Requeteur({ id, ...donneesRequeteur });
return Promise.resolve(resultat);
}
}

module.exports = DepotRequeteurs;
24 changes: 4 additions & 20 deletions src/ebms/requeteJustificatif.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
const EnteteRequete = require('./enteteRequete');
const Fournisseur = require('./fournisseur');
const Message = require('./message');
const Requeteur = require('./requeteur');
const TypeJustificatif = require('./typeJustificatif');

class RequeteJustificatif extends Message {
Expand All @@ -13,6 +14,7 @@ class RequeteJustificatif extends Message {
destinataire = {},
fournisseur = new Fournisseur(),
idConversation = config.adaptateurUUID.genereUUID(),
requeteur = new Requeteur(),
typeJustificatif = new TypeJustificatif({}),
previsualisationRequise = false,
} = {},
Expand All @@ -21,6 +23,7 @@ class RequeteJustificatif extends Message {

this.codeDemarche = codeDemarche;
this.fournisseur = fournisseur;
this.requeteur = requeteur;
this.typeJustificatif = typeJustificatif;
this.previsualisationRequise = previsualisationRequise;
}
Expand Down Expand Up @@ -80,26 +83,7 @@ class RequeteJustificatif extends Message {
</rim:Element>
</rim:SlotValue>
</rim:Slot>
<rim:Slot name="EvidenceRequester">
<rim:SlotValue xsi:type="rim:CollectionValueType">
<rim:Element xsi:type="rim:AnyValueType">
<sdg:Agent>
<sdg:Identifier schemeID="urn:cef.eu:names:identifier:EAS:0096">DK22233223</sdg:Identifier>
<sdg:Name lang="EN">Denmark University Portal</sdg:Name>
<sdg:Address>
<sdg:FullAddress>Prince Street 15, 1050 Copenhagen, Denmark</sdg:FullAddress>
<sdg:LocatorDesignator>15</sdg:LocatorDesignator>
<sdg:PostCode>1050</sdg:PostCode>
<sdg:PostCityName>Copenhagen</sdg:PostCityName>
<sdg:Thoroughfare>Prince Street</sdg:Thoroughfare>
<sdg:AdminUnitLevel1>DK</sdg:AdminUnitLevel1>
<sdg:AdminUnitLevel2>DK011</sdg:AdminUnitLevel2>
</sdg:Address>
<sdg:Classification>ER</sdg:Classification>
</sdg:Agent>
</rim:Element>
</rim:SlotValue>
</rim:Slot>
${this.requeteur.enXML()}
${this.fournisseur.enXML()}
<query:ResponseOption returnType="LeafClassWithRepositoryItem"/>
<query:Query queryDefinition="DocumentQuery">
Expand Down
32 changes: 32 additions & 0 deletions src/ebms/requeteur.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
class Requeteur {
constructor(donnees = {}) {
this.id = donnees.id;
this.nom = donnees.nom;
this.url = donnees.url;
}

enXML() {
return `
<rim:Slot name="EvidenceRequester">
<rim:SlotValue xsi:type="rim:CollectionValueType" collectionType="urn:oasis:names:tc:ebxml-regrep:CollectionType:Set">
<rim:Element xsi:type="rim:AnyValueType">
<sdg:Agent>
<sdg:Identifier schemeID="urn:oasis:names:tc:ebcore:partyid-type:unregistered:FR">${this.id}</sdg:Identifier>
<sdg:Name lang="FR">${this.nom}</sdg:Name>
<sdg:Classification>ER</sdg:Classification>
</sdg:Agent>
</rim:Element>
<rim:Element xsi:type="rim:AnyValueType">
<sdg:Agent>
<sdg:Identifier schemeID="urn:oasis:names:tc:ebcore:partyid-type:unregistered:FR">OOTSFRANCE</sdg:Identifier>
<sdg:Name lang="EN">OOTS-France Intermediary Platform</sdg:Name>
<sdg:Classification>IP</sdg:Classification>
</sdg:Agent>
</rim:Element>
</rim:SlotValue>
</rim:Slot>
`;
}
}

module.exports = Requeteur;
2 changes: 2 additions & 0 deletions src/erreurs.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ class ErreurEchecAuthentification extends Error {}
class ErreurInstructionSOAPInconnue extends Error {}
class ErreurJetonInvalide extends Error {}
class ErreurReponseRequete extends Error {}
class ErreurRequeteurInexistant extends Error {}
class ErreurTypeJustificatifIntrouvable extends Error {}

module.exports = {
Expand All @@ -19,5 +20,6 @@ module.exports = {
ErreurInstructionSOAPInconnue,
ErreurJetonInvalide,
ErreurReponseRequete,
ErreurRequeteurInexistant,
ErreurTypeJustificatifIntrouvable,
};
2 changes: 2 additions & 0 deletions src/ootsFrance.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ const creeServeur = (config) => {
adaptateurEnvironnement,
adaptateurUUID,
depotPointsAcces,
depotRequeteurs,
depotServicesCommuns,
ecouteurDomibus,
horodateur,
Expand All @@ -29,6 +30,7 @@ const creeServeur = (config) => {
adaptateurEnvironnement,
adaptateurUUID,
depotPointsAcces,
depotRequeteurs,
depotServicesCommuns,
}));

Expand Down
11 changes: 10 additions & 1 deletion src/routes/routesEbms.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ const express = require('express');

const EnteteErreur = require('../ebms/enteteErreur');
const EnteteRequete = require('../ebms/enteteRequete');
const Fournisseur = require('../ebms/fournisseur');
const PointAcces = require('../ebms/pointAcces');
const ReponseErreur = require('../ebms/reponseErreur');
const ReponseVerificationSysteme = require('../ebms/reponseVerificationSysteme');
Expand All @@ -28,7 +29,15 @@ const routesEbms = (config) => {
});

routes.get('/messages/requeteJustificatif', (_requete, reponse) => {
const requeteJustificatif = new RequeteJustificatif({ adaptateurUUID, horodateur });
const requeteJustificatif = new RequeteJustificatif(
{ adaptateurUUID, horodateur },
{
fournisseur: new Fournisseur({
pointAcces: { id: 'unIdentifiant', typeId: 'urn:oasis:names:tc:ebcore:partyid-type:unregistered:FR' },
descriptions: { FR: 'Un requêteur' },
}),
},
);

reponse.set('Content-Type', 'text/xml');
reponse.send(requeteJustificatif.corpsMessageEnXML());
Expand Down
2 changes: 2 additions & 0 deletions src/routes/routesRequete.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ const routesRequete = (config) => {
adaptateurEnvironnement,
adaptateurUUID,
depotPointsAcces,
depotRequeteurs,
depotServicesCommuns,
} = config;

Expand All @@ -20,6 +21,7 @@ const routesRequete = (config) => {
adaptateurDomibus,
adaptateurUUID,
depotPointsAcces,
depotRequeteurs,
depotServicesCommuns,
},
requete,
Expand Down
48 changes: 46 additions & 2 deletions test/api/pieceJustificative.spec.js
Original file line number Diff line number Diff line change
@@ -1,26 +1,30 @@
const pieceJustificative = require('../../src/api/pieceJustificative');
const PointAcces = require('../../src/ebms/pointAcces');
const Fournisseur = require('../../src/ebms/fournisseur');
const Requeteur = require('../../src/ebms/requeteur');
const TypeJustificatif = require('../../src/ebms/typeJustificatif');

const {
ErreurAbsenceReponseDestinataire,
ErreurReponseRequete,
ErreurDestinataireInexistant,
ErreurRequeteurInexistant,
ErreurReponseRequete,
} = require('../../src/erreurs');

describe('Le requêteur de pièce justificative', () => {
const adaptateurDomibus = {};
const adaptateurEnvironnement = {};
const adaptateurUUID = {};
const depotPointsAcces = {};
const depotRequeteurs = {};
const depotServicesCommuns = {};

const config = {
adaptateurDomibus,
adaptateurEnvironnement,
adaptateurUUID,
depotPointsAcces,
depotRequeteurs,
depotServicesCommuns,
};
const requete = {};
Expand All @@ -32,6 +36,7 @@ describe('Le requêteur de pièce justificative', () => {
adaptateurDomibus.urlRedirectionDepuisReponse = () => Promise.resolve();
adaptateurUUID.genereUUID = () => '';
depotPointsAcces.trouvePointAcces = () => Promise.resolve({});
depotRequeteurs.trouveRequeteur = () => Promise.resolve(new Requeteur());
depotServicesCommuns.trouveFournisseurs = () => Promise.resolve([new Fournisseur()]);
depotServicesCommuns.trouveTypesJustificatifsPourDemarche = () => Promise.resolve(
[new TypeJustificatif()],
Expand Down Expand Up @@ -124,7 +129,7 @@ describe('Le requêteur de pièce justificative', () => {
return pieceJustificative(config, requete, reponse);
});

it('transmets fournisseur à requête', () => {
it('transmet fournisseur à requête', () => {
expect.assertions(1);

depotServicesCommuns.trouveFournisseurs = () => (
Expand All @@ -143,6 +148,45 @@ describe('Le requêteur de pièce justificative', () => {
return pieceJustificative(config, requete, reponse);
});

it('interroge le dépôt de requêteurs', () => {
expect.assertions(1);
requete.query.idRequeteur = '123456';

depotRequeteurs.trouveRequeteur = (id) => {
expect(id).toBe('123456');
return Promise.resolve(new Requeteur());
};

return pieceJustificative(config, requete, reponse);
});

it('transmet requêteur à requête', () => {
expect.assertions(1);
depotRequeteurs.trouveRequeteur = () => Promise.resolve(new Requeteur({ nom: 'Un requêteur' }));

adaptateurDomibus.envoieMessageRequete = ({ requeteur }) => {
expect(requeteur.nom).toBe('Un requêteur');
return Promise.resolve();
};

return pieceJustificative(config, requete, reponse);
});

it("génère une erreur 422 lorsque le requêteur n'existe pas", () => {
requete.query.idRequeteur = 'requeteurInexistant';
depotRequeteurs.trouveRequeteur = () => Promise.reject(new ErreurRequeteurInexistant('Oups'));

reponse.status = (codeStatus) => {
expect(codeStatus).toEqual(422);
return reponse;
};
reponse.json = (contenu) => {
expect(contenu).toEqual({ erreur: 'Oups' });
};

return pieceJustificative(config, requete, reponse);
});

it('utilise un identifiant de conversation', () => {
adaptateurUUID.genereUUID = () => '11111111-1111-1111-1111-111111111111';

Expand Down
28 changes: 28 additions & 0 deletions test/depots/depotRequeteurs.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
const { ErreurRequeteurInexistant } = require('../../src/erreurs');
const DepotRequeteurs = require('../../src/depots/depotRequeteurs');

describe('Le dépôt des requêteurs', () => {
it('sait retrouver un requêteur en fonction de son identifiant', () => {
const depot = new DepotRequeteurs({
123: { nom: 'un requêteur', url: 'http://example.com' },
});

return depot.trouveRequeteur('123')
.then((requeteur) => {
expect(requeteur.id).toBe('123');
expect(requeteur.nom).toBe('un requêteur');
expect(requeteur.url).toBe('http://example.com');
});
});

it("retourne une exception si le requêteur n'existe pas", () => {
expect.assertions(2);
const depot = new DepotRequeteurs({});

return depot.trouveRequeteur('123')
.catch((e) => {
expect(e).toBeInstanceOf(ErreurRequeteurInexistant);
expect(e.message).toBe('Le requêteur avec comme identifiant "123" est inexistant');
});
});
});
Loading
Loading