From bacca32ca003b539434db3c68aac94b3f6bf16c1 Mon Sep 17 00:00:00 2001
From: ManifoldFR <wilson.jallet@gmail.com>
Date: Sun, 25 Feb 2018 12:45:38 +0100
Subject: [PATCH] =?UTF-8?q?m=C3=A0j?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .eslintignore     |  3 +-
 README.md         | 47 +++++++++++++++++------
 package-lock.json | 95 +++++++++++++++++++++++++++++++++++++++++++++++
 package.json      |  3 ++
 src/index.js      | 13 ++++---
 src/server.js     |  3 +-
 6 files changed, 146 insertions(+), 18 deletions(-)

diff --git a/.eslintignore b/.eslintignore
index 126664b..dd2214b 100644
--- a/.eslintignore
+++ b/.eslintignore
@@ -1,2 +1,3 @@
 migrations/
-seeds/
\ No newline at end of file
+seeds/
+build/
\ No newline at end of file
diff --git a/README.md b/README.md
index 422034d..15656c8 100644
--- a/README.md
+++ b/README.md
@@ -4,33 +4,58 @@ Ce dépôt contient le _backend_ de Sigma, le successeur de Frankiz.
 
 Pour obtenir une copie de ce dépôt, clonez-le avec
 
-    git clone git@gitlab.binets.fr/br/sigma-backend
+    git clone git@gitlab.binets.fr:br/sigma-backend.git
 
-puis installez les dépendences JavaScript avec
-
-    npm install
+ou `git clone https://gitlab.binets.fr/br/sigma-backend.git`, puis installez les dépendences JavaScript avec `npm install`.
 
 ## Dépendances
 
-Une dépendance, c'est un librairie JavaScript dont dépend le code source, soit pour le faire tourner soit pour faire tourner les outils dévs. Les dépendances dév servent à tester par exemple. On trouve la liste des dépendances dans `package.json`. Express est un exemple de dépendance normale, nodemon et ESLint (voir infra) sont des dépendances dev (`devDependencies`).
+Une dépendance, c'est un librairie JavaScript dont dépend le code source, soit pour le faire tourner soit pour faire tourner les outils dévs. Les dépendances dév servent à tester par exemple. On trouve la liste des dépendances dans [`package.json`](./package.json). Express est un exemple de dépendance normale, nodemon et ESLint (voir infra) sont des dépendances dev (`devDependencies`).
+
+Les dépendances s'installent avec `npm install`. Par défaut, toutes les dépendances sont installées. Si la variable `NODE_ENV` est configurée (vérifier avec la commande `echo "$NODE_ENV"`),
+
+* la valeur `development` installe tout
+* la valeur `production` n'installe pas les dépendances dév
+
+Certaines d'entre elles comme KnexJS ou Webpack devraient être installées globalement :
+
+```bash
+npm install -g knex
+npm install -g webpack
+```
 
 ## Structure
 
 Les fichiers source se situent dans le dossier `src`.
 
-Pour l'instant, le serveur utilisé est [express.js](https://expressjs.com/) ; le serveur Express est configuré dans `server.js` puis lancé sur le port 8888 dans `index.js`.
+Le serveur utilisé est [express.js](https://expressjs.com/) ; il est configuré dans [`server.js`](./src/server.js) puis lancé sur le port 8888 dans [`index.js`](./src/index.js).
+
+La syntaxe adoptée est JavaScript ES6, un standard moderne (2015) de JavaScript. Il permet d'importer des dépendances en utilisant le mot-clé `import`, ce que le serveur Node.js ne comprend pas puisque la version 8 de Node ne comprend que le standard ES5 (2009), qui gère les imports avec `require()`.
+
+Node comprend le code dans [`build/bundle.js`](./build/bundle.js), donc on le lance dessus après avoir compilé ce fichier.
+
+## Base de données
+
+La base de donnée utilisée est PostgreSQL.
+
+Le schéma de la BDD est géré par [Knex](http://knexjs.org). La config de Knex est dans [`knexfile.js`](./knexfile.js) : c'est un objet JSON qui précise la BDD à lequelle se connecter, l'utilisateur sous lequel elle est, le mot de passe...
+
+* `knex migrate:make migration_name` crée une migration dans `migrations/` : le nom du fichier est `migration_name.js` avec la date et l'heure en préfixe
+* `knex migrate:latest` met à jour le schéma de la BDD
+* `knex seed:make filename` crée un _seed_ `seeds/filename`
+* `knex seed:run` insère les _seeds_ dans la BDD
 
-La syntaxe adoptée est JavaScript ES6, un standard moderne (2015) de JavaScript. Il permet d'importer des dépendances en utilisant le mot-clé `import`, ce que le serveur Node.js ne comprend pas puisque la version 8 de Node ne comprend que le standard ES5, qui gère les imports avec `require()`.
+### Seeds
 
-Le fichier serveur que Node reconnaît est `dist/bundle.js`.
+Un fichier _seed_ permet d'insérer des données dans la BDD.
 
 ## Scripts
 
-Les scripts sont des instructions en ligne de commande que l'on peut faire tourner avec la commande `npm run`. Ils sont définis dans `package.json`.
+Les scripts sont des instructions en ligne de commande que l'on peut faire tourner avec la commande `npm run`. Ils sont définis dans [`package.json`](./package.json).
 
 ### Transpiler le serveur
 
-On utilisera Webpack pour transpiler le fichier source `src/index.js` en `dist/bundle.js` qui est suit la syntaxe ES5 compatible Node. Pour ça, on utilise
+On utilisera Webpack pour transpiler le fichier source [`src/index.js`](./src/index.js) en [`build/bundle.js`](./build/bundle.js) qui est suit la syntaxe ES5 compatible Node. Pour ça, on utilise
 
 * `npm run build` qui exécute la commande `webpack` avec le fichier de configuration `webpack.config.js`, ou
 * `npm run watch` qui recompile automatiquement dès que le code est modifié.
@@ -42,7 +67,7 @@ Pour faire tourner le serveur, il y a deux options :
 * `npm start` fait tourner le serveur `bundle.js` en mode prod sur le port 8888 (donc il faut consulter https://localhost:8888)
 * `npm test` le démarre avec [nodemon](https://nodemon.io/), outil dév qui redémarre automatiquement le serveur dans `bundle.js` dès que celui-ci est modifié.
 
-Donc, combiner `npm run watch` et `npm test` permet de recompiler le serveur __et__ le redémarrer automatiquement dès qu'il y a une modification.
+Donc, lancer `npm run watch` dans un terminal et `npm test` dans un autre permet de recompiler le serveur __et__ le redémarrer automatiquement dès qu'il y a une modification.
 
 ## ESLint
 
diff --git a/package-lock.json b/package-lock.json
index d44322b..4185a5e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -4,6 +4,96 @@
   "lockfileVersion": 1,
   "requires": true,
   "dependencies": {
+    "@types/body-parser": {
+      "version": "1.16.8",
+      "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.16.8.tgz",
+      "integrity": "sha512-BdN2PXxOFnTXFcyONPW6t0fHjz2fvRZHVMFpaS0wYr+Y8fWEaNOs4V8LEu/fpzQlMx+ahdndgTaGTwPC+J/EeA==",
+      "requires": {
+        "@types/express": "4.11.1",
+        "@types/node": "9.4.6"
+      }
+    },
+    "@types/events": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@types/events/-/events-1.1.0.tgz",
+      "integrity": "sha512-y3bR98mzYOo0pAZuiLari+cQyiKk3UXRuT45h1RjhfeCzqkjaVsfZJNaxdgtk7/3tzOm1ozLTqEqMP3VbI48jw=="
+    },
+    "@types/express": {
+      "version": "4.11.1",
+      "resolved": "https://registry.npmjs.org/@types/express/-/express-4.11.1.tgz",
+      "integrity": "sha512-ttWle8cnPA5rAelauSWeWJimtY2RsUf2aspYZs7xPHiWgOlPn6nnUfBMtrkcnjFJuIHJF4gNOdVvpLK2Zmvh6g==",
+      "requires": {
+        "@types/body-parser": "1.16.8",
+        "@types/express-serve-static-core": "4.11.1",
+        "@types/serve-static": "1.13.1"
+      }
+    },
+    "@types/express-serve-static-core": {
+      "version": "4.11.1",
+      "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.11.1.tgz",
+      "integrity": "sha512-EehCl3tpuqiM8RUb+0255M8PhhSwTtLfmO7zBBdv0ay/VTd/zmrqDfQdZFsa5z/PVMbH2yCMZPXsnrImpATyIw==",
+      "requires": {
+        "@types/events": "1.1.0",
+        "@types/node": "9.4.6"
+      }
+    },
+    "@types/mime": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.0.tgz",
+      "integrity": "sha512-A2TAGbTFdBw9azHbpVd+/FkdW2T6msN1uct1O9bH3vTerEHKZhTXJUQXy+hNq1B0RagfU8U+KBdqiZpxjhOUQA=="
+    },
+    "@types/node": {
+      "version": "9.4.6",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-9.4.6.tgz",
+      "integrity": "sha512-CTUtLb6WqCCgp6P59QintjHWqzf4VL1uPA27bipLAPxFqrtK1gEYllePzTICGqQ8rYsCbpnsNypXjjDzGAAjEQ=="
+    },
+    "@types/serve-static": {
+      "version": "1.13.1",
+      "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.1.tgz",
+      "integrity": "sha512-jDMH+3BQPtvqZVIcsH700Dfi8Q3MIcEx16g/VdxjoqiGR/NntekB10xdBpirMKnPe9z2C5cBmL0vte0YttOr3Q==",
+      "requires": {
+        "@types/express-serve-static-core": "4.11.1",
+        "@types/mime": "2.0.0"
+      }
+    },
+    "@types/tapable": {
+      "version": "0.2.4",
+      "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-0.2.4.tgz",
+      "integrity": "sha512-pclMAvhPnXJcJu1ZZ8bQthuUcdDWzDuxDdbSf6l1U6s4fP6EBiZpPsOZYqFOrbqDV97sXGFSsb6AUpiLfv4xIA=="
+    },
+    "@types/uglify-js": {
+      "version": "2.6.30",
+      "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-2.6.30.tgz",
+      "integrity": "sha512-NjiBNGFl58vHJeijl63w1fWRIjLnrfOvimsXF5b3lTzEzkTV1BnVsbqQeLejg54upsHPWIF63aiub5TEwH619A==",
+      "requires": {
+        "source-map": "0.6.1"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+        }
+      }
+    },
+    "@types/webpack": {
+      "version": "3.8.8",
+      "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-3.8.8.tgz",
+      "integrity": "sha512-pZxQOJR7NvRn913/hklPmmVjG4cCjyz6WmhIEtqJYGjjG2MXpBIlFAsq+wXXZslJLBdMiIzUAIt53u9fhU9prA==",
+      "requires": {
+        "@types/node": "9.4.6",
+        "@types/tapable": "0.2.4",
+        "@types/uglify-js": "2.6.30",
+        "source-map": "0.6.1"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+        }
+      }
+    },
     "abbrev": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
@@ -831,6 +921,11 @@
       "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
       "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
     },
+    "colors": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
+      "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM="
+    },
     "commander": {
       "version": "2.14.1",
       "resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz",
diff --git a/package.json b/package.json
index cd6308e..5ba8eab 100644
--- a/package.json
+++ b/package.json
@@ -4,7 +4,10 @@
   "description": "Backend of sigma, the new Frankiz",
   "main": "build/bundle.js",
   "dependencies": {
+    "@types/express": "^4.11.1",
+    "@types/webpack": "^3.8.8",
     "body-parser": "^1.18.2",
+    "colors": "^1.1.2",
     "express": "^4.16.2",
     "fs": "0.0.1-security",
     "graphql": "^0.13.1",
diff --git a/src/index.js b/src/index.js
index dbc5bb4..a088ea8 100644
--- a/src/index.js
+++ b/src/index.js
@@ -1,18 +1,21 @@
 import server from './server';
 import knex from '../knex_router';
+import colors from 'colors/safe';
 
 server.get('/', function(req, res) {
     console.log('Connectting to '+req.url);
-    res.send('<h1>Hello, world</h1>\nHello, world ! This is server talking to you live from Omaha on port '+port+' !');
+    res.send(`<h1>Hello, world</h1>
+    
+    Hello, world ! This is server talking to you live on port `+port+' !');
 });
 
-server.get('/groups', function(req, res) {
-    knex.select().from('groups').then(function(groups) {
-        res.send(groups);
+server.get('/db/:table', function(req, res) {
+    knex.select().from(req.params.table).then(function(table) {
+        res.send(table);
     });
 });
 
 // define port server is to listen on
 const port = process.env.PORT || 3000;
 
-server.listen(port, () => console.log('Express server running on port '+port));
\ No newline at end of file
+server.listen(port, () => console.log(colors.blue('Express server running on port', port)));
\ No newline at end of file
diff --git a/src/server.js b/src/server.js
index 22af206..0334241 100644
--- a/src/server.js
+++ b/src/server.js
@@ -2,13 +2,14 @@ import express from 'express';
 import bodyParser from 'body-parser';
 import morgan from 'morgan';
 
-let server = express();
+const server = express();
 
 server.use(bodyParser.json());
 server.use(bodyParser.urlencoded({
     extended: false
 }));
 
+// Morgan is middleware for logging requests
 server.use(morgan('dev'));
 
 export default server;
-- 
GitLab