diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 05047214ee9da30ac3c550f53ebddd6d4a9842dc..71a6cec492bb21276249979a9acb3ad825fa7dcd 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -32,6 +32,7 @@ build:
     paths:
       - build/
       - node_modules/
+    expire_in: 40 min
   tags:
     - database
     - build
@@ -49,17 +50,18 @@ test:async:
   stage: test
   script:
    - npm start &
-   - curl http://localhost:3000
    - sleep 5
-   - curl http://localhost:3000/db/groups
+   - curl http://localhost:3000
+   - pkill node
+   - exit 0
   tags:
    - server
 
 deploy_staging:
   stage: deploy
   script:
-    - npm start &
-    - sleep 30
+    - npm start & sleep 5
+    - exit 0
   environment:
     name: staging
     url: http://129.104.210.10:3000
diff --git a/package-lock.json b/package-lock.json
index 218fd22f1b32f33b14a52e34019174962f63b6f9..a0a00bd1a6d0bc376e40ae3753de7fda1ad6b1ea 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -86,44 +86,6 @@
         "@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",
@@ -904,7 +866,7 @@
         "normalize-path": "2.1.1",
         "path-is-absolute": "1.0.1",
         "readdirp": "2.1.0",
-        "upath": "1.0.2"
+        "upath": "1.0.4"
       }
     },
     "cipher-base": {
@@ -4211,30 +4173,6 @@
       "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
       "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw=="
     },
-    "lodash.endswith": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/lodash.endswith/-/lodash.endswith-4.2.1.tgz",
-      "integrity": "sha1-/tWawXOO0+I27dcGTsRWRIs3vAk=",
-      "dev": true
-    },
-    "lodash.isfunction": {
-      "version": "3.0.9",
-      "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz",
-      "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==",
-      "dev": true
-    },
-    "lodash.isstring": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
-      "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=",
-      "dev": true
-    },
-    "lodash.startswith": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/lodash.startswith/-/lodash.startswith-4.2.1.tgz",
-      "integrity": "sha1-xZjErc4YiiflMUVzHNxsDnF3YAw=",
-      "dev": true
-    },
     "longest": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
@@ -4605,9 +4543,9 @@
       }
     },
     "nodemon": {
-      "version": "1.15.1",
-      "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.15.1.tgz",
-      "integrity": "sha512-zWNke/X74j3ljDRCXnhURTLJaCxew31ax4azoPQyRYAoUBqNIlZGaNpMcyi/A/ylkGKWFiUzf7HHFyA/cveTcQ==",
+      "version": "1.17.1",
+      "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.17.1.tgz",
+      "integrity": "sha512-p6+IG/eJyprjRd95na0efIWl3ONITHydCdl7btEIZttvnmXX4aqxIE45Aj+zeT0llJIUfJnZNyAX14XIdjJtmw==",
       "dev": true,
       "requires": {
         "chokidar": "2.0.2",
@@ -4616,6 +4554,7 @@
         "minimatch": "3.0.4",
         "pstree.remy": "1.1.0",
         "semver": "5.5.0",
+        "supports-color": "5.2.0",
         "touch": "3.1.0",
         "undefsafe": "2.0.2",
         "update-notifier": "2.3.0"
@@ -6742,16 +6681,10 @@
       "dev": true
     },
     "upath": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/upath/-/upath-1.0.2.tgz",
-      "integrity": "sha512-fCmij7T5LnwUme3dbnVSejvOHHlARjB3ikJFwgZfz386pHmf/gueuTLRFU94FZEaeCLlbQrweiUU700gG41tUw==",
-      "dev": true,
-      "requires": {
-        "lodash.endswith": "4.2.1",
-        "lodash.isfunction": "3.0.9",
-        "lodash.isstring": "4.0.1",
-        "lodash.startswith": "4.2.1"
-      }
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/upath/-/upath-1.0.4.tgz",
+      "integrity": "sha512-d4SJySNBXDaQp+DPrziv3xGS6w3d2Xt69FijJr86zMPBy23JEloMCEOUBBzuN7xCtjLCnmB9tI/z7SBCahHBOw==",
+      "dev": true
     },
     "update-notifier": {
       "version": "2.3.0",
diff --git a/package.json b/package.json
index e3a2e26d4f725b640fa5ad4709b21fb1ead16d8f..df8de31d7125f3fe990b9bf419c483e24e4953e3 100644
--- a/package.json
+++ b/package.json
@@ -4,8 +4,6 @@
   "description": "Backend of sigma, the new Frankiz",
   "main": "index.js",
   "dependencies": {
-    "@types/express": "^4.11.1",
-    "@types/webpack": "^3.8.8",
     "body-parser": "^1.18.2",
     "colors": "^1.1.2",
     "connect-ensure-login": "^0.1.1",
@@ -36,7 +34,7 @@
     "eslint-plugin-promise": "^3.6.0",
     "eslint-plugin-standard": "^3.0.1",
     "jsdoc": "^3.5.5",
-    "nodemon": "^1.15.1"
+    "nodemon": "^1.17.1"
   },
   "scripts": {
     "start": "node build/bundle.js",
diff --git a/src/admin_view/admin_view.js b/src/admin_view/admin_view.js
new file mode 100644
index 0000000000000000000000000000000000000000..72641e71e4c803033bac9dea1a450b59fa92283e
--- /dev/null
+++ b/src/admin_view/admin_view.js
@@ -0,0 +1,82 @@
+/**
+ * @file admin_view
+ * @summary Interface "administrateur" de l'acces aux BDD
+ * 
+ */
+import express from 'express';
+import knex from '../../db/knex_router';
+
+const router = express.Router();
+
+let port = 3000;
+
+router.get('/', function (req, res) {
+    console.log('Connecting to ' + req.url);
+    res.render('home', { title: 'Home', port: port });
+});
+
+router.get('/db?', function (req, res) {
+    let table_name = req.query.table;
+    let columns = req.query.columns;
+
+    res.redirect(`db/${table_name}?columns=${columns}`);
+});
+
+/**
+ * @function Knex API: Get table
+ * @summary Effectue une requête pour une table dans la BDD
+ * @argument {string} table_name - La table voulue par l'utilisateur.
+ */
+router.get('/db/:table_name?', function (req, res) {
+
+    // get columns from query
+    let columns;
+    if (req.query.columns) {
+        columns = req.query.columns.split(',');
+    } else {
+        columns = null;
+    }
+    console.log(columns);
+
+    knex.select(columns).from(req.params.table_name).then(function (table) {
+        res.setHeader("Content-Type", "application/json");
+        res.write(JSON.stringify(table, null, 2));
+        res.end();
+    }, function () {
+        res.status(400);
+        res.render('error', {
+            status: res.statusCode,
+            error_message: "Bad request: can't find table " + req.params.table_name
+        });
+        res.end();
+    }
+    );
+});
+
+/**
+ * @function Error 404 catcher
+ * @summary Catche les requêtes en dehors des URL acceptées
+ */
+router.use((req, res, next) => {
+    let err = new Error('Not found');
+    err.status = 404;
+    next(err);
+});
+
+/**
+ * @function Error 404 handler
+ * @summary Gère les erreurs 404
+ */
+
+router.use((err, req, res, next) => {
+    res.locals.message = err.message;
+
+    res.status(err.status || 500);
+    let error_message = res.statusCode == 404 ? 'Not found.' : 'Internal server error.';
+    res.render('error', {
+        status: res.statusCode,
+        error_message: error_message
+    });
+});
+
+export default router;
\ No newline at end of file
diff --git a/src/index.js b/src/index.js
index 7e96a3e7db96a0f30d3a057e9903e7c6018563ba..bcb0a10fd87944a1fabf547abf23993be3695652 100644
--- a/src/index.js
+++ b/src/index.js
@@ -1,84 +1,17 @@
 import server from './server';
+import router from './admin_view/admin_view';
 import colors from 'colors';
-import { graphqlExpress, graphiqlExpress } from 'graphql-server-express';
-import makeExecutableSchema from 'graphql-tools';
-import knex from '../db/knex_router';
 import path from 'path';
 
 /**
- * @function Home
- * @summary Renvoie l'accueil du backend
+ * @file index
+ * @summary Entry point de webpack
+ * 
  */
-server.get('/', function(req, res) {
-    console.log('Connecting to '+req.url);
-    res.render('home', {title: 'Home', port: port});
-});
+server.use(router);
 
-server.get('/db?', function(req, res) {
-    let table_name = req.query.table;
-    let columns = req.query.columns;
+let port = process.env.PORT || 3000;
 
-    res.redirect(`db/${table_name}?columns=${columns}`);
-});
-
-/**
- * @function Knex API: Get table
- * @summary Effectue une requête pour une table dans la BDD
- * @argument {string} table_name - La table voulue par l'utilisateur.
- */
-server.get('/db/:table_name?', function(req, res) {
-
-    // get columns from query
-    let columns;
-    if (req.query.columns) {
-        columns = req.query.columns.split(',');
-    } else {
-        columns = null;
-    }
-    console.log(columns);
-    
-    knex.select(columns).from(req.params.table_name).then(function(table) {
-        res.setHeader("Content-Type", "application/json");
-        res.write(JSON.stringify(table,null,2));
-        res.end();
-    },function() {
-        res.status(400);
-        res.render('error', {
-            status: res.statusCode,
-            error_message: "Bad request: can't find table " + req.params.table_name
-        });
-        res.end();
-    }
-    );
-});
-
-/**
- * @function Error 404 catcher
- * @summary Catche les requêtes en dehors des URL acceptées
- */
-server.use((req, res, next) => {
-    let err = new Error('Not found');
-    err.status = 404;
-    next(err);
-});
-
-/**
- * @function Error 404 handler
- * @summary Gère les erreurs 404
- */
-
-server.use((err, req, res, next) => {
-    res.locals.message = err.message;
-
-    res.status(err.status || 500);
-    let error_message = res.statusCode == 404 ? 'Not found.' : 'Internal server error.';
-    res.render('error', {
-        status: res.statusCode,
-        error_message: error_message
-    });
-});
-
-// define port server is to listen on
-const port = process.env.PORT || 3000;
-
-server.listen(port, () => console.log(colors.blue('Express server running on port', port)));
\ No newline at end of file
+server.listen(port, () => {
+    console.log(colors.blue(`Express server listening on port ${port}`));
+});
\ No newline at end of file
diff --git a/src/ldap_auth.js b/src/ldap_auth/ldap_auth.js
similarity index 100%
rename from src/ldap_auth.js
rename to src/ldap_auth/ldap_auth.js
diff --git a/src/ldap_data.js b/src/ldap_data/ldap_data.js
similarity index 100%
rename from src/ldap_data.js
rename to src/ldap_data/ldap_data.js
diff --git a/src/server.js b/src/server.js
index 2563f705f097343a20c36c4c1bf1ba853e6b4b7e..f48b6c484977dcc6755fac07c9472e76d5d2c740 100644
--- a/src/server.js
+++ b/src/server.js
@@ -2,29 +2,67 @@ import express from 'express';
 import bodyParser from 'body-parser';
 import favicon from 'serve-favicon';
 import morgan from 'morgan';
+import knex from '../db/knex_router';
 import path from 'path';
-import ldap_auth from './ldap_auth';
+import ldap_auth from './ldap_auth/ldap_auth';
+import { graphqlExpress, graphiqlExpress } from 'graphql-server-express';
+import { makeExecutableSchema } from 'graphql-tools';
+
+/** 
+ * @file server.js
+ * @summary Cree le serveur express avec tous les middleware qui vont bien
+ * 
+*/
 
 const server = express();
 
+// on sait pas a quoi ca sert mais il parait que c'est utile
 server.use(bodyParser.json());
 server.use(bodyParser.urlencoded({
     extended: false
 }));
 
-// setting up view engine
+// setting up view engine for pug
 let viewpath = path.resolve('./','src','views');
 console.log(viewpath);
 server.set('views', viewpath);
 server.set('view engine', 'pug');
 
-// setting up ldap authentication
-ldap_auth(server);
-
-// a capital sigma symbol
+// favicon: capital sigma symbol
 server.use(favicon(path.resolve('./','assets','favicon.ico')));
 
 // Morgan is middleware for logging requests
 server.use(morgan('dev'));
 
+// setting up ldap authentication
+ldap_auth(server);
+
+const typeDefs = `
+    type Query {
+        groups: [Group]
+    }
+
+    type Group {
+        name: String
+        id: Int
+        school: String
+    }
+`;
+
+const resolvers = {
+    Query: {
+        groups: () => knex.select().from('groups')
+    }
+};
+
+const schema = makeExecutableSchema({
+    typeDefs,
+    resolvers
+});
+
+server.use('/graphql', bodyParser.json(), graphqlExpress({schema}));
+
+server.use('/graphiql', graphiqlExpress({ endpointURL: '/graphql'}));
+
+
 export default server;
diff --git a/src/views/home.pug b/src/views/home.pug
index 7835d6bbb2fa47bc8639a56d45e0373c45de791b..20f88d1de35b41901c1385d5def01325ccd3986f 100644
--- a/src/views/home.pug
+++ b/src/views/home.pug
@@ -12,4 +12,4 @@ block content
             input.form-control(type="search", name="columns")
         button.form-control(type="submit") Search
     |
-    a(href="/graphql") Check GraphQL
\ No newline at end of file
+    a(href="/graphiql") Check GraphQL
\ No newline at end of file
diff --git a/src/views/layout.pug b/src/views/layout.pug
index bfc94ddd789ba757fa4d14356642cf0d63f63c67..6bb139b28c74bee26256078a1c8668a863ff8b35 100644
--- a/src/views/layout.pug
+++ b/src/views/layout.pug
@@ -10,3 +10,4 @@ html(lang="en")
         title API server - #{title}
     body
         block content
+        
\ No newline at end of file