@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
JavaScript
;
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;