177 lines
4.8 KiB
JavaScript
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,
|
|
});
|
|
}
|
|
};
|