'use strict'; const { parseDoorLockDataFile, writeDoorLockEvent } = require('../services/doorLock/doorLock'); const { fetchAllBookings, writeBookingReservation } = require('../services/officeRnD/bookings'); const { calculateDoorLockCharges } = require('../services/integration/doorLockCharges'); const { integrationServiceErrors } = require('../constants/constants'); const IncomingForm = require('formidable').IncomingForm; const uploadDoorLockData = (req, res) => { const form = new IncomingForm(); const fileParsers = []; form.on('file', (field, file) => { if (file && file.type === 'text/csv') { fileParsers.push(parseDoorLockDataFile(file)); } }); form.on('end', () => { Promise.all(fileParsers) .then((parserResults) => { const parsedData = []; const parserErrors = []; const unknownMembers = []; parserResults.forEach((parserResult) => { parsedData.push(...parserResult.parsedData); parserErrors.push(...parserResult.errors); parserResult.unknownMembers.forEach((newUnknownMember) => { // Check if member is already labeled as unknown in different file if (!unknownMembers.find((unknownMember) => unknownMember.details === newUnknownMember.details)){ unknownMembers.push(newUnknownMember); } }); }); const asyncWriteJobs = []; parsedData.forEach((entry) => asyncWriteJobs.push(writeDoorLockEvent(entry))); Promise.all(asyncWriteJobs) .then(() => { res.json({ parsedData, parserErrors, unknownMembers }); }) .catch((error) => { console.log(integrationServiceErrors.FAILED_TO_SAVE_DOOR_LOCK_ENTRIES); console.log(error); res.status(500).send(integrationServiceErrors.FAILED_TO_SAVE_DATA_GENERIC); }); fetchAllBookings() .then((bookingEntries) => { const asyncJobs = []; bookingEntries.forEach((bookingEntry) => asyncJobs.push(writeBookingReservation(bookingEntry))); Promise.all(asyncJobs) .then(() => { calculateDoorLockCharges(); }); }) .catch((error) => { console.log(integrationServiceErrors.FAILED_TO_SAVE_BOOKINGS); console.log(error); return; }); }) .catch((error) => { res.status(500).send(error); }); }); form.parse(req); }; module.exports = { uploadDoorLockData, };