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