sandboxApp.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. /* global __dirname */
  2. /* jshint strict:false */
  3. "use strict";
  4. var express = require('express');
  5. var bodyParser = require('body-parser');
  6. var slug = require('slug');
  7. var beautify = require("json-beautify");
  8. var _ = require('lodash');
  9. var fs = require('fs');
  10. var Promise = require('bluebird');
  11. var Mustache = require('mustache');
  12. var app = express();
  13. var examplesJSON = __dirname + '/exemples/liste.json';
  14. var sandboxTpml = fs.readFileSync(__dirname + '/html/template.mustache.html').toString();
  15. var examples = require(examplesJSON);
  16. Promise.promisifyAll(fs);
  17. // Initialize Express app: root folder as static, body parsers
  18. app.use(express.static(__dirname));
  19. app.use(bodyParser.json());
  20. app.use(bodyParser.urlencoded({ extended: true }));
  21. function addExample(slug, title) {
  22. examples.push({ slug: slug, title: title });
  23. return fs.writeFileAsync(examplesJSON, beautify(examples, null, 2, 100));
  24. }
  25. function readConfigJson(exampleSlug) {
  26. console.log(exampleSlug);
  27. return require('./exemples/' + exampleSlug + '/config.json');
  28. }
  29. function readFileAsync(file) {
  30. return fs.readFileAsync(file)
  31. .then(buf => (buf.toString()));
  32. }
  33. // function readFilesAsync(path, files) {
  34. // // console.log('reading files', files, 'from path', path);
  35. // return Promise.map(files,
  36. // f => readFileAsync(path + '/' + f)
  37. // );
  38. // }
  39. // function readExampleFiles(slug, config) {
  40. // const exampleDir = __dirname + '/exemples/' + slug;
  41. // const libsCssDir = __dirname + '/css/vendor';
  42. // const libsJsDir = __dirname + '/js/vendor';
  43. // const { html, js, css, libsCss, libsJs } = config;
  44. // return Promise.all([
  45. // readFilesAsync(exampleDir, html),
  46. // readFilesAsync(exampleDir, js),
  47. // readFilesAsync(exampleDir, css),
  48. // readFilesAsync(libsJsDir, libsJs),
  49. // readFilesAsync(libsCssDir, libsCss),
  50. // ]);
  51. // }
  52. app.post('/examples', function(req, res) {
  53. var title = req.body.title;
  54. if(! req.body.title) {
  55. res.status(400).send('Le titre ne peut pas être vide !');
  56. }
  57. var existingTitle = _.find(examples, { title: title });
  58. if(existingTitle) {
  59. res.status(400).send("L'exemple '" + title + "' existe déjà !");
  60. }
  61. var exampleSlug = slug(req.body.title.toLowerCase());
  62. var targetDir = __dirname + '/exemples/' + exampleSlug;
  63. fs.mkdirAsync(targetDir)
  64. .then(() => Promise.map(
  65. ['contenu.html', 'script.js'], f => fs.writeFileAsync(targetDir + '/' + f, '')
  66. ))
  67. .then(files => addExample(exampleSlug, title))
  68. .then(() => res.json({ slug: exampleSlug, title: title }));
  69. });
  70. app.get('/examples/:slug', function(req, res) {
  71. const { slug } = req.params;
  72. const config = readConfigJson(slug);
  73. const { title, html, js, css, libsCss, libsJs } = config;
  74. readFileAsync(__dirname + '/exemples/' + slug + '/example.html')
  75. .then(body =>
  76. Mustache.render(sandboxTpml, { body, slug, title, js, css, libsCss, libsJs })
  77. )
  78. .then(html => res.send(html));
  79. });
  80. app.put('/examples/:slug', function(req, res) {
  81. var slug = req.params.slug;
  82. var existing = _.find(examples, { slug: slug });
  83. if(! existing) {
  84. res.status(404).send("L'exemple avec l'identifiant '" + slug + "' est introuvable !");
  85. }
  86. var targetDir = __dirname + '/exemples/' + slug;
  87. if(req.body.html) {
  88. fs.writeFileSync(targetDir + '/contenu.html', req.body.html);
  89. }
  90. if(req.body.javascript) {
  91. fs.writeFileSync(targetDir + '/script.js', req.body.javascript);
  92. }
  93. var theDate = new Date();
  94. console.log(theDate.getHours() + ':' + theDate.getMinutes() + " - Sauvegarde de l'exemple '" + existing.title + " effectuée'");
  95. res.json({ success: true });
  96. });
  97. module.exports = app;