import { parseFile } from 'fast-csv' import fs from 'fs' import Ftp from 'ftp' import shell from 'shelljs' import config from '../../../config' import { condoManagerLogger } from '../../logger' import * as FtpHelpers from './ftp' const localDBName = 'bdcondo-local.mdb' export async function getDataFromFTPServer({ managingCompanyCondoManagerId, projectCondoManagerId, projectDir, }) { const connection = new Ftp() await FtpHelpers.connect(connection) condoManagerLogger.info(`Connection created for ${projectCondoManagerId}`) await FtpHelpers.changeDir(connection, `Commun${managingCompanyCondoManagerId}`) await FtpHelpers.changeDir(connection, `Ass${projectCondoManagerId}`) if (!fs.existsSync(`./condomanager/${projectDir}`)) { fs.mkdirSync(`./condomanager/${projectDir}`) } // Write data local to get it later await new Promise((resolve, reject) => connection.get('bdcondo.mdb', (err, stream) => { if (err) { return reject(err) } stream.once('close', resolve) stream.pipe(fs.createWriteStream(`condomanager/${projectDir}/${localDBName}`)) }) ) connection.end() } export async function getDataFromLocalFiles(projectDir) { const dataMapped = {} // Get the tables name const tableNamesString = await new Promise((resolve, reject) => shell.exec( `${config.srcRoot}/scripts/mdtools/mdb-tables condomanager/${projectDir}/${localDBName}`, (err, res) => (err ? reject(err) : resolve(res)) ) ) const tableNames = tableNamesString // @ts-ignore .split(' ') .filter((table) => !!table && table !== '\n') // Parse mdb to csv await tableNames.reduce(async (accumulatorTableNamePromise, tableName) => { await accumulatorTableNamePromise await new Promise((resolve, reject) => shell.exec( `${config.srcRoot}/scripts/mdtools/mdb-export condomanager/${projectDir}/${localDBName} ${tableName} > condomanager/${projectDir}/${tableName}.csv`, (err, res) => (err ? reject(err) : resolve(res)) ) ) }, Promise.resolve()) // Put data into our object. Read csv file await tableNames.reduce(async (accumulatorTableNamePromise, tableName) => { await accumulatorTableNamePromise const dataRows = [] await new Promise((resolve) => parseFile(`condomanager/${projectDir}/${tableName}.csv`, { headers: true, ignoreEmpty: true, trim: true, }) .on('data', (data) => { dataRows.push(data) }) .on('end', resolve) ) dataMapped[tableName] = dataRows }, Promise.resolve()) return dataMapped }