UNPKG

@gouvfr-anct/mednum

Version:

✨ Permet de transformer une source de données vers le schéma des lieux de mediation numerique

73 lines (72 loc) 4.63 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.transformerAction = void 0; const flat_1 = require("flat"); const lieux_de_mediation_numerique_1 = require("@gouvfr-anct/lieux-de-mediation-numerique"); const node_crypto_1 = require("node:crypto"); const common_1 = require("../../../common"); const data_1 = require("../../data"); const input_1 = require("../../input"); const report_1 = require("../../report"); const diff_since_last_transform_1 = require("../diff-since-last-transform"); const transformation_respository_1 = require("./transformation.respository"); const REPORT = (0, report_1.Report)(); const replaceNullWithEmptyString = (jsonString) => { const replacer = (_, values) => values ?? ''; return JSON.stringify(JSON.parse(jsonString), replacer); }; const lieuxToTransform = (sourceItems, diffSinceLastTransform) => (0, diff_since_last_transform_1.canTransform)(diffSinceLastTransform) ? diffSinceLastTransform.toUpsert : sourceItems; const nothingToTransform = (itemsToTransform) => (0, diff_since_last_transform_1.canTransform)(itemsToTransform) && itemsToTransform.toDelete.length === 0 && itemsToTransform.toUpsert.length === 0; const shouldAbortWhenHashIsUnchanged = (transformerOptions) => async (sourceHash) => { if (transformerOptions.force) { console.log('1. La vérification de la différence par rapport au hash de la transformation précédente est désactivée'); return false; } console.log('1. Vérification de la différence par rapport au hash de la transformation précédente'); if ((await (0, data_1.sourcesFromCartographieNationaleApi)(transformerOptions)).get(transformerOptions.sourceName) === sourceHash) { console.log("2. Il n'y a pas de différence par rapport à la transformation précédente"); return true; } return false; }; const transformerAction = async (transformerOptions) => { const maxTransform = process.env['MAX_TRANSFORM'] == null ? undefined : +process.env['MAX_TRANSFORM']; const source = await (0, data_1.sourceATransformer)(transformerOptions); const sourceHash = (0, node_crypto_1.createHash)('sha256').update(source).digest('hex'); if (await shouldAbortWhenHashIsUnchanged(transformerOptions)(sourceHash)) return; const sourceItems = JSON.parse(replaceNullWithEmptyString(source)).slice(0, maxTransform); console.log('2. Initialisation des services tiers'); const repository = await (0, transformation_respository_1.transformationRespository)(transformerOptions); console.log('3. Calcul de la différence depuis la dernière transformation'); const diffSinceLastTransform = repository.diffSinceLastTransform(sourceItems); if (nothingToTransform(diffSinceLastTransform)) { console.log("4. Il n'y a rien à transformer"); return; } const lieux = lieuxToTransform(sourceItems, diffSinceLastTransform); console.log('4. Transformation des données vers le schéma des lieux de mediation numérique'); const lieuxDeMediationNumerique = (await Promise.all(lieux .map((dataSource) => (0, flat_1.flatten)(dataSource, { safe: true })) .map((0, input_1.toLieuxMediationNumerique)(repository, transformerOptions.sourceName, REPORT)))).filter(input_1.validValuesOnly); if (diffSinceLastTransform != null) { console.log('Lieux à ajouter :', diffSinceLastTransform.toUpsert.length); console.log('Lieux à supprimer :', diffSinceLastTransform.toDelete.length); } console.log("5. Sauvegarde du rapport d'erreur"); repository.saveErrors(REPORT); console.log('6. Sauvegarde des sorties'); await repository.saveOutputs(lieuxDeMediationNumerique); if (transformerOptions.force) return; console.log('7. Sauvegarde des empruntes'); await repository.saveFingerprints(diffSinceLastTransform); if (transformerOptions.cartographieNationaleApiKey == null) return; console.log('8. Sauvegarde du hash de la source'); await (0, data_1.updateSourceWithCartographieNationaleApi)(transformerOptions)(sourceHash); const lieuxToPublish = (await (0, common_1.paginate)(`${transformerOptions.cartographieNationaleApiUrl}/lieux-inclusion-numerique/with-duplicates?page[number]=0&page[size]=10000`, `source[eq]=${transformerOptions.sourceName}&mergedIds[exists]=false`)).map(lieux_de_mediation_numerique_1.fromSchemaLieuDeMediationNumerique); console.log('9. Sauvegarde des fichiers de sortie'); await (0, data_1.saveOutputsInFiles)(transformerOptions)(lieuxToPublish); }; exports.transformerAction = transformerAction;