sandboxApp.js 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. var express = require('express');
  2. var bodyParser = require('body-parser');
  3. var slug = require('slug');
  4. var beautify = require("json-beautify");
  5. var _ = require('lodash');
  6. var fs = require('fs');
  7. var Promise = require('bluebird');
  8. var app = express();
  9. var examplesJSON = __dirname + '/exemples/liste.json';
  10. var sandboxTpml = fs.readFileSync(__dirname + '/exemples/template.html').toString();
  11. var examples = require(examplesJSON);
  12. Promise.promisifyAll(fs);
  13. // Initialize Express app: root folder as static, body parsers
  14. app.use(express.static(__dirname));
  15. app.use(bodyParser.json());
  16. app.use(bodyParser.urlencoded({ extended: true }));
  17. function addExample(slug, title) {
  18. examples.push({ slug: slug, title: title });
  19. return fs.writeFileAsync(examplesJSON, beautify(examples, null, 2, 100));
  20. }
  21. app.post('/examples', function(req, res) {
  22. var title = req.body.title;
  23. if(! req.body.title) {
  24. res.status(400).send('Le titre ne peut pas être vide !');
  25. }
  26. var existingTitle = _.find(examples, { title: title });
  27. if(existingTitle) {
  28. res.status(400).send("L'exemple '" + title + "' existe déjà !");
  29. }
  30. var exampleSlug = slug(req.body.title.toLowerCase());
  31. var targetDir = __dirname + '/exemples/' + exampleSlug;
  32. fs.mkdirAsync(targetDir)
  33. .then(() => Promise.map(
  34. ['contenu.html', 'script.js'], f => fs.writeFileAsync(targetDir + '/' + f, '')
  35. ))
  36. .then(files => addExample(exampleSlug, title))
  37. .then(() => res.json({ slug: exampleSlug, title: title }));
  38. });
  39. app.get('/examples/:slug', function(req, res) {
  40. var slug = req.params.slug;
  41. fs.readFileAsync(__dirname + '/exemples/' + slug + '/contenu.html')
  42. .then(buf => buf.toString())
  43. .then(body => (
  44. sandboxTpml
  45. .replace('__body__', body)
  46. .replace('__slug__', slug)
  47. ))
  48. .then(html => res.send(html));
  49. });
  50. app.put('/examples/:slug', function(req, res) {
  51. var slug = req.params.slug;
  52. var existing = _.find(examples, { slug: slug });
  53. if(! existing) {
  54. res.status(404).send("L'exemple avec l'identifiant '" + slug + "' est introuvable !");
  55. }
  56. var targetDir = __dirname + '/exemples/' + slug;
  57. if(req.body.html) {
  58. fs.writeFileSync(targetDir + '/contenu.html', req.body.html);
  59. }
  60. if(req.body.javascript) {
  61. fs.writeFileSync(targetDir + '/script.js', req.body.javascript);
  62. }
  63. var theDate = new Date();
  64. console.log(theDate.getHours() + ':' + theDate.getMinutes() + " - Sauvegarde de l'exemple '" + existing.title + " effectuée'");
  65. res.json({ success: true });
  66. });
  67. module.exports = app;