-
Notifications
You must be signed in to change notification settings - Fork 20
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
[TRA 15238] Export SSD #3755
base: dev
Are you sure you want to change the base?
[TRA 15238] Export SSD #3755
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Top!
Y'aura pas mal de petits console log à cleaner, mais hâte de voir ça 🥳
logger.info(`Error on output stream for export ${exportId}`, error); | ||
await upload?.abort(); | ||
}); | ||
if (registryExport.format === RegistryExportFormat.CSV) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Est ce qu'on ne sortirait pas la création des transformers CSV/xls de cette fonction pour alléger un peu la lecture?
…istry export job structure, shared gql generated types, db lookup streaming, ssdWaste mapping
…oader. simplify queries and access check, modify export to fit to spec
…ort v2 form, add delegators on companies resolver to create registry export companies list
@@ -8,6 +8,7 @@ generates: | |||
config: | |||
contextType: ../../types#GraphQLContext | |||
enumsAsTypes: true | |||
allowParentTypeOverride: true |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
permet de spécifier le type d'entrée dans les resolvers même si il ne correspond pas au type de sortie (type Prisma/Zod ≠ type GraphQL par exemple)
isDormant: company.isDormantSince !== null, | ||
libelleNaf: company.codeNaf ? libelleFromCodeNaf(company.codeNaf) : "" | ||
}; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
mapping utilisé pour résoudre RegistryLookup.companies, mais possible de l'utiliser ailleurs si besoin
…ons for docs generation
Quality Gate failedFailed conditions See analysis details on SonarQube Cloud Catch issues before they fail your Quality Gate with our IDE extension SonarQube for IDE |
Features
Backend
generateWastesRegistryExport
pour lancer un export registreregistryExports
,registryExport
pour récupérer les infos sur les exports effectuésregistryExportDownloadSignedUrl
pour récupérer le lien de téléchargement d'un exportFrontend
demo.export.updated.mov
Tech
Nouveau codegen GraphQL dans /libs
Afin d'avoir accès aux types graphQL dans /libs, ajout d'une génération de types équivalent à ceux de la backend dans /libs/back/codegen (équivalent à ce qui est fait pour la front). Il faut ensuite utiliser ces types en back et de retirer la génération legacy (pas fait dans cette PR pour ne pas l'alourdir inutilement).⚠️ J'ai peut-être oublié la phase de génération (
npx nx run @td/codegen-back:build
) à des endroits (deployment, test,...), si vous pouvez vérifier.Table RegistryLookup pour les exports
Afin d'avoir des exports performants, on utilise une table unifiée RegistryLookup, qui doit être mise à jour à la création/update/suppression de lignes de registres, mais aussi à la création/update/suppression de bordereaux, à la façon des updates d'elastic. Pour l'instant ce nouveau système de registre cohabite avec l'ancien, mais vise à le remplacer.
Cette table comporte des index et des système d'uuid pour permettre une recherche efficiente sur des millions de lignes.
Elle comprend une ligne par déclaration/bordereau et par type de registre d'export où celà doit apparaître. Pour les registres SSD traîtés ici, ils n'apparaissent que dans un seul registre (SSD), mais pour les bordereaux, ily aura une ligne par registre d'export concerné.
La logique de mise à jour de cette table se trouve dans
libs/back/registry/src/lookup/utils.ts
.Lancement d'export et affinage des données
Les demandes d'export arrivant dans
generateWastesRegistryExport
passent par une validation des privilèges, puis les différents sirets accessibles à l'utilisateur sont triés, en fonction de si la demande est fait pour tous les établissements, un seul siret, ou en tant que délégataire. Les choix des différents filtres sont ajoutés à l'objet registryExport, qui sert de source d'infos pour le job d'export (comme ça pas besoin de refaire le traitement dans le job). Seules les dates (dateRange) sont transmises au job tel quel, car la structure du filtre de dates est un peu trop complexe pour la stocker dans registryExport avec toutes ses nuances (supérieur (ou égal), strictement supérieur, etc). Seule une version simplifiée des dates est stockée dans RegistryExport pour l'affichage.Process d'exports et pipelines
La logique d'export dans
back/src/queue/jobs/processRegistryExport.ts
est faite pour optimiser le process au maximum. L'élément central est l'utilisation de streams pour récupérer les données depuis la db (dansstreamLookup
) puis de piper ces données dans des transformers (qui préparent la donnée), dans des utilitaires csv/xls pour créer les bons formats de fichier, puis dans le stream de sortie.De cette façon, pas plus de quelques centaines de lignes sont en mémoire à la fois, et la lecture de la db se fait à la vitesse à laquelle les données peuvent être uploadées en sortie. Les valeurs de pagination de la lecture en db (pages de 100 lignes, avec un buffer de 200 lignes dans le stream) ont été choisies arbitrairement et peuvent probablement être affinées à l'avenir.
Changement de dependencies
Déploiement
Ajouter un bucket S3, et ajouter la var d'env S3_REGISTRY_EXPORTS_BUCKET (déjà fait pour recette)