var express = require('express'); var bodyParser = require('body-parser'); var slug = require('slug'); var beautify = require("json-beautify"); var _ = require('lodash'); var fs = require('fs'); var Promise = require('bluebird'); var app = express(); var examplesJSON = __dirname + '/exemples/liste.json'; var sandboxTpml = fs.readFileSync(__dirname + '/exemples/template.html').toString(); var examples = require(examplesJSON); Promise.promisifyAll(fs); // Initialize Express app: root folder as static, body parsers app.use(express.static(__dirname)); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true })); function addExample(slug, title) { examples.push({ slug: slug, title: title }); return fs.writeFileAsync(examplesJSON, beautify(examples, null, 2, 100)); } app.post('/examples', function(req, res) { var title = req.body.title; if(! req.body.title) { res.status(400).send('Le titre ne peut pas être vide !'); } var existingTitle = _.find(examples, { title: title }); if(existingTitle) { res.status(400).send("L'exemple '" + title + "' existe déjà !"); } var exampleSlug = slug(req.body.title.toLowerCase()); var targetDir = __dirname + '/exemples/' + exampleSlug; fs.mkdirAsync(targetDir) .then(() => Promise.map( ['contenu.html', 'script.js'], f => fs.writeFileAsync(targetDir + '/' + f, '') )) .then(files => addExample(exampleSlug, title)) .then(() => res.json({ slug: exampleSlug, title: title })); }); app.get('/examples/:slug', function(req, res) { var slug = req.params.slug; fs.readFileAsync(__dirname + '/exemples/' + slug + '/contenu.html') .then(buf => buf.toString()) .then(body => ( sandboxTpml .replace('__body__', body) .replace('__slug__', slug) )) .then(html => res.send(html)); }); app.put('/examples/:slug', function(req, res) { var slug = req.params.slug; var existing = _.find(examples, { slug: slug }); if(! existing) { res.status(404).send("L'exemple avec l'identifiant '" + slug + "' est introuvable !"); } var targetDir = __dirname + '/exemples/' + slug; if(req.body.html) { fs.writeFileSync(targetDir + '/contenu.html', req.body.html); } if(req.body.javascript) { fs.writeFileSync(targetDir + '/script.js', req.body.javascript); } var theDate = new Date(); console.log(theDate.getHours() + ':' + theDate.getMinutes() + " - Sauvegarde de l'exemple '" + existing.title + " effectuée'"); res.json({ success: true }); }); module.exports = app;