diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..04077c39 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,7 @@ +FROM node:8 +COPY package-lock.json ./ +COPY index.js ./ +RUN npm install express +RUN npm install mysql +CMD ["node","index.js"] +EXPOSE 3000 \ No newline at end of file diff --git a/answers.md b/answers.md index b7025b97..630303d3 100644 --- a/answers.md +++ b/answers.md @@ -1,14 +1,14 @@ # Answers -Lastname: -Firstname: +Lastname: LEMGADAR +Firstname: Nohame ## 2.2 -command: +command: docker run app ## 2.3 -question: -command: +question: Par ce qu'il faut que le port 3000 soit ouvert +command:ducker -i app ## 2.5 question: diff --git a/index.js b/index.js new file mode 100644 index 00000000..021b4d38 --- /dev/null +++ b/index.js @@ -0,0 +1,826 @@ +const express = require('express'); +const mysql = require('mysql'); +const app = express(); + +const bodyParser=require('body-parser'); +app.use(bodyParser.urlencoded({extended:true})); + +const dhost = process.env.MYSQL_HOST; +const dport = process.env.MYSQL_PORT; +const ddatabase = process.env.MYSQL_DATABASE; +const dlogin = process.env.MYSQL_LOGIN; +const dpassword = process.env.MYSQL_PASSWORD; + +var db = mysql.createConnection({ + host : dhost, + user : dlogin, + password : dpassword, + database : ddatabase +}); + +//UPDATE UN-PAR-UN OU PLUSIEURS - Fait +//FAIRE LE FILTRE SUR FOOD-STATS - Fait + +//////////////////////////////////////////////////////// +// CONSOLE log // +//////////////////////////////////////////////////////// + +//AFFICHE LES REQUETES DEMANDEES + +app.use(function(req,res,next){ + console.log("Requete : ",req.method,req.originalUrl,req.query); + if(req.body.constructor === Object && Object.keys(req.body).length === 0){ + } + else{ + console.log(" Body : ",req.body); + } + next(); +}) + +///////////////////////////////////////////////////////// +// PARE FEU // +//////////////////////////////////////////////////////// + +app.use(function(req, res, next) { + if ("key" in req.query) { + var key = req.query["key"]; + var query = "SELECT * FROM users WHERE apikey='" + key + "'"; + db.query(query, function(err, result, fields) { + if (err) throw err; + if (result.length > 0) { + next(); + } else { + res.status(403); + res.send("403 Forbidden"); + } + }); + } else { + res.status(403); + res.send("403 Forbidden"); + } +}); + +///////////////////////////////////////////////////////// +// PARTIE ANIMAL // +//////////////////////////////////////////////////////// + +app.post('/animals', function(req, res) { + var name=req.body.name + var breed=req.body.breed + var food_per_day=req.body.food_per_day + var birthday=req.body.birthday + var entry_date=req.body.entry_date + var id_cage=req.body.id_cage + var query="INSERT INTO animals (name,breed,food_per_day,birthday,entry_date,id_cage) VALUES ('"+name+"','"+breed+"','"+food_per_day+"','"+birthday+"','"+entry_date+"','"+id_cage+"')"; + db.query(query,function(err,result,fields){ + if (err) throw err; + res.send(JSON.stringify("Success")); + }); +}); + +app.get('/animals', function(req, res) { + var query="SELECT * FROM animals" + ///////////////////////////////////////////////// + var conditions = ["id", "id_cage","name","breed","food_per_day","birthday","entry_date"]; + for (var index in conditions) { + if (conditions[index] in req.query) { + if (query.indexOf("WHERE") < 0) { + query += " WHERE"; + } else { + query += " AND"; + } + query += " " + conditions[index] + "='" + + req.query[conditions[index]] + "'"; + } + } + + if ("sort" in req.query) { + var sort = req.query["sort"].split(","); + query += " ORDER BY"; + for (var index in sort) { + var direction = sort[index].substr(0, 1); + var field = sort[index].substr(1); + query += " " + field; + if (direction == "-") + query += " DESC,"; + else + query += " ASC,"; + } query = query.slice(0, -1); + } + + if ("fields" in req.query) { + query = query.replace("*", req.query["fields"]); + } + + if ("limit" in req.query) { + query += " LIMIT " + req.query["limit"]; + if ("offset" in req.query) { + query += " OFFSET " + req.query["offset"]; + } + } + ///////////////////////////////////////////////// + db.query(query,function(err,result,fields){ + if (err) throw err; + res.send(JSON.stringify(result)); + }); +}); +app.get('/animals/:id', function(req, res) { + var id=req.params.id; + var query = "SELECT * FROM animals WHERE id=" + id; + ///////////////////////////////////////////////// + if ("fields" in req.query) { + query = query.replace("*", req.query["fields"]); + } + ///////////////////////////////////////////////// + db.query(query, function(err, result, fields) { + if (err) throw err; + res.send(JSON.stringify(result)); + }); +}); +app.get('/animals/:id/food', function(req, res) { + var id=req.params.id; + var query = "SELECT * FROM animals INNER JOIN food ON animals.id=food.id_animal WHERE animals.id=" + id; + ///////////////////////////////////////////////// + var conditions = ["id","name","id_animal","quantity"]; + for (var index in conditions) { + if (conditions[index] in req.query) { + query += " AND food."; + query += conditions[index] + "='" + + req.query[conditions[index]] + "'"; + } + } + + if ("sort" in req.query) { + var sort = req.query["sort"].split(","); + query += " ORDER BY"; + for (var index in sort) { + var direction = sort[index].substr(0, 1); + var field = sort[index].substr(1); + query += " " + field; + if (direction == "-") + query += " DESC,"; + else + query += " ASC,"; + } query = query.slice(0, -1); + } + + if ("fields" in req.query) { + query = query.replace("*", req.query["fields"]); + } + else{ + query = query.replace("*", "food.id,food.name,food.quantity"); + } + + + if ("limit" in req.query) { + query += " LIMIT " + req.query["limit"]; + if ("offset" in req.query) { + query += " OFFSET " + req.query["offset"]; + } + } + ///////////////////////////////////////////////// + db.query(query, function(err, result, fields) { + if (err) throw err; + res.send(JSON.stringify(result)); + }); +}); +// app.get('/animals/:id_animal/food/:id_food', function(req, res) { +// var id_animal=req.params.id_animal; +// var id_food=req.params.id_food; +// var query = "SELECT * FROM animals INNER JOIN food ON animals.id=food.id_animal WHERE food.id_animal= " + id_animal + " AND food.id=" +id_food; +// ///////////////////////////////////////////////// +// if ("fields" in req.query) { +// query = query.replace("*", req.query["fields"]); +// } +// else{ +// query = query.replace("*", "food.id,food.name,food.quantity"); +// } +// ///////////////////////////////////////////////// +// db.query(query, function(err, result, fields) { +// if (err) throw err; +// res.send(JSON.stringify(result)); +// }); +// }); +app.get('/animals/:id/cages', function(req, res) { + var id=req.params.id; + var query = "SELECT * FROM cages INNER JOIN animals ON cages.id=animals.id_cage WHERE animals.id=" + id; + ///////////////////////////////////////////////// + var conditions = ["id","name","description","area"]; + for (var index in conditions) { + if (conditions[index] in req.query) { + query += " AND cages."; + query += conditions[index] + "='" + + req.query[conditions[index]] + "'"; + } + } + + if ("sort" in req.query) { + var sort = req.query["sort"].split(","); + query += " ORDER BY"; + for (var index in sort) { + var direction = sort[index].substr(0, 1); + var field = sort[index].substr(1); + query += " " + field; + if (direction == "-") + query += " DESC,"; + else + query += " ASC,"; + } query = query.slice(0, -1); + } + + if ("fields" in req.query) { + query = query.replace("*", req.query["fields"]); + } + else{ + query = query.replace("*", "cages.id,cages.name,cages.description,cages.area"); + } + + if ("limit" in req.query) { + query += " LIMIT " + req.query["limit"]; + if ("offset" in req.query) { + query += " OFFSET " + req.query["offset"]; + } + } + ///////////////////////////////////////////////// + db.query(query, function(err, result, fields) { + if (err) throw err; + res.send(JSON.stringify(result)); + }); +}); +app.get('/animals/:id_animal/cages/:id_cage', function(req, res) { + var id_cage=req.params.id_cage; + var id_animal=req.params.id_animal; + var query = "SELECT * FROM cages INNER JOIN animals ON cages.id=animals.id_cage WHERE cages.id=" + id_cage + " AND animals.id= " + id_animal; + ///////////////////////////////////////////////// + if ("fields" in req.query) { + query = query.replace("*", req.query["fields"]); + } + else{ + query = query.replace("*", "cages.id,cages.name,cages.description,cages.area"); + } + ///////////////////////////////////////////////// + db.query(query, function(err, result, fields) { + if (err) throw err; + res.send(JSON.stringify(result)); + }); +}); + +app.put('/animals/:id', function(req, res) { + var id = req.params.id; + var query = "UPDATE animals SET "; + var conditions = ["name", "breed","food_per_day","birthday","entry_date","id_cage"]; + var i=0; + for (var index in conditions) { + if (conditions[index] in req.body) { + if (i==0) { + query += ""; + i+=1; + } else { + query += " , "; + } + query += " " + conditions[index] + "='" + req.body[conditions[index]] + "'"; + } + } + query += " WHERE id="+ id; + db.query(query, function(err, result, fields) { + if (err) throw err; + res.send(JSON.stringify("Success")); + }); +}); + +app.delete('/animals', function(req, res) { + var query = "DELETE FROM animals"; + db.query(query, function(err, result, fields) { + if (err) throw err; + res.send(JSON.stringify("Success")); + }); +}); +app.delete('/animals/:id', function(req, res) { + var id = req.params.id; + var query = "DELETE FROM animals WHERE id=" + id; + db.query(query, function(err, result, fields) { + if (err) throw err; + res.send(JSON.stringify("Success")); + }); +}); + +//////////////////////////////////////////////////////// +// PARTIE CAGES // +//////////////////////////////////////////////////////// + +app.post('/cages', function(req, res) { + var name=req.body.name + var description=req.body.description + var area=req.body.area + var query="INSERT INTO cages (name,description,area) VALUES ('"+name+"','"+description+"','"+area+"')"; + db.query(query,function(err,result,fields){ + if (err) throw err; + res.send(JSON.stringify("Success")); + }); +}); + +app.get('/cages', function(req, res) { + var query="SELECT * FROM cages" + ///////////////////////////////////////////////// + var conditions = ["id","name","description","area"]; + for (var index in conditions) { + if (conditions[index] in req.query) { + if (query.indexOf("WHERE") < 0) { + query += " WHERE"; + } else { + query += " AND"; + } + query += " " + conditions[index] + "='" + + req.query[conditions[index]] + "'"; + } + } + + if ("sort" in req.query) { + var sort = req.query["sort"].split(","); + query += " ORDER BY"; + for (var index in sort) { + var direction = sort[index].substr(0, 1); + var field = sort[index].substr(1); + query += " " + field; + if (direction == "-") + query += " DESC,"; + else + query += " ASC,"; + } query = query.slice(0, -1); + } + + if ("fields" in req.query) { + query = query.replace("*", req.query["fields"]); + } + + if ("limit" in req.query) { + query += " LIMIT " + req.query["limit"]; + if ("offset" in req.query) { + query += " OFFSET " + req.query["offset"]; + } + } + ///////////////////////////////////////////////// + db.query(query,function(err,result,fields){ + if (err) throw err; + res.send(JSON.stringify(result)); + }); +}); +app.get('/cages/:id', function(req, res) { + var id=req.params.id; + var query = "SELECT * FROM cages WHERE id=" + id; + ///////////////////////////////////////////////// + if ("fields" in req.query) { + query = query.replace("*", req.query["fields"]); + } + ///////////////////////////////////////////////// + db.query(query, function(err, result, fields) { + if (err) throw err; + res.send(JSON.stringify(result)); + }); +}); +app.get('/cages/:id/animals', function(req, res) { + var id=req.params.id; + var query = "SELECT * FROM cages INNER JOIN animals ON cages.id=animals.id_cage WHERE cages.id=" + id; + ///////////////////////////////////////////////// + var conditions = ["id","id_cage","name","breed","food_per_day","birthday","entry_date"]; + for (var index in conditions) { + if (conditions[index] in req.query) { + query += " AND animals."; + query += conditions[index] + "='" + + req.query[conditions[index]] + "'"; + } + } + + if ("sort" in req.query) { + var sort = req.query["sort"].split(","); + query += " ORDER BY"; + for (var index in sort) { + var direction = sort[index].substr(0, 1); + var field = sort[index].substr(1); + query += " " + field; + if (direction == "-") + query += " DESC,"; + else + query += " ASC,"; + } query = query.slice(0, -1); + } + + if ("fields" in req.query) { + query = query.replace("*", req.query["fields"]); + } + else{ + query = query.replace("*", "animals.id,animals.name,animals.breed,animals.food_per_day,animals.birthday,animals.entry_date"); + } + + if ("limit" in req.query) { + query += " LIMIT " + req.query["limit"]; + if ("offset" in req.query) { + query += " OFFSET " + req.query["offset"]; + } + } + ///////////////////////////////////////////////// + db.query(query, function(err, result, fields) { + if (err) throw err; + res.send(JSON.stringify(result)); + }); +}); +// app.get('/cages/:id_cage/animals/:id_animal', function(req, res) { +// var id_cage=req.params.id_cage; +// var id_animal=req.params.id_animal; +// var query = "SELECT * FROM cages INNER JOIN animals ON cages.id=animals.id_cage WHERE cages.id=" + id_cage + " AND animals.id= " + id_animal; +// ///////////////////////////////////////////////// +// if ("fields" in req.query) { +// query = query.replace("*", req.query["fields"]); +// } +// else{ +// query = query.replace("*", "animals.id,animals.name,animals.breed,animals.food_per_day,animals.birthday,animals.entry_date"); +// } +// ///////////////////////////////////////////////// +// db.query(query, function(err, result, fields) { +// if (err) throw err; +// res.send(JSON.stringify(result)); +// }); +// }); + +app.put('/cages/:id', function(req, res) { + var id = req.params.id; + var query = "UPDATE cages SET "; + var conditions = ["name", "description","area"]; + var i=0; + + for (var index in conditions) { + + if (conditions[index] in req.body) { + if (i==0) { + query += ""; + i+=1; + } else { + query += " , "; + } + query += " " + conditions[index] + "='" + req.body[conditions[index]] + "'"; + } + } + query += " WHERE id="+ id; + db.query(query, function(err, result, fields) { + if (err) throw err; + res.send(JSON.stringify("Success")); + }); +}); + +app.delete('/cages', function(req, res) { + var query = "DELETE FROM cages"; + db.query(query, function(err, result, fields) { + if (err) throw err; + res.send(JSON.stringify("Success")); + }); +}); +app.delete('/cages/:id', function(req, res) { + var id = req.params.id; + var query = "DELETE FROM cages WHERE id=" + id; + db.query(query, function(err, result, fields) { + if (err) throw err; + res.send(JSON.stringify("Success")); + }); +}); + +//////////////////////////////////////////////////////// +// PARTIE NOURRITURE // +//////////////////////////////////////////////////////// + +app.post('/food', function(req, res) { + var name=req.body.name + var id_animal=req.body.id_animal + var quantity=req.body.quantity + var query="INSERT INTO food (name,id_animal,quantity) VALUES ('"+name+"','"+id_animal+"','"+quantity+"')"; + db.query(query,function(err,result,fields){ + if (err) throw err; + res.send(JSON.stringify("Success")); + }); +}); + +app.get('/food', function(req, res) { + var query="SELECT * FROM food" + ///////////////////////////////////////////////// + var conditions = ["id","name","id_animal","quantity"]; + for (var index in conditions) { + if (conditions[index] in req.query) { + if (query.indexOf("WHERE") < 0) { + query += " WHERE"; + } else { + query += " AND"; + } + query += " " + conditions[index] + "='" + + req.query[conditions[index]] + "'"; + } + } + + if ("sort" in req.query) { + var sort = req.query["sort"].split(","); + query += " ORDER BY"; + for (var index in sort) { + var direction = sort[index].substr(0, 1); + var field = sort[index].substr(1); + query += " " + field; + if (direction == "-") + query += " DESC,"; + else + query += " ASC,"; + } query = query.slice(0, -1); + } + + if ("fields" in req.query) { + query = query.replace("*", req.query["fields"]); + } + + if ("limit" in req.query) { + query += " LIMIT " + req.query["limit"]; + if ("offset" in req.query) { + query += " OFFSET " + req.query["offset"]; + } + } + ///////////////////////////////////////////////// + db.query(query,function(err,result,fields){ + if (err) throw err; + res.send(JSON.stringify(result)); + }); +}); +app.get('/food/:id', function(req, res) { + var id=req.params.id; + var query = "SELECT * FROM food WHERE id=" + id; + ///////////////////////////////////////////////// + if ("fields" in req.query) { + query = query.replace("*", req.query["fields"]); + } + ///////////////////////////////////////////////// + db.query(query, function(err, result, fields) { + if (err) throw err; + res.send(JSON.stringify(result)); + }); +}); +app.get('/food/:id/animals', function(req, res) { + var id=req.params.id; + var query = "SELECT * FROM animals INNER JOIN food ON animals.id=food.id_animal WHERE food.id=" + id; + ///////////////////////////////////////////////// + var conditions = ["id","id_cage","name","breed","food_per_day","birthday","entry_date"]; + for (var index in conditions) { + if (conditions[index] in req.query) { + query += " AND animals."; + query += conditions[index] + "='" + + req.query[conditions[index]] + "'"; + } + } + + if ("sort" in req.query) { + var sort = req.query["sort"].split(","); + query += " ORDER BY"; + for (var index in sort) { + var direction = sort[index].substr(0, 1); + var field = sort[index].substr(1); + query += " " + field; + if (direction == "-") + query += " DESC,"; + else + query += " ASC,"; + } query = query.slice(0, -1); + } + + if ("fields" in req.query) { + query = query.replace("*", req.query["fields"]); + } + else{ + query = query.replace("*", "animals.id,animals.name,animals.breed,animals.food_per_day,animals.birthday,animals.entry_date"); + } + + if ("limit" in req.query) { + query += " LIMIT " + req.query["limit"]; + if ("offset" in req.query) { + query += " OFFSET " + req.query["offset"]; + } + } + ///////////////////////////////////////////////// + db.query(query, function(err, result, fields) { + if (err) throw err; + res.send(JSON.stringify(result)); + }); +}); +app.get('/food/:id_food/animals/:id_animal', function(req, res) { + var id_animal=req.params.id_animal; + var id_food=req.params.id_food; + var query = "SELECT * FROM food INNER JOIN animals ON animals.id=food.id_animal WHERE animals.id= " + id_animal + " AND food.id=" +id_food; + ///////////////////////////////////////////////// + if ("fields" in req.query) { + query = query.replace("*", req.query["fields"]); + } + else{ + query = query.replace("*", "animals.id,animals.name,animals.breed,animals.food_per_day,animals.birthday,animals.entry_date"); + // query = "SELECT food.id,food.name,food.quantity,food.id_animal FROM animals INNER JOIN food ON animals.id=food.id_animal WHERE animals.id= " + id_animal + " AND food.id=" +id_food; + } + ///////////////////////////////////////////////// + db.query(query, function(err, result, fields) { + if (err) throw err; + res.send(JSON.stringify(result)); + }); +}); + +app.put('/food/:id', function(req, res) { + var id = req.params.id; + var query = "UPDATE food SET "; + var conditions = ["name", "quantity","id_animal"]; + var i=0; + for (var index in conditions) { + + if (conditions[index] in req.body) { + if (i==0) { + query += ""; + i+=1; + } else { + query += " , "; + } + query += " " + conditions[index] + "='" + req.body[conditions[index]] + "'"; + } + } + query += " WHERE id="+ id; + db.query(query, function(err, result, fields) { + if (err) throw err; + res.send(JSON.stringify("Success")); + }); +}); + +app.delete('/food', function(req, res) { + var query = "DELETE FROM food"; + db.query(query, function(err, result, fields) { + if (err) throw err; + res.send(JSON.stringify("Success")); + }); +}); +app.delete('/food/:id', function(req, res) { + var id = req.params.id; + var query = "DELETE FROM food WHERE id=" + id; + db.query(query, function(err, result, fields) { + if (err) throw err; + res.send(JSON.stringify("Success")); + }); +}); + +//////////////////////////////////////////////////////// +// PARTIE PERSONNEL // +//////////////////////////////////////////////////////// + +app.post('/staff', function(req, res) { + var firstname=req.body.firstname + var lastname=req.body.lastname + var wage=req.body.wage + var query="INSERT INTO staff (firstname,lastname,wage) VALUES ('"+firstname+"','"+lastname+"','"+wage+"')"; + db.query(query,function(err,result,fields){ + if (err) throw err; + res.send(JSON.stringify("Success")); + }); +}); + +app.get('/staff', function(req, res) { + var query="SELECT * FROM staff" + ///////////////////////////////////////////////// + var conditions = ["id","firstname","lastname","wage"]; + for (var index in conditions) { + if (conditions[index] in req.query) { + if (query.indexOf("WHERE") < 0) { + query += " WHERE"; + } else { + query += " AND"; + } + query += " " + conditions[index] + "='" + + req.query[conditions[index]] + "'"; + } + } + + if ("sort" in req.query) { + var sort = req.query["sort"].split(","); + query += " ORDER BY"; + for (var index in sort) { + var direction = sort[index].substr(0, 1); + var field = sort[index].substr(1); + query += " " + field; + if (direction == "-") + query += " DESC,"; + else + query += " ASC,"; + } query = query.slice(0, -1); + } + + if ("fields" in req.query) { + query = query.replace("*", req.query["fields"]); + } + + if ("limit" in req.query) { + query += " LIMIT " + req.query["limit"]; + if ("offset" in req.query) { + query += " OFFSET " + req.query["offset"]; + } + } + ///////////////////////////////////////////////// + db.query(query,function(err,result,fields){ + if (err) throw err; + res.send(JSON.stringify(result)); + }); +}); +app.get('/staff/:id', function(req, res) { + var id=req.params.id; + var query = "SELECT * FROM staff WHERE id=" + id; + ///////////////////////////////////////////////// + if ("fields" in req.query) { + query = query.replace("*", req.query["fields"]); + } + ///////////////////////////////////////////////// + db.query(query, function(err, result, fields) { + if (err) throw err; + res.send(JSON.stringify(result)); + }); +}); + +app.put('/staff/:id', function(req, res) { + var id = req.params.id; + var query = "UPDATE staff SET "; + var conditions = ["firstname", "lastname","wage"]; + var i=0; + for (var index in conditions) { + if (conditions[index] in req.body) { + if (i==0) { + query += ""; + i+=1; + } else { + query += " , "; + } + query += " " + conditions[index] + "='" + req.body[conditions[index]] + "'"; + } + } + query += " WHERE id="+ id; + db.query(query, function(err, result, fields) { + if (err) throw err; + res.send(JSON.stringify("Success")); + }); +}); + +app.delete('/staff', function(req, res) { + var query = "DELETE FROM staff"; + db.query(query, function(err, result, fields) { + if (err) throw err; + res.send(JSON.stringify("Success")); + }); +}); +app.delete('/staff/:id', function(req, res) { + var id = req.params.id; + var query = "DELETE FROM staff WHERE id=" + id; + db.query(query, function(err, result, fields) { + if (err) throw err; + res.send(JSON.stringify("Success")); + }); +}); + +//////////////////////////////////////////// +// FOOD STATS // +//////////////////////////////////////////// + +app.get('/food-stats', function(req, res) { + var query="select animals.id, quantity/food_per_day as days_left from animals join food on animals.id=food.id_animal" + + db.query(query,function(err,result,fields){ + if (err) throw err; + var stringified=JSON.stringify(result); + stringified=stringified.replace(/null/g,0); + + res.send(stringified); + // console.log(result.length); + // console.log("lol : "+array); + // console.log(typeof array); + + // console.log("id : ",result[0].id); + // console.log("days_left : ",result[0].days_left); + // console.log(result[0]); + // console.log(i); + // // tableau+="id : "+result[0].id+' '; + // // tableau+="days_left : "+result[0].days_left; + // // res.send(tableau); + + }); + // var query2="select animals.id, quantity,food_per_day from animals join food on animals.id=food.id_animal" + // db.query(query2,function(err,result,fields){ + // if (err) throw err; + // var array = new Array(); + // for(var i=0; i < result.length;i++){ + // array.push(result[i].id); + // array.push(result[i].quantity/result[i].food_per_day); + // } + // console.log(array); + // }); +}); + + +/////////////////////////////////////////////////////// + +app.listen(3000, function() { + db.connect(function(err) { + if (err) throw err; + console.log('Connection to database successful!'); + }); + console.log('Example app listening on port 3000!'); +}); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..0850a96f --- /dev/null +++ b/package-lock.json @@ -0,0 +1,419 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "accepts": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "requires": { + "mime-types": "~2.1.18", + "negotiator": "0.6.1" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "bignumber.js": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-4.1.0.tgz", + "integrity": "sha512-eJzYkFYy9L4JzXsbymsFn3p54D+llV27oTQ+ziJG7WFRheJcNZilgVXMG0LoZtlQSKBsJdWtLFqOD0u+U0jZKA==" + }, + "body-parser": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", + "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", + "requires": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "~1.6.3", + "iconv-lite": "0.4.23", + "on-finished": "~2.3.0", + "qs": "6.5.2", + "raw-body": "2.3.3", + "type-is": "~1.6.16" + } + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "express": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", + "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", + "requires": { + "accepts": "~1.3.5", + "array-flatten": "1.1.1", + "body-parser": "1.18.3", + "content-disposition": "0.5.2", + "content-type": "~1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.1.1", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.4", + "qs": "6.5.2", + "range-parser": "~1.2.0", + "safe-buffer": "5.1.2", + "send": "0.16.2", + "serve-static": "1.13.2", + "setprototypeof": "1.1.0", + "statuses": "~1.4.0", + "type-is": "~1.6.16", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + } + }, + "finalhandler": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.4.0", + "unpipe": "~1.0.0" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "http-errors": { + "version": "1.6.3", + "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ipaddr.js": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", + "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + }, + "mime-db": { + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", + "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==" + }, + "mime-types": { + "version": "2.1.21", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", + "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", + "requires": { + "mime-db": "~1.37.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "mysql": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.16.0.tgz", + "integrity": "sha512-dPbN2LHonQp7D5ja5DJXNbCLe/HRdu+f3v61aguzNRQIrmZLOeRoymBYyeThrR6ug+FqzDL95Gc9maqZUJS+Gw==", + "requires": { + "bignumber.js": "4.1.0", + "readable-stream": "2.3.6", + "safe-buffer": "5.1.2", + "sqlstring": "2.3.1" + } + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "proxy-addr": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", + "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.8.0" + } + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + }, + "raw-body": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", + "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", + "unpipe": "1.0.0" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + } + }, + "serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + } + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "sqlstring": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", + "integrity": "sha1-R1OT/56RR5rqYtyvDKPRSYOn+0A=" + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "type-is": { + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", + "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.18" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + } + } +}