[![pipeline status](https://gitlab.binets.fr/br/sigma-backend/badges/master/pipeline.svg)](https://gitlab.binets.fr/br/sigma-backend/commits/master)

# Backend Sigma

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

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`](./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
npm install -g eslint
```

## Structure

Les fichiers source se situent dans le dossier `src`.

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

### Seeds

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`](./package.json).

### Transpiler le serveur

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é.

### Démarrer le serveur

Pour faire tourner le serveur, il y a deux options :

* `npm start` fait tourner le serveur `bundle.js` en mode prod sur le port 3000 (donc il faut consulter https://localhost:3000)
* `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, 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

On utilisera ESLint pour standardiser le code : un ensemble de règles de style pour le code sont appliquées, et quelques-unes d'entre elles sont dans le fichier `.eslintrc.json`. Pour l'instant, la config ESLint impose d'utiliser quatre espaces pour les indentations et d'utiliser des points-virgule en fin de ligne.

Il est préférable de l'installer **globalement** avec

   npm install -g eslint

Pour faire valider les fichiers source par ESLint, utilisez

    npm run lint

qui fait appel au script `eslint src/` défini dans le [`package.json`](./package.json). L'option `--fix` permet de corriger les fichiers.

Sinon, si vous utilisez Atom ou Visual Studio Code pour éditer votre code, il existe des plugins qui font tourner ESLint en _live_ sur le code et vérifient que tout est en ordre.

Pour mieux comprendre ESLint, référez-vous à la [doc](https://eslint.org/docs/user-guide/getting-started).