sandboxApp.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  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 ExampleStore = require('./lib/ExampleStore');
  14. var indexTpml = fs.readFileSync(__dirname + '/html/index.mustache.html').toString();
  15. var sandboxTpml = fs.readFileSync(__dirname + '/html/template.mustache.html').toString();
  16. Promise.promisifyAll(fs);
  17. var exStore = new ExampleStore(__dirname + '/exemples');
  18. exStore.init()
  19. .then(() => console.log(exStore.getMenu()));
  20. // Initialize Express app: root folder as static, body parsers
  21. app.use(express.static(__dirname));
  22. app.use(bodyParser.json());
  23. app.use(bodyParser.urlencoded({ extended: true }));
  24. function addExample(slug, title) {
  25. examples.push({ slug: slug, title: title });
  26. return fs.writeFileAsync(examplesJSON, beautify(examples, null, 2, 100));
  27. }
  28. function readConfigJson(exampleSlug) {
  29. console.log(exampleSlug);
  30. return require('./exemples/jquery/' + exampleSlug + '/config.json');
  31. }
  32. function readFileAsync(file) {
  33. return fs.readFileAsync(file)
  34. .then(buf => (buf.toString()));
  35. }
  36. // function readFilesAsync(path, files) {
  37. // // console.log('reading files', files, 'from path', path);
  38. // return Promise.map(files,
  39. // f => readFileAsync(path + '/' + f)
  40. // );
  41. // }
  42. // function readExampleFiles(slug, config) {
  43. // const exampleDir = __dirname + '/exemples/' + slug;
  44. // const libsCssDir = __dirname + '/css/vendor';
  45. // const libsJsDir = __dirname + '/js/vendor';
  46. // const { html, js, css, libsCss, libsJs } = config;
  47. // return Promise.all([
  48. // readFilesAsync(exampleDir, html),
  49. // readFilesAsync(exampleDir, js),
  50. // readFilesAsync(exampleDir, css),
  51. // readFilesAsync(libsJsDir, libsJs),
  52. // readFilesAsync(libsCssDir, libsCss),
  53. // ]);
  54. // }
  55. app.get('/', function(req, res) {
  56. const menuRepo = exStore.getRepoMenu();
  57. // const title = 'Home';
  58. console.log(menuRepo);
  59. res.send(Mustache.render(indexTpml, {
  60. title,
  61. menuRepo
  62. }));
  63. });
  64. app.get('/:repoSlug',
  65. function(req, res, next) {
  66. if(! exStore.repoExists(req.params.repoSlug)) {
  67. return res.status(404).send('Repo ' + req.params.repoSlug + ' not found');
  68. }
  69. next();
  70. },
  71. function(req, res) {
  72. const menuRepo = exStore.getRepoMenu();
  73. const menuRepo = exStore.getRepoMenu();
  74. // const title = 'Home';
  75. console.log(menuRepo);
  76. res.send(Mustache.render(indexTpml, {
  77. title,
  78. menuRepo,
  79. menuRepo
  80. }));
  81. });
  82. app.post('/examples', function(req, res) {
  83. var title = req.body.title;
  84. if(! req.body.title) {
  85. res.status(400).send('Le titre ne peut pas être vide !');
  86. }
  87. var existingTitle = _.find(examples, { title: title });
  88. if(existingTitle) {
  89. res.status(400).send("L'exemple '" + title + "' existe déjà !");
  90. }
  91. var exampleSlug = slug(req.body.title.toLowerCase());
  92. var targetDir = __dirname + '/exemples/' + exampleSlug;
  93. fs.mkdirAsync(targetDir)
  94. .then(() => Promise.map(
  95. ['contenu.html', 'script.js'], f => fs.writeFileAsync(targetDir + '/' + f, '')
  96. ))
  97. .then(files => addExample(exampleSlug, title))
  98. .then(() => res.json({ slug: exampleSlug, title: title }));
  99. });
  100. app.get('/examples/:slug', function(req, res) {
  101. const { slug } = req.params;
  102. const config = readConfigJson(slug);
  103. const { title, html, js, css, libsCss, libsJs } = config;
  104. readFileAsync(__dirname + '/exemples/' + slug + '/example.html')
  105. .then(body =>
  106. Mustache.render(sandboxTpml, { body, slug, title, js, css, libsCss, libsJs })
  107. )
  108. .then(html => res.send(html));
  109. });
  110. app.get('/menu', (rea, res) => {
  111. res.send(exStore.getMenu());
  112. });
  113. app.get('/list/:repoPath', function(req, res) {
  114. const { repoPath } = req.params;
  115. const repo = exStore.getList(repoPath);
  116. if(! repo) {
  117. return res.status(404).send('Repo ' + repoPath + ' not found');
  118. }
  119. console.log('found repo', repo);
  120. const data = repo.examples.map(e => (
  121. { slug: e.slug, title: e.title }
  122. ));
  123. res.json(data);
  124. });
  125. app.put('/examples/:slug', function(req, res) {
  126. var slug = req.params.slug;
  127. var existing = _.find(examples, { slug: slug });
  128. if(! existing) {
  129. res.status(404).send("L'exemple avec l'identifiant '" + slug + "' est introuvable !");
  130. }
  131. var targetDir = __dirname + '/exemples/' + slug;
  132. if(req.body.html) {
  133. fs.writeFileSync(targetDir + '/contenu.html', req.body.html);
  134. }
  135. if(req.body.javascript) {
  136. fs.writeFileSync(targetDir + '/script.js', req.body.javascript);
  137. }
  138. var theDate = new Date();
  139. console.log(theDate.getHours() + ':' + theDate.getMinutes() + " - Sauvegarde de l'exemple '" + existing.title + " effectuée'");
  140. res.json({ success: true });
  141. });
  142. module.exports = app;