Browse Source

Add FileService class to parse CSV data from a given URL and return a stream for download

node16
Onja 12 months ago
parent
commit
50997abf9f
  1. 19
      src/routes/index.js
  2. 40
      src/services/file.js

19
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;

40
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;
Loading…
Cancel
Save