diff --git a/package.json b/package.json index b6c3ec4..e0bc9d7 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "express": "~4.16.1", "http-errors": "~1.6.3", "jalali-moment": "^3.3.10", + "lodash": "^4.17.21", "morgan": "~1.9.1", "persianjs": "^0.4.0", "pg": "^8.5.1", diff --git a/tools/docxtemp.js b/tools/docxtemp.js index b502750..4600659 100644 --- a/tools/docxtemp.js +++ b/tools/docxtemp.js @@ -2,6 +2,7 @@ const PizZip = require('pizzip'); const Docxtemplater = require('docxtemplater'); const fs = require('fs'); const path = require('path'); +const _ = require("lodash"); // The error object contains additional information when logged with JSON.stringify (it contains a properties object containing all suberrors). function replaceErrors(key, value) { @@ -30,26 +31,69 @@ function errorHandler(error) { throw error; } +class InspectModule { + constructor() { + this.inspect = {}; + } + set(obj) { + if (obj.inspect) { + this.inspect = _.merge({}, this.inspect, obj.inspect); + } + } +} + +const getTags = function (postParsed) { + return postParsed.filter(function (part) { + return part.type === "placeholder"; + }).reduce(function (tags, part) { + tags[part.value] = {}; + if (part.subparsed) { + tags[part.value] = getTags(part.subparsed); + } + return tags; + }, {}); +} + module.exports = function (templateInfo, fileName) { return new Promise((resolve, reject) => { + + //check empty fields for (const key in templateInfo) { if (!templateInfo[key]) { throw({ eCode: 406, - eText: 'empty fields' + eText: 'هیچ یک از فیلدها نباید خالی باشند' }) } } + let content = fs.readFileSync(path.resolve(__dirname, `../template/${fileName}`), 'binary'); let zip = new PizZip(content); let doc; - + let inspectModule = new InspectModule(); + try { - doc = new Docxtemplater(zip); + doc = new Docxtemplater(zip,{ + modules: [inspectModule] + }); } catch (error) { errorHandler(error); } + + let postParsed = inspectModule.inspect.postparsed; + let tags = Object.keys(getTags(postParsed)) + let templateInfoKeys = Object.keys(templateInfo) + + //compare template tags and received fields from client(templateInfo) + for(let i = 0; i < tags.length; i++){ + if(!templateInfoKeys.includes(tags[i]) ){ + throw({ + eCode: 406, + eText: 'اطلاعات وارد شده ناقص است' + }) + }; + }; doc.setData(templateInfo);