diff --git a/.env b/.env index 7b00263..c05b0bd 100644 --- a/.env +++ b/.env @@ -21,3 +21,5 @@ POOL_IDLE=10000 DEV_DATABASE_URL = postgres://vfbpnizybjvlgp:08a8b3922e6539cca6cb733f87a344178c4d883f998c811323bdd447195913e5@ec2-54-160-96-70.compute-1.amazonaws.com:5432/ddv5ljhh18mgjh +#Authentification token secret +JWT_SECRET = autolibDZ \ No newline at end of file diff --git a/app/app.js b/app/app.js index 601d888..bc61f7d 100644 --- a/app/app.js +++ b/app/app.js @@ -5,6 +5,8 @@ import bodyParser from 'body-parser'; import db from './models/index'; import abonnementRouter from './routes/abonnement.route'; import locataireRouter from './routes/locataire.route'; +import adminRouter from './routes/admin.route'; +import agentRouter from './routes/agent.route'; import vehiculesRouter from './routes/vehicule.route'; dotenv.config(); @@ -19,15 +21,28 @@ app.use(bodyParser.json()); db.sequelize.sync(); + + +// app.use('/api/abonnement', abonnementRouter); + +// Locataire Router app.use('/api/locataire', locataireRouter); +// Administrator Router +app.use('/api/admin', adminRouter); + +// Agent de maintenance Router +app.use('/api/agent', agentRouter); + // Vehicule Route app.use('/api/vehicules', vehiculesRouter); // Vehicule Route Of A Given Agent app.use('/api/vehicules/agents/:id', vehiculesRouter); + + //Home app.use((req, res) => { res.send('

Welcome to AutolibDZ REST API

'); diff --git a/app/controllers/admin.controller.js b/app/controllers/admin.controller.js new file mode 100644 index 0000000..466617c --- /dev/null +++ b/app/controllers/admin.controller.js @@ -0,0 +1,117 @@ +const db = require("../models"); +const bcrypt = require('bcryptjs') +const Admin = db.administrateur; + +// La creation d'un locataire (lors de l'inscription) +const createAdmin = async (req, res) => { + // Validate request + if (!req.body.nom || !req.body.prenom || !req.body.email || !req.body.motdepasse || !req.body.salaire) { + res.status(400).send({ + message: "Content can not be empty!" + }); + return; + } + const salt = await bcrypt.genSalt(10); + const mdp = await bcrypt.hash(req.body.motdepasse, salt); + + const admin = { + + nom: req.body.nom, + prenom: req.body.prenom, + email: req.body.email, + motDePasse: mdp, + salaire: req.body.salaire + + }; + + + // Enregistrer l'administrateur dans la BDD + try { + const data = await Admin.create(admin) + res.status(200).send({ success: true, message: `Admin ${admin.nom} ${admin.prenom} created successfully` }); + + } catch (err) { + res.status(500).send({ + error: err.message || "Some error occurred while creating l'Administrateur." + }); + } + +}; + +//Retourner tout les locataires +const findAll = (req, res) => { + var condition = 1 === 1 + + Admin.findAll({ where: condition }) + .then(data => { + if (data.length == 0) { + return res.status(400).send({ + success: false, + message: "No Admins were found" + }); + } + res.status(200).send({ success: true, data }); + }) + .catch(err => { + res.status(500).send({ + message: err.message || "Some error occurred while retrieving administrateur." + }); + }); +}; + +const findOne = async (req, res) => { + + Admin.findOne({ where: { idAdministrateur: req.params.id } }) + .then(data => { + if (!data) { + return res.status(400).send({ + success: false, + message: "Admin not found" + }); + } + res.status(200).send({ success: true, data }); + }) + .catch(err => { + res.status(500).send({ + message: err.message || "Some error occurred while retrieving the admin." + }); + }); +}; +const updateAdmin = async (req, res) => { + if (req.body.motdepasse) { + const salt = await bcrypt.genSalt(10); + req.body.motDePasse = await bcrypt.hash(req.body.motdepasse, salt); + } + Admin.update(req.body, { where: { idAdministrateur: req.params.id } }) + .then(result => { + res.status(200).send({ + success: true, + message: `Admin updated successfully` + }) + }).catch(err => { + res.status(400).send({ + success: false, + message: err.message + }) + }) +} +const deleteAdmin = async (req, res) => { + Admin.destroy({ where: { idAdministrateur: req.params.id } }).then(result => { + res.status(200).send({ + success: true, + message: `Admin deleted successfully` + }) + }).catch(err => { + res.status(400).send({ + success: false, + message: err.message + }) + }) +} +export default { + createAdmin, + findAll, + findOne, + updateAdmin, + deleteAdmin +} \ No newline at end of file diff --git a/app/controllers/agent.controller.js b/app/controllers/agent.controller.js new file mode 100644 index 0000000..5ad9dd6 --- /dev/null +++ b/app/controllers/agent.controller.js @@ -0,0 +1,115 @@ +const db = require("../models"); +const Agent = db.agent; +const bcrypt = require('bcryptjs') +// La creation d'un locataire (lors de l'inscription) +const createAgent = async (req, res) => { + // Validate request + if (!req.body.nom || !req.body.prenom || !req.body.email || !req.body.motdepasse || !req.body.salaire) { + res.status(400).send({ + message: "Content can not be empty!" + }); + return; + } + const salt = await bcrypt.genSalt(10); + const mdp = await bcrypt.hash(req.body.motdepasse, salt); + + const agent = { + nom: req.body.nom, + prenom: req.body.prenom, + email: req.body.email, + motDePasse: mdp, + salaire: req.body.salaire + + }; + + + // Enregistrer le locataire dans la BDD + try { + const data = await Agent.create(agent) + res.status(200).send({ success: true, message: `Agent ${agent.nom} ${agent.prenom} created successfully` }); + + } catch (err) { + res.status(500).send({ + error: err.message || "Some error occurred while creating the agent." + }); + } + +}; + +//Retourner tout les locataires +const findAll = (req, res) => { + var condition = 1 === 1 + + Agent.findAll({ where: condition }) + .then(data => { + if (data.length == 0) { + return res.status(400).send({ + success: false, + message: "No agents were found" + }); + } + res.status(200).send(data); + }) + .catch(err => { + res.status(500).send({ + message: err.message || "Some error occurred while retrieving agents." + }); + }); +}; + +const findOne = async (req, res) => { + + Agent.findOne({ where: { idAgentMaintenance: req.params.id } }) + .then(data => { + if (!data) { + return res.status(400).send({ + success: false, + message: "Agent not found" + }); + } + res.status(200).send(data); + }) + .catch(err => { + res.status(500).send({ + message: err.message || "Some error occurred while retrieving agent." + }); + }); +}; +const updateAgent = async (req, res) => { + if (req.body.motdepasse) { + const salt = await bcrypt.genSalt(10); + req.body.motDePasse = await bcrypt.hash(req.body.motdepasse, salt); + } + Agent.update(req.body, { where: { idAgentMaintenance: req.params.id } }) + .then(result => { + res.status(200).send({ + success: true, + message: `Agent ${req.body.nom} ${req.body.prenom} updated successfully` + }) + }).catch(err => { + res.status(400).send({ + success: false, + message: err.message + }) + }) +} +const deleteAgent = async (req, res) => { + Agent.destroy({ where: { idAgentMaintenance: req.params.id } }).then(result => { + res.status(200).send({ + success: true, + message: `Agent deleted successfully` + }) + }).catch(err => { + res.status(400).send({ + success: false, + message: err.message + }) + }) +} +export default { + createAgent, + findAll, + findOne, + updateAgent, + deleteAgent +} \ No newline at end of file diff --git a/app/controllers/locataire.controller.js b/app/controllers/locataire.controller.js index 0c0c939..a36045c 100644 --- a/app/controllers/locataire.controller.js +++ b/app/controllers/locataire.controller.js @@ -1,30 +1,35 @@ const db = require("../models"); +const bcrypt = require("bcryptjs"); const Locataire = db.locataire; // La creation d'un locataire (lors de l'inscription) -const createLocataire = async(req, res) => { +const createLocataire = async (req, res) => { // Validate request if (!req.body.nom || !req.body.prenom || !req.body.email || !req.body.motdepasse) { res.status(400).send({ + success: false, message: "Content can not be empty!" }); return; } + const salt = await bcrypt.genSalt(10); + const mdp = await bcrypt.hash(req.body.motdepasse, salt); const locataire = { nom: req.body.nom, prenom: req.body.prenom, email: req.body.email, - motdepasse: req.body.motdepasse + motDePasse: mdp }; + // Enregistrer le locataire dans la BDD try { - data = await Locataire.create(locataire) - res.send(data); + const data = await Locataire.create(locataire) + res.send({ success: true }); } catch (err) { res.status(500).send({ @@ -40,16 +45,75 @@ const findAll = (req, res) => { Locataire.findAll({ where: condition }) .then(data => { - res.send(data); + if (data.length == 0) { + return res.status(400).send({ + success: false, + message: "No locataires were found" + }); + } + res.status(200).send(data); + }) + .catch(err => { + res.status(500).send({ + message: err.message || "Some error occurred while retrieving locataire." + }); + }); +}; + +const findOne = async (req, res) => { + + Locataire.findOne({ where: { idLocataire: req.params.id } }) + .then(data => { + if (!data) { + return res.status(400).send({ + message: "Locataire not found" + }); + } + res.status(200).send(data); }) .catch(err => { res.status(500).send({ + success: false, message: err.message || "Some error occurred while retrieving locataire." }); }); }; +const updateLocataire = async (req, res) => { + if (req.body.motdepasse) { + const salt = await bcrypt.genSalt(10); + req.body.motDePasse = await bcrypt.hash(req.body.motdepasse, salt); + } + Locataire.update(req.body, { where: { idLocataire: req.params.id } }) + .then(result => { + res.status(200).send({ + success: true, + message: `Locataire updated successfully` + }) + }).catch(err => { + res.status(400).send({ + success: false, + message: err.message + }) + }) +} +const deleteLocataire = async (req, res) => { + Locataire.destroy({ where: { idLocataire: req.params.id } }).then(result => { + res.status(200).send({ + success: true, + message: `Locataire deleted successfully` + }) + }).catch(err => { + res.status(400).send({ + success: false, + message: err.message + }) + }) +} export default { createLocataire, - findAll + findAll, + findOne, + updateLocataire, + deleteLocataire } \ No newline at end of file diff --git a/app/models/abonnement.model.js b/app/models/abonnement.model.js index 479115f..d9bf9cc 100644 --- a/app/models/abonnement.model.js +++ b/app/models/abonnement.model.js @@ -1,6 +1,6 @@ import { Locataire } from './locataire.model' -module.exports = function(sequelize, Sequelize) { +module.exports = function (sequelize, Sequelize) { const Abonnement = sequelize.define("abonnement", { //added this idAbonnement: { diff --git a/app/models/administrateur.model.js b/app/models/administrateur.model.js index 4df9295..4e20dcf 100644 --- a/app/models/administrateur.model.js +++ b/app/models/administrateur.model.js @@ -1,8 +1,10 @@ -module.exports = function(sequelize, Sequelize) { +module.exports = function (sequelize, Sequelize) { const Administrateur = sequelize.define("administrateur", { idAdministrateur: { type: Sequelize.INTEGER, primaryKey: true, + autoIncrement: true, + }, nom: { type: Sequelize.STRING diff --git a/app/models/agent.model.js b/app/models/agent.model.js index 2162bca..f83d1d5 100644 --- a/app/models/agent.model.js +++ b/app/models/agent.model.js @@ -1,8 +1,13 @@ -module.exports = function(sequelize, Sequelize) { +var bcrypt = require("bcryptjs"); +var jwt = require("jsonwebtoken"); + +module.exports = function (sequelize, Sequelize) { const AgentMaintenance = sequelize.define("agentMaintenance", { idAgentMaintenance: { type: Sequelize.INTEGER, primaryKey: true, + autoIncrement: true, + }, nom: { type: Sequelize.STRING @@ -14,16 +19,17 @@ module.exports = function(sequelize, Sequelize) { type: Sequelize.STRING }, motDePasse: { - type: Sequelize.STRING(255) + type: Sequelize.STRING }, salaire: { type: Sequelize.DOUBLE } - }, { - freezeTableName: true, - tableName: 'agent_maintenance', - createdAt: false, - updatedAt: false - }); + }, + { + freezeTableName: true, + tableName: 'agent_maintenance', + createdAt: false, + updatedAt: false + }); return AgentMaintenance; }; \ No newline at end of file diff --git a/app/models/locataire.model.js b/app/models/locataire.model.js index e02ceae..d468cc3 100644 --- a/app/models/locataire.model.js +++ b/app/models/locataire.model.js @@ -1,8 +1,9 @@ -module.exports = function(sequelize, Sequelize) { +module.exports = function (sequelize, Sequelize) { const Locataire = sequelize.define("locataire", { idLocataire: { type: Sequelize.INTEGER, primaryKey: true, + autoIncrement: true, }, nom: { type: Sequelize.STRING(50) diff --git a/app/routes/admin.route.js b/app/routes/admin.route.js new file mode 100644 index 0000000..c0f5b3c --- /dev/null +++ b/app/routes/admin.route.js @@ -0,0 +1,12 @@ +import adminController from "../controllers/admin.controller"; + +var adminRouter = require("express").Router(); + + +adminRouter.post("/", adminController.createAdmin); +adminRouter.get("/", adminController.findAll); +adminRouter.get("/:id", adminController.findOne); +adminRouter.put("/:id", adminController.updateAdmin) +adminRouter.delete("/:id", adminController.deleteAdmin) + +export default adminRouter; \ No newline at end of file diff --git a/app/routes/agent.route.js b/app/routes/agent.route.js new file mode 100644 index 0000000..abe5207 --- /dev/null +++ b/app/routes/agent.route.js @@ -0,0 +1,12 @@ +import agentController from "../controllers/agent.controller"; + +var agentRouter = require("express").Router(); + + +agentRouter.post("/", agentController.createAgent); +agentRouter.get("/", agentController.findAll); +agentRouter.get("/:id", agentController.findOne); +agentRouter.put("/:id", agentController.updateAgent) +agentRouter.delete("/:id", agentController.deleteAgent) + +export default agentRouter; \ No newline at end of file diff --git a/app/routes/locataire.route.js b/app/routes/locataire.route.js index f93e795..a2eebdd 100644 --- a/app/routes/locataire.route.js +++ b/app/routes/locataire.route.js @@ -5,5 +5,8 @@ var router = require("express").Router(); router.post("/", locataireController.createLocataire); router.get("/", locataireController.findAll); +router.get("/:id", locataireController.findOne); +router.put("/:id", locataireController.updateLocataire) +router.delete("/:id", locataireController.deleteLocataire) export default router; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index dc3655b..5563962 100644 --- a/package-lock.json +++ b/package-lock.json @@ -184,6 +184,11 @@ "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", "optional": true }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", @@ -788,6 +793,11 @@ } } }, + "bcryptjs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", + "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=" + }, "binary-extensions": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", @@ -969,6 +979,15 @@ } } }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -1105,6 +1124,14 @@ "text-hex": "1.0.x" } }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -1113,8 +1140,7 @@ "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "optional": true + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" }, "concat-map": { "version": "0.0.1", @@ -1165,6 +1191,11 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, + "cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" + }, "copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", @@ -1280,6 +1311,11 @@ } } }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -1536,6 +1572,21 @@ "for-in": "^1.0.1" } }, + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "formidable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", + "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==" + }, "forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", @@ -1575,6 +1626,21 @@ "nan": "^2.12.1" } }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -1657,6 +1723,14 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, "has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", @@ -1670,6 +1744,11 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -2614,6 +2693,11 @@ } } }, + "object-inspect": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", + "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==" + }, "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", @@ -3570,6 +3654,16 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, "signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", @@ -3844,6 +3938,79 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" }, + "superagent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-6.1.0.tgz", + "integrity": "sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==", + "requires": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.2", + "debug": "^4.1.1", + "fast-safe-stringify": "^2.0.7", + "form-data": "^3.0.0", + "formidable": "^1.2.2", + "methods": "^1.1.2", + "mime": "^2.4.6", + "qs": "^6.9.4", + "readable-stream": "^3.6.0", + "semver": "^7.3.2" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "qs": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", + "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "supertest": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.1.3.tgz", + "integrity": "sha512-v2NVRyP73XDewKb65adz+yug1XMtmvij63qIWHZzSX8tp6wiq6xBLUy4SUAd2NII6wIipOmHT/FD9eicpJwdgQ==", + "requires": { + "methods": "^1.1.2", + "superagent": "^6.1.0" + } + }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", diff --git a/package.json b/package.json index aa9fba7..c540561 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "dependencies": { "babel-cli": "^6.26.0", "babel-preset-es2015": "^6.24.1", + "bcryptjs": "^2.4.3", "body-parser": "^1.19.0", "cors": "^2.8.5", "dotenv": "^8.2.0", @@ -22,6 +23,7 @@ "pg": "^8.6.0", "pg-hstore": "^2.3.3", "sequelize": "^6.6.2", + "supertest": "^6.1.3", "winston": "^3.3.3" }, "devDependencies": { diff --git a/spec/admin.spec.js b/spec/admin.spec.js new file mode 100644 index 0000000..a7492c4 --- /dev/null +++ b/spec/admin.spec.js @@ -0,0 +1,52 @@ +const Request = require('supertest'); +const request = Request('http://localhost:4000/api/admin'); +describe('Test CRUD admin route', () => { + it('It gets the admin with id 6', (done) => { + request.get("/6") + .expect(200) + .end((err, res) => { + if (err) done(err) + expect(res.body.data).not.toBe(undefined) + done(); + }) + + }) + it('It gets all the admins', (done) => { + request.get("/") + .expect(200) + .end((err, res) => { + if (err) done(err) + expect(res.body.data.length).not.toBe(0) + done(); + }) + + }) + const options = { + 'Content-Type': 'application/json' + } + let updatedAdmin = { + nom: "newNom", + prenom: "newPrenom", + } + it("It updates the admin with the id of 6", (done) => { + request.put("/6",) + .set(options) + .send(JSON.stringify(updatedAdmin)) + .expect(200) + .expect('Content-Type', 'application/json; charset=utf-8') + .end((err, res) => { + if (err) end(err) + expect(res.body.success).toBe(true) + done() + }) + }) + it("It Delets the admin with the id 6 ", (done) => { + request.delete("/6").expect(200) + .end((err, res) => { + if (err) end(err) + expect(res.body.success).toBe(true) + done() + }) + }) + +}) \ No newline at end of file diff --git a/spec/agent.spec.js b/spec/agent.spec.js new file mode 100644 index 0000000..44d6774 --- /dev/null +++ b/spec/agent.spec.js @@ -0,0 +1,52 @@ +const Request = require('supertest'); +const request = Request('http://localhost:4000/api/agent'); +describe('Test CRUD agent route', () => { + it('It gets the agent with id 4', (done) => { + request.get("/4") + .expect(200) + .end((err, res) => { + if (err) done(err) + expect(res.body.data).not.toBe(undefined) + done(); + }) + + }) + it('It gets all the agents', (done) => { + request.get("/") + .expect(200) + .end((err, res) => { + if (err) done(err) + expect(res.body.data.length).not.toBe(0) + done(); + }) + + }) + const options = { + 'Content-Type': 'application/json' + } + let updatedAdmin = { + nom: "newNom", + prenom: "newPrenom", + } + it("It updates the agent with the id of 6", (done) => { + request.put("/4",) + .set(options) + .send(JSON.stringify(updatedAdmin)) + .expect(200) + .expect('Content-Type', 'application/json; charset=utf-8') + .end((err, res) => { + if (err) end(err) + expect(res.body.success).toBe(true) + done() + }) + }) + it("It Delets the agent with the id 6 ", (done) => { + request.delete("/5").expect(200) + .end((err, res) => { + if (err) end(err) + expect(res.body.success).toBe(true) + done() + }) + }) + +}) \ No newline at end of file diff --git a/spec/locataire.spec.js b/spec/locataire.spec.js new file mode 100644 index 0000000..8e8b269 --- /dev/null +++ b/spec/locataire.spec.js @@ -0,0 +1,52 @@ +const Request = require('supertest'); +const request = Request('http://localhost:4000/api/locataire'); +describe('Test CRUD locataire route', () => { + it('It gets the locataire with id 4', (done) => { + request.get("/4") + .expect(200) + .end((err, res) => { + if (err) done(err) + expect(res.body.data).not.toBe(undefined) + done(); + }) + + }) + it('It gets all the locataires', (done) => { + request.get("/") + .expect(200) + .end((err, res) => { + if (err) done(err) + expect(res.body.data.length).not.toBe(0) + done(); + }) + + }) + const options = { + 'Content-Type': 'application/json' + } + let updatedlocataire = { + nom: "newNom", + prenom: "newPrenom", + } + it("It updates the agent with the id of 6", (done) => { + request.put("/4",) + .set(options) + .send(JSON.stringify(updatedlocataire)) + .expect(200) + .expect('Content-Type', 'application/json; charset=utf-8') + .end((err, res) => { + if (err) end(err) + expect(res.body.success).toBe(true) + done() + }) + }) + it("It Delets the locataire with the id 6 ", (done) => { + request.delete("/5").expect(200) + .end((err, res) => { + if (err) end(err) + expect(res.body.success).toBe(true) + done() + }) + }) + +}) \ No newline at end of file