Files
mwitnessing/pages/api/upload.ts
2024-02-22 04:19:38 +02:00

94 lines
2.8 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import type { NextApiRequest, NextApiResponse } from 'next';
import { createRouter, expressWrapper } from "next-connect";
import multer from 'multer';
import excel from "../../src/helpers/excel";
import common from "../../src/helpers/common";
const upload = multer({
storage: multer.memoryStorage(),
});
const progressStore = {};
// Update the progressStore instead of the session
function updateProgress(fileId, progress) {
progressStore[fileId] = progress;
};
function getProgress(fileId) {
return progressStore[fileId] || 0;
};
const router = createRouter<NextApiRequest, NextApiResponse>();
router.use(expressWrapper(upload.single('file')))
.post(async (req, res) => {
try {
if (!req.file) {
return res.status(400).json({ message: 'No file uploaded' });
}
// Extract the action and date from query parameters
const { action, date } = req.query;
// Generate a unique upload ID
const fileId = new Date().getTime().toString();
// Initialize progress
updateProgress(fileId, 1);
if (action === 'readword') {
// Start file processing asynchronously
processWordFile(req.file.buffer, date, fileId, true)
.catch(error => {
// Handle any errors here
updateProgress(fileId, 0);
console.error('Грешка при обработката на файла:', error);
});
// Respond immediately
res.status(200).json({ message: 'Файла е качен. Започна обработката на данните.', fileId });
} else {
// Handle other actions or return an error
res.status(400).json({ message: 'Невалидно или неоточнено действие.' });
}
} catch (error) {
// Error handling
res.status(500).json({ message: 'Вътрешна грешка на сървъра', error: error.message });
}
})
.get((req, res) => {
console.log('Progress check handler');
const { fileId } = req.query;
var progress = getProgress(fileId);
res.status(200).json({ progress });
}
)
// Asynchronous file processing function
async function processWordFile(fileBuffer, dateString, fileId, createAvailabilities) {
const [year, month, day] = dateString.split('-');
await excel.ReadDocxFileForMonth(null, fileBuffer, month, year, (currentProgress) => {
updateProgress(fileId, currentProgress);
}, createAvailabilities);
}
// // Progress check handler - moved to server.js
// router.get('/progress/:id', (req, res) => {
// const { fileId } = req.query;
// var progress = getProgress(fileId);
// res.status(200).json({ progress });
// });
const handler = (req: NextApiRequest, res: NextApiResponse) => {
router.run(req, res);
};
export default handler;
export const config = {
api: {
bodyParser: false, // Necessary for file upload
},
};