diff --git a/app/controllers/doctemplate.controller.js b/app/controllers/doctemplate.controller.js index 156b6d5..18a3813 100644 --- a/app/controllers/doctemplate.controller.js +++ b/app/controllers/doctemplate.controller.js @@ -230,6 +230,7 @@ exports.createPDFFromDocTemplateName = (req, res) => { console.log('what', __dirname.replace('/controllers', '')); var inputData = JSON.parse(req.query.inputData); var docTemplateName = req.query.docTemplateName; + const site = splitSite.findSiteNumber(req); const eventIds =inputData?.eventIds; Event.find({ '_id': { $in: eventIds } }).then((events) => { const docData = { @@ -263,10 +264,13 @@ exports.createPDFFromDocTemplateName = (req, res) => { }); // var transportationId = req.body.transportationId;d // var transportationName = req.body.transportationName; - DocTemplate.find({name: docTemplateName}).then((data) => { + DocTemplate.findOne({ + name: docTemplateName, + site, + "file.0": { $exists: true } + }).sort({ edit_date: -1, updatedAt: -1, createdAt: -1 }).then((docTemplate) => { try { - if (data && data.length > 0) { - var docTemplate = data[0] || {}; + if (docTemplate) { var templateDoc = `${__dirname.replace('/controllers', '')}${docTemplate?.file[0]?.url}`; var outputFileRandom = Math.ceil(Math.random() * 100000000); var outputFile = `/tmp/${docTemplate.name}_${outputFileRandom}.docx`; @@ -329,6 +333,10 @@ exports.createPDFFromDocTemplateName = (req, res) => { libre.convert(infile, extend, undefined, (err, done) => { if (err) { console.log('Error converting file:', err); + return res.status(500).send({ + success: false, + message: "Error converting doc file to PDF" + }); } // Here in done you have pdf file which you can save or transfer in another stream fs.writeFileSync(outputPdfPath, done); @@ -336,21 +344,33 @@ exports.createPDFFromDocTemplateName = (req, res) => { res.download(outputPdfPath, function(error) { if (error) { console.log('Error in sending download file ${outputPdfPath}'); + return res.status(500).send({ + success: false, + message: "Error downloading generated PDF" + }); } }); }); } catch (e) { console.log(e); + return res.status(500).send({ + success: false, + message: "Error generating PDF from doc template" + }); } } else { res.status(404).send({ success: false, - message: "Docs Template doesn't exist" + message: "Docs Template doesn't exist for this site, or file not uploaded yet" }) } } catch(e) { console.log(e); + return res.status(500).send({ + success: false, + message: "Error processing doc template" + }); } }).catch(err => { res.status(500).send({ @@ -366,6 +386,7 @@ exports.createDocFromDocTemplateName = (req, res) => { var inputData = JSON.parse(req.query.inputData); const eventIds = inputData?.eventIds; var docTemplateName = req.query.docTemplateName; + const site = splitSite.findSiteNumber(req); Event.find({ '_id': { $in: eventIds } }).then((events) => { const docData = { events: [] @@ -397,10 +418,13 @@ exports.createDocFromDocTemplateName = (req, res) => { }); }); - DocTemplate.find({name: docTemplateName}).then((data) => { + DocTemplate.findOne({ + name: docTemplateName, + site, + "file.0": { $exists: true } + }).sort({ edit_date: -1, updatedAt: -1, createdAt: -1 }).then((docTemplate) => { try { - if (data && data.length > 0) { - var docTemplate = data[0] || {}; + if (docTemplate) { var templateDoc = `${__dirname.replace('/controllers', '')}${docTemplate?.file[0]?.url}`; var outputFileRandom = Math.ceil(Math.random() * 100000000); var outputFile = `/tmp/${docTemplate.name}_${outputFileRandom}.docx`; @@ -445,6 +469,10 @@ exports.createDocFromDocTemplateName = (req, res) => { res.download(outputFilename, (error) => { if (error) { console.log('Error in downloading excel') + return res.status(500).send({ + success: false, + message: "Error downloading generated doc file" + }); } }); @@ -453,11 +481,15 @@ exports.createDocFromDocTemplateName = (req, res) => { } else { res.status(404).send({ success: false, - message: "Docs Template doesn't exist" + message: "Docs Template doesn't exist for this site, or file not uploaded yet" }) } } catch(e) { console.log(e); + return res.status(500).send({ + success: false, + message: "Error processing doc template" + }); } }).catch(err => { res.status(500).send({ diff --git a/app/controllers/template-file.controller.js b/app/controllers/template-file.controller.js new file mode 100644 index 0000000..986b09a --- /dev/null +++ b/app/controllers/template-file.controller.js @@ -0,0 +1,176 @@ +const db = require("../models"); +const { splitSite } = require("../middlewares"); + +const DocTemplate = db.doctemplate; +const ExcelTemplate = db.exceltemplate; + +const TEMPLATE_DEFINITIONS = [ + { + key: "medical_notifications_template", + label: "Medical Notifications Template", + type: "doc", + templateName: "med_notification", + modelPath: "doctemplate", + }, + { + key: "visit_record_template", + label: "Visit Record Template", + type: "sheet", + templateName: "visit_record_sheet", + modelPath: "xlsxtemplate", + }, +]; + +const getTemplateDefinition = (key) => TEMPLATE_DEFINITIONS.find((item) => item.key === key); + +const getModelByDefinition = (definition) => ( + definition.type === "doc" ? DocTemplate : ExcelTemplate +); + +const findOrCreateTemplateDoc = async (definition, site, userName) => { + const model = getModelByDefinition(definition); + let templateDoc = await model.findOne({ + name: definition.templateName, + site, + }).sort({ createdAt: -1 }); + + if (!templateDoc) { + templateDoc = await model.create({ + name: definition.templateName, + status: "active", + site, + file: [], + create_by: userName, + create_date: new Date(), + edit_by: userName, + edit_date: new Date(), + edit_history: [{ employee: userName, date: new Date() }], + }); + } + + return templateDoc; +}; + +exports.listTemplates = async (req, res) => { + try { + const site = splitSite.findSiteNumber(req); + const templateRows = []; + + for (const definition of TEMPLATE_DEFINITIONS) { + const model = getModelByDefinition(definition); + const templateDoc = await model.findOne({ + name: definition.templateName, + site, + }).sort({ createdAt: -1 }); + const latestFile = templateDoc?.file?.[0] || null; + + templateRows.push({ + key: definition.key, + label: definition.label, + templateType: definition.type, + templateName: definition.templateName, + site, + templateId: templateDoc?.id || null, + file: latestFile + ? { + name: latestFile.name || "", + originalName: latestFile.originalName || latestFile.name || "", + url: latestFile.url || "", + uploadedAt: latestFile.uploadedAt || templateDoc?.edit_date || templateDoc?.updatedAt || null, + } + : null, + }); + } + + return res.status(200).send({ + success: true, + data: templateRows, + }); + } catch (error) { + return res.status(500).send({ + success: false, + message: error.message, + }); + } +}; + +exports.prepareUploadContext = async (req, res, next) => { + try { + const definition = getTemplateDefinition(req.params.key); + if (!definition) { + return res.status(404).send({ + success: false, + message: "Template key is not supported.", + }); + } + + const site = splitSite.findSiteNumber(req); + const userName = req.headers["x-user-name"] || "system"; + const templateDoc = await findOrCreateTemplateDoc(definition, site, userName); + + req.templateDefinition = definition; + req.templateDoc = templateDoc; + + req.query.objectId = templateDoc.id; + req.query.name = definition.templateName; + req.query.fileType = "template"; + req.query.model = definition.modelPath; + req.query.date = Date.now().toString(); + + return next(); + } catch (error) { + return res.status(500).send({ + success: false, + message: error.message, + }); + } +}; + +exports.uploadTemplate = async (req, res) => { + try { + const templateDoc = req.templateDoc; + const definition = req.templateDefinition; + if (!templateDoc || !definition || !req.file) { + return res.status(400).send({ + success: false, + message: "Template upload request is invalid.", + }); + } + + const userName = req.headers["x-user-name"] || "system"; + const fileUrl = `/files/${definition.modelPath}/${templateDoc.id}/template/${req.file.filename}`; + const fileRecord = { + name: req.file.filename, + originalName: req.file.originalname, + url: fileUrl, + uploadedAt: new Date(), + }; + + templateDoc.file = [fileRecord]; + templateDoc.status = "active"; + templateDoc.edit_by = userName; + templateDoc.edit_date = new Date(); + templateDoc.edit_history = [ + ...(templateDoc.edit_history || []), + { employee: userName, date: new Date() }, + ]; + await templateDoc.save(); + + return res.status(200).send({ + success: true, + data: { + key: definition.key, + templateName: definition.templateName, + templateType: definition.type, + templateId: templateDoc.id, + site: templateDoc.site, + file: fileRecord, + }, + }); + } catch (error) { + return res.status(500).send({ + success: false, + message: error.message, + }); + } +}; diff --git a/app/controllers/xlsxtemplate.controller.js b/app/controllers/xlsxtemplate.controller.js index 1386898..1d5675b 100644 --- a/app/controllers/xlsxtemplate.controller.js +++ b/app/controllers/xlsxtemplate.controller.js @@ -171,6 +171,7 @@ exports.createPDFFromSheetTemplateName = (req, res) => { const eventIds = inputData?.eventIds; console.log('eventIds',eventIds); var excelTemplateName = req.query.excelTemplateName; + const site = splitSite.findSiteNumber(req); console.log('template', excelTemplateName); Event.find({ '_id': { $in: eventIds } }).then((events) => { @@ -233,10 +234,13 @@ exports.createPDFFromSheetTemplateName = (req, res) => { // var transportationId = req.body.transportationId;d // var transportationName = req.body.transportationName; - ExcelTemplate.find({name: excelTemplateName}).then((data) => { + ExcelTemplate.findOne({ + name: excelTemplateName, + site, + "file.0": { $exists: true } + }).sort({ edit_date: -1, updatedAt: -1, createdAt: -1 }).then((excelTemplate) => { try { - if (data && data.length > 0) { - var excelTemplate = data[0] || {}; + if (excelTemplate) { var templateExcel = `${__dirname.replace('/controllers', '')}${excelTemplate?.file[0]?.url}`; var outputFileRandom = Math.ceil(Math.random() * 100000000); var outputFile = `/tmp/${excelTemplate.name}_${outputFileRandom}.xlsx`; @@ -265,6 +269,10 @@ exports.createPDFFromSheetTemplateName = (req, res) => { libre.convert(infile, extend, undefined, (err, done) => { if (err) { console.log('Error converting file:', err); + return res.status(500).send({ + success: false, + message: "Error converting sheet file to PDF" + }); } // Here in done you have pdf file which you can save or transfer in another stream fs.writeFileSync(outputPdfPath, done); @@ -272,21 +280,33 @@ exports.createPDFFromSheetTemplateName = (req, res) => { res.download(outputPdfPath, function(error) { if (error) { console.log('Error in sending download file ${outputPdfPath}'); + return res.status(500).send({ + success: false, + message: "Error downloading generated PDF" + }); } }); }); } catch (e) { console.log(e); + return res.status(500).send({ + success: false, + message: "Error generating PDF from sheet template" + }); } } else { res.status(404).send({ success: false, - message: "Sheet Template doesn't exist" + message: "Sheet Template doesn't exist for this site, or file not uploaded yet" }) } } catch(e) { console.log(e); + return res.status(500).send({ + success: false, + message: "Error processing sheet template" + }); } }).catch(err => { res.status(500).send({ @@ -306,6 +326,7 @@ exports.createSheetFromTemplateName = (req, res) => { var inputData = JSON.parse(req.query.inputData); const eventIds = inputData?.eventIds; var excelTemplateName = req.query.excelTemplateName; + const site = splitSite.findSiteNumber(req); Event.find({ '_id': { $in: eventIds } }).then((events) => { Resource.find({}).then((resources) => { @@ -362,10 +383,13 @@ exports.createSheetFromTemplateName = (req, res) => { } // var transportationId = req.body.transportationId;d // var transportationName = req.body.transportationName; - ExcelTemplate.find({name: excelTemplateName}).then((data) => { + ExcelTemplate.findOne({ + name: excelTemplateName, + site, + "file.0": { $exists: true } + }).sort({ edit_date: -1, updatedAt: -1, createdAt: -1 }).then((excelTemplate) => { try { - if (data && data.length > 0) { - var excelTemplate = data[0] || {}; + if (excelTemplate) { var templateExcel = `${__dirname.replace('/controllers', '')}${excelTemplate?.file[0]?.url}`; var outputFileRandom = Math.ceil(Math.random() * 100000000); var outputFile = `/tmp/${excelTemplate.name}_${outputFileRandom}.xlsx`; @@ -387,17 +411,25 @@ exports.createSheetFromTemplateName = (req, res) => { res.download(outputFile, (error) => { if (error) { console.log('Error in downloading excel') + return res.status(500).send({ + success: false, + message: "Error downloading generated sheet file" + }); } }) console.log('Download finish'); } else { res.status(404).send({ success: false, - message: "Sheet Template doesn't exist" + message: "Sheet Template doesn't exist for this site, or file not uploaded yet" }) } } catch(e) { console.log(e); + return res.status(500).send({ + success: false, + message: "Error processing sheet template" + }); } }).catch(err => { res.status(500).send({ diff --git a/app/routes/template-file.route.js b/app/routes/template-file.route.js new file mode 100644 index 0000000..199191a --- /dev/null +++ b/app/routes/template-file.route.js @@ -0,0 +1,29 @@ +const { authJwt } = require("../middlewares"); +const uploadPhysicalFile = require("../middlewares/upload_physical"); + +module.exports = (app) => { + const templates = require("../controllers/template-file.controller.js"); + const router = require("express").Router(); + + const handleUploadMiddleware = (req, res, next) => { + uploadPhysicalFile(req, res, (err) => { + if (err) { + return res.status(500).send({ + message: `Upload Error: ${err.message || err}`, + }); + } + return next(); + }); + }; + + router.get("/", [authJwt.verifyToken], templates.listTemplates); + router.post( + "/:key/upload", + [authJwt.verifyToken], + templates.prepareUploadContext, + handleUploadMiddleware, + templates.uploadTemplate + ); + + app.use("/api/template-files", router); +}; diff --git a/app/views/asset-manifest.json b/app/views/asset-manifest.json index 9af810a..5fcd215 100644 --- a/app/views/asset-manifest.json +++ b/app/views/asset-manifest.json @@ -1,16 +1,16 @@ { "files": { "main.css": "/static/css/main.46cc12be.css", - "main.js": "/static/js/main.3ecb6fce.js", + "main.js": "/static/js/main.1eb25967.js", "static/js/787.c4e7f8f9.chunk.js": "/static/js/787.c4e7f8f9.chunk.js", "static/media/landing.png": "/static/media/landing.d4c6072db7a67dff6a78.png", "index.html": "/index.html", "main.46cc12be.css.map": "/static/css/main.46cc12be.css.map", - "main.3ecb6fce.js.map": "/static/js/main.3ecb6fce.js.map", + "main.1eb25967.js.map": "/static/js/main.1eb25967.js.map", "787.c4e7f8f9.chunk.js.map": "/static/js/787.c4e7f8f9.chunk.js.map" }, "entrypoints": [ "static/css/main.46cc12be.css", - "static/js/main.3ecb6fce.js" + "static/js/main.1eb25967.js" ] } \ No newline at end of file diff --git a/app/views/index.html b/app/views/index.html index 3305329..e617937 100644 --- a/app/views/index.html +++ b/app/views/index.html @@ -1 +1 @@ -
| ".concat(e.label," | ")})).join(""),"\n
|---|
| ".concat(t[e.key]||""," | ")})).join(""),"\n