From 50997abf9fdff078ac89dfbefc17bd23e7e55dbf Mon Sep 17 00:00:00 2001 From: Onja Date: Tue, 10 Oct 2023 15:55:38 +0300 Subject: [PATCH] Add FileService class to parse CSV data from a given URL and return a stream for download --- src/routes/index.js | 19 +++++++++++++++++-- src/services/file.js | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 src/services/file.js diff --git a/src/routes/index.js b/src/routes/index.js index ecca96a..3278f7d 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -1,9 +1,24 @@ var express = require('express'); var router = express.Router(); +const FileService = require('../services/file'); + /* GET home page. */ -router.get('/', function(req, res, next) { - res.render('index', { title: 'Express' }); +router.get('/', async function(req, res, next) { + const url = 'https://bodacc-datadila.opendatasoft.com/api/explore/v2.1/catalog/datasets/annonces-commerciales/exports/csv?lang=fr&refine=publicationavis%3A%22A%22&refine=publicationavis_facette%3A%22Bodacc%20A%22&refine=familleavis_lib%3A%22Ventes%20et%20cessions%22&timezone=Asia%2FBaghdad&use_labels=true&delimiter=%3B'; + + const columns = ['id', 'region_code', 'listepersonnes.personne.typePersonne', 'listepersonnes.personne.denomination', 'listeetablissements.etablissement.adresse', 'listeprecedentproprietaire.personne.nom', 'listeprecedentproprietaire.personne.prenom']; + + const fileService = new FileService(); + const stream = await fileService.parseFromUrl(url, columns); + + if ( !stream ) { + return res.status(500).send('Invalid stream'); + } + + stream.pipe(res); + + // res.render('index', { title: 'Express' }); }); module.exports = router; diff --git a/src/services/file.js b/src/services/file.js new file mode 100644 index 0000000..5981c6a --- /dev/null +++ b/src/services/file.js @@ -0,0 +1,40 @@ +const EventEmitter = require('events'); +const csv = require('csv-parser'); + +const File = require('../models/File'); + +// Create a class FileService that extends EventEmitter +class FileService extends EventEmitter { + + + async parseFromUrl(url, columns) { + this.emit('parseFromUrl.start', { url, columns }); + + // Check if url is valid + if (!url) { + this.emit('parseFromUrl.error', { url, columns, error: 'Invalid url' }); + return Promise.reject(new Error('Invalid url')); + } + + // Check columns + if (!columns || !Array.isArray(columns) || columns.length === 0) { + this.emit('parseFromUrl.error', { url, columns, error: 'Invalid columns' }); + return Promise.reject(new Error('Invalid columns')); + } + + // Create a new File instance + const file = new File(url); + const filepath = await file.download(); + + const stream = file.parse(columns); + if ( !stream ) { + this.emit('parseFromUrl.error', { url, columns, error: 'Invalid stream' }); + return Promise.reject(new Error('Invalid stream')); + } + + this.emit('parseFromUrl.end', { url, columns, filepath }); + return Promise.resolve(stream); + } +} + +module.exports = FileService; \ No newline at end of file