Files
worldshine-redesign/app/controllers/template-file.controller.js
2026-03-05 15:40:16 -05:00

177 lines
4.8 KiB
JavaScript

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,
});
}
};