server.js 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. /**
  2. * ATTENTION le fichier sandboxApp.js est assez complexe.
  3. * Il sert à initialiser l'appli permettant d'avoir l'éditeur HTML&JavaScript en ligne
  4. */
  5. const app = require('./sandboxApp');
  6. const db = require('sqlite');
  7. const Promise = require('bluebird');
  8. const qbuilder = require('./lib/queryBuilder');
  9. const passwd = require('./lib/passwd');
  10. /*-------------------------------------------------------*
  11. | Déclaration de gestionnaires pour les exemples AJAX
  12. *-------------------------------------------------------*
  13. |
  14. */
  15. // 1er exemple: envoie du HTML généré dynamiquement.
  16. // On utilise app.get pour attacher un gestionnaire à l'URL /ajax-example
  17. // uniquement avec la méthode GET
  18. app.get('/jquery/ajax/example-simple', function(req, res) {
  19. var date = new Date();
  20. var exampleHtml = '<p>Un peu de HTML retourné par le serveur.</p>' +
  21. '<p><em>Généré le: ' + date.toString() + '</em></p>';
  22. res.send(exampleHtml);
  23. });
  24. // 2ème exemple : envoi formulaire par méthode GET
  25. // Notez bien d'où on extrait les paramètres passé par le client (req.query)
  26. app.get('/jquery/ajax/form-get', function(req, res) {
  27. var name = req.query.name;
  28. var birthdate = req.query.birthdate;
  29. var exampleHtml = '<p>Salutations, <em>' + name +
  30. '</em>, né(e) le <em>' + birthdate + '</em>.</p>';
  31. res.send(exampleHtml);
  32. });
  33. // 3ème exemple : envoi formulaire par méthode POST
  34. // Ici les paramètres viennent de req.body
  35. app.post('/jquery/ajax/form-post', function(req, res) {
  36. var title = req.body.title;
  37. var text = req.body.text;
  38. var exampleHtml = '<h2>' + title + '</h2>' +
  39. '<p>' + text + '</p>';
  40. res.send(exampleHtml);
  41. });
  42. /**
  43. * Création d'un tableau vide où on va stocker les utilisateurs
  44. */
  45. var userList = [];
  46. var userId = 1;
  47. /**
  48. * Création d'un utilisateur : on le stocke dans le tableau userList
  49. * ATTENTION ! Dans la "vraie vie", on utiliserait une base de données !
  50. */
  51. function createNewUser(user) {
  52. // On vérifie que les données de l'utilisateur sont renseignées
  53. // Si non, on renvoie false
  54. if(! user || ! user.username || ! user.email || ! user.password) {
  55. return Promise.reject(new Error('Missing fields'));
  56. }
  57. const { username, email } = user;
  58. // L'étape de vérification a réussi, on insère l'utilisateur dans le tableau
  59. // On crée un faux "id" pour simuler une insertion SQL. En SQL les "id" sont
  60. // incrémentés à chaque insertion. On simule cela en incrémentant un compteur
  61. // "userId" à chaque insertion
  62. // userList.push();
  63. // return true;
  64. return passwd.hash(user.password)
  65. .then(password => qbuilder.insert('users', {
  66. username: user.username,
  67. email: user.email,
  68. password
  69. }))
  70. .then(query => db.run(query))
  71. .then(() => qbuilder.selectWhere('users', { email }))
  72. .then(query => db.get(query));
  73. }
  74. app.post('/jquery/ajax/login', function(req, res) {
  75. // Récupérer email et password
  76. var identifiants = req.body;
  77. var identifier = identifiants.identifier;
  78. if(! identifiants.identifier || ! identifiants.password) {
  79. return res.status(400).json({
  80. message: 'paramètre requis manquant'
  81. });
  82. }
  83. var query = qbuilder.selectAll('users', "email='" + identifier + "' OR username='" + identifier + "'");
  84. console.log('requête SQL recherche user pour login', query);
  85. db.get(query)
  86. .then(existingUser => {
  87. console.log('résultat requête', existingUser);
  88. if(! existingUser) {
  89. return res.status(404).json({
  90. message: 'Utilisateur non trouvé'
  91. });
  92. }
  93. passwd.match(existingUser, identifiants.password)
  94. .then(() => res.json({ user: existingUser }))
  95. .catch(err => {
  96. console.error(err);
  97. return res.status(401).json({
  98. message: 'Mot de passe incorrect'
  99. });
  100. });
  101. });
  102. });
  103. /**
  104. * Ce code va gérer la requête POST vers l'URL /register de notre micro-serveur
  105. */
  106. app.post('/jquery/ajax/register', function(req, res) {
  107. // Les données envoyées par le client (navigateur) sont dans la propriété "body"
  108. // de l'objet req (pour request)
  109. var user = req.body;
  110. // createNewUser() va nous renvoyer true ou false
  111. createNewUser(user)
  112. .then(user => res.json({ user: user }))
  113. .catch(err => {
  114. if( err.code === 'SQLITE_CONSTRAINT' ) {
  115. return res.status(409).json({
  116. message: 'Un utilisateur existe déjà avec cet email ou cet identifiant'
  117. });
  118. }
  119. else if( err.message === 'Missing fields' ) {
  120. return res.status(400).json({ message: 'Champs manquants dans la requête' });
  121. }
  122. else {
  123. return res.status(500).json({ message: 'Erreur serveur inconnue: ' + err.message });
  124. }
  125. });
  126. });
  127. app.get('/jquery/ajax/username-check', function(req, res) {
  128. var username = req.query.username;
  129. var query = qbuilder.selectWhere('users', { username });
  130. db.get(query)
  131. .then(records => {
  132. // Si aucun user n'existe avec cet username, records vaut undefined
  133. // et on renvoie alors true
  134. res.json({ success: records === undefined });
  135. });
  136. });
  137. app.get('/jquery/ajax/email-check', function(req, res) {
  138. var email = req.query.email;
  139. var query = qbuilder.selectWhere('users', { email });
  140. db.get(query)
  141. .then(records => {
  142. // Si aucun user n'existe avec cet email, records vaut undefined
  143. // et on renvoie alors true
  144. res.json({ success: records === undefined });
  145. });
  146. });
  147. Promise.resolve()
  148. // First, try connect to the database
  149. .then(() => db.open('./example-database.sqlite', { Promise }))
  150. .then(() => db.migrate({})) // force: 'last'
  151. .catch(err => console.error(err.stack))
  152. // Finally, launch Node.js app
  153. .finally(() => {
  154. app.listen(3000);
  155. console.log('Le serveur écoute sur le port 3000. Laissez cette console ouverte ! Avec votre navigateur, allez sur http://localhost:3000');
  156. });