# 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 ``` ## 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 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, 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. Pour faire valider un fichier `file.js` par ESLint, utilisez npm run lint file.js et avec l'option `--fix` pour corriger le fichier. 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).