2018-12-20 16:54:05 +01:00
|
|
|
import express from "express";
|
2019-01-05 12:21:30 +01:00
|
|
|
import cors from "cors";
|
2019-01-05 13:15:09 +01:00
|
|
|
import bodyParser from "body-parser";
|
2018-12-20 16:54:05 +01:00
|
|
|
import path from "path";
|
2019-01-05 12:47:06 +01:00
|
|
|
import fs from "fs";
|
2018-12-20 16:54:05 +01:00
|
|
|
import formidable from "formidable";
|
|
|
|
import shellExec from "shell-exec";
|
|
|
|
|
|
|
|
const app = express();
|
2019-01-05 12:21:30 +01:00
|
|
|
app.use(cors());
|
2019-01-05 13:15:09 +01:00
|
|
|
app.use(bodyParser.json());
|
2018-12-20 16:54:05 +01:00
|
|
|
const port = process.env.PORT || 4000;
|
2018-12-20 16:59:29 +01:00
|
|
|
const formats = ['pdf','ps'];
|
|
|
|
const sizes = ['full', 'a4','a3','a2','a1','a0','letter','tabloid'];
|
2018-12-20 16:54:05 +01:00
|
|
|
|
|
|
|
app.get("/", async (req, res) => res.sendFile(path.resolve(__dirname+'/form.html')));
|
|
|
|
app.post("/", async (req, res) => {
|
|
|
|
let form = new formidable.IncomingForm();
|
|
|
|
form.parse(req, (err, fields, files) => {
|
2018-12-20 16:59:29 +01:00
|
|
|
if(err || typeof files.svg === "undefined" ||
|
2018-12-20 16:54:05 +01:00
|
|
|
formats.indexOf(fields.format) === -1 ||
|
|
|
|
sizes.indexOf(fields.size) === -1
|
|
|
|
) return res.sendFile(path.resolve(__dirname+'/form.html'));
|
|
|
|
let upload = files.svg.path;
|
|
|
|
let cmd;
|
|
|
|
if(fields.size === "full") { // Do not tile
|
|
|
|
let target = `/tmp/pattern.${fields.format}`;
|
|
|
|
cmd = `/usr/bin/inkscape --export-${fields.format}=${target} ${upload}`;
|
|
|
|
shellExec(cmd).then(() => {
|
|
|
|
return res.sendFile(target);
|
|
|
|
});
|
|
|
|
} else { // Do tile
|
|
|
|
let untiled = "/tmp/untiled.ps";
|
|
|
|
let tiled = "/tmp/tiled.ps";
|
|
|
|
cmd = `/usr/bin/inkscape --export-ps=${untiled} ${upload}`;
|
|
|
|
shellExec(cmd).then(() => {
|
|
|
|
cmd = `/usr/local/bin/tile -a -m${fields.size} -s1 -t"On-demand tiler" ${untiled} > ${tiled}`;
|
|
|
|
shellExec(cmd).then(() => {
|
|
|
|
if(fields.format === "ps") return res.sendFile(tiled);
|
|
|
|
cmd = `/usr/bin/ps2pdf14 ${tiled} ${tiled}.pdf`;
|
|
|
|
shellExec(cmd).then(() => {
|
|
|
|
return res.sendFile(tiled+'.pdf');
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2019-01-05 12:47:06 +01:00
|
|
|
app.post("/api", async (req, res) => {
|
|
|
|
if(
|
2019-01-05 13:15:09 +01:00
|
|
|
typeof req.body.svg === "undefined" ||
|
|
|
|
typeof req.body.format === "undefined" ||
|
2019-01-05 19:00:41 +00:00
|
|
|
typeof req.body.size === "undefined" ||
|
|
|
|
formats.indexOf(req.body.format) === -1 ||
|
|
|
|
sizes.indexOf(req.body.size) === -1
|
|
|
|
)
|
2019-01-05 12:47:06 +01:00
|
|
|
return res.sendStatus(400);
|
2019-01-06 14:53:28 +01:00
|
|
|
let storage = "/fs/storage/tmp/";
|
|
|
|
let dir = createTempDir(storage);
|
|
|
|
let svg = storage+dir+"/draft.svg";
|
|
|
|
let cmd = "";
|
2019-01-05 12:47:06 +01:00
|
|
|
// Save svg to disk
|
2019-01-06 14:53:28 +01:00
|
|
|
fs.writeFile(svg, req.body.svg, err => {
|
2019-01-05 12:47:06 +01:00
|
|
|
if(err) return res.sendStatus(500);
|
2019-01-06 14:53:28 +01:00
|
|
|
let target = storage+dir+"/pattern-"+req.body.size+".pdf";
|
2019-01-05 19:00:41 +00:00
|
|
|
if(req.body.size === "full") { // Do not tile
|
2019-01-06 14:53:28 +01:00
|
|
|
cmd = "/usr/bin/inkscape --export-pdf="+target+" "+svg;
|
2019-01-05 12:47:06 +01:00
|
|
|
shellExec(cmd).then(() => {
|
2019-01-05 19:28:48 +00:00
|
|
|
return res.send({link: process.env.TILER_DOWNLOAD+"/tmp/"+dir+"/pattern-full.pdf"});
|
2019-01-05 12:47:06 +01:00
|
|
|
});
|
|
|
|
} else { // Do tile
|
2019-01-06 14:53:28 +01:00
|
|
|
let untiled = storage+dir+"/untiled.ps";
|
|
|
|
let tiled = storage+dir+"/tiled.ps";
|
|
|
|
cmd = `/usr/bin/inkscape --export-ps=${untiled} ${svg}`;
|
2019-01-05 12:47:06 +01:00
|
|
|
shellExec(cmd).then(() => {
|
2019-01-06 14:53:28 +01:00
|
|
|
cmd = `/usr/local/bin/tile -a -m${req.size} -s1 -t"freesewing.org" ${untiled} > ${tiled}`;
|
|
|
|
console.log('tile cmd', cmd);
|
2019-01-05 12:47:06 +01:00
|
|
|
shellExec(cmd).then(() => {
|
2019-01-06 14:53:28 +01:00
|
|
|
cmd = `/usr/bin/ps2pdf14 ${tiled} ${target}`;
|
2019-01-05 12:47:06 +01:00
|
|
|
shellExec(cmd).then(() => {
|
2019-01-06 14:53:28 +01:00
|
|
|
return res.send({link: process.env.TILER_DOWNLOAD+"/tmp/"+dir+"/pattern-"+req.body.size+".pdf"});
|
2019-01-05 12:47:06 +01:00
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2019-01-05 19:28:48 +00:00
|
|
|
|
2019-01-06 14:53:28 +01:00
|
|
|
const createTempDir = (folder) => {
|
2019-01-05 19:28:48 +00:00
|
|
|
let dir = newDir();
|
2019-01-06 14:53:28 +01:00
|
|
|
let path = folder+dir;
|
2019-01-05 19:28:48 +00:00
|
|
|
fs.mkdir(path, {recursive: true}, (err) => {
|
2019-01-06 14:53:28 +01:00
|
|
|
if(err) console.log("mkdirFailed", err);
|
2019-01-05 19:28:48 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
return dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
const newDir = (length = 10) => {
|
|
|
|
let dir = "";
|
|
|
|
let possible = "abcdefghijklmnopqrstuvwxyz";
|
|
|
|
for (let i = 0; i < length; i++)
|
|
|
|
dir += possible.charAt(Math.floor(Math.random() * possible.length));
|
|
|
|
|
|
|
|
return dir;
|
|
|
|
}
|
|
|
|
|
2018-12-20 16:59:29 +01:00
|
|
|
app.listen(port, err => { console.log(`> listening on port ${port}`) });
|