-
Notifications
You must be signed in to change notification settings - Fork 1
/
index.js
128 lines (115 loc) · 3.51 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
const fs = require('fs');
const htmlToPdf = require('html-pdf');
const AWS = require('aws-sdk');
AWS.config.region = 'eu-west-1';
var s3bucket = new AWS.S3({
params: {
Bucket: process.env.AWS_S3_INVOICE_BUCKET
}
});
const mustasche = require('mustache');
const log = require('./log');
/* TODO: Should probably use redis/memcache for this */
const template = {};
const templateText = {};
const getTemplate = (templateName) => {
if(template[templateName]) {
return template[templateName];
}
try {
let tmp = fs.readFileSync(`${__dirname}/templates/${templateName}.html`, 'utf8'); /* maybe verify before */
if(tmp) {
template[templateName] = tmp;
}
return tmp;
} catch(e) {
console.log("error", e);
log.error(e, 'invoice pdf generator');
return null;
}
}
const text = (templateName) => {
let textTemplateName = `${templateName}-text`;
if(!templateText[textTemplateName]) {
try {
let text = require(`${__dirname}/templates/${textTemplateName}.json`);
if(text) {
templateText[textTemplateName] = text;
return text;
}
} catch(e) {
console.log("error", e);
log.error(e, 'invoice pdf generator');
return null;
}
} else {
return templateText[textTemplateName];
}
}
const updateText = (data) => {
if(!data.text || !data.model || !data.model.rr) return data;
if(!data.text.rrWork) return data;
data.text.rrWork = data.model.rr.type === "Rut" ? data.text.rutWork : data.text.rrWork;
console.log("update text", data);
return data;
}
const render = (templateName, data) => {
let htmlTemplate = getTemplate(templateName);
if(htmlTemplate == null) {
return null;
}
if(!data.text) {
data.text = text(templateName);
}
let html = mustasche.render(htmlTemplate, updateText(data));
return html;
}
const pdf = (templateName, data, next) => {
let html = render(templateName, data);
if(html == null) {
return next('TEMPLATE_NOT_FOUND');
}
let options = {
format: 'Letter',
"header": {
"height": "10mm",
"contents": render('header', data)
},
"footer": {
"height": "10mm",
"contents": {
default: '<div style="text-align: center;"><strong style="color: #444;">{{page}}</strong>/<strong>{{pages}}</strong></div>'
}
},
};
htmlToPdf.create(html, options).toStream(next);
}
const uploadS3 = (templateName, data, next) => {
pdf(templateName, data, (err, stream) => {
if(err) {
log.error(err, 'invoice pdf generator');
console.log("Error uploading data: ", err);
return next('UNHANDLED_EXCEPTION');
}
const s3Params = {
Key: data.model.fileName,
Expires: new Date(Date.now() + 31536000),
CacheControl: `public, max-age=${31536000}`,
Body: stream,
ContentType: 'application/pdf',
ACL: 'public-read'
};
s3bucket.upload(s3Params, function(err, result) {
if (err) {
log.error(err, 's3-upload');
console.log("Error uploading data: ", err);
return next('UNHANDLED_EXCEPTION');
} else {
return next(null, result.Location);
}
});
});
}
module.exports = {
pdf, render, uploadS3
}