diff --git a/api/openapi.yaml b/api/openapi.yaml index b24d5ea18ea9635d5e7a798b9d016c0f27b1059a..3a9a9e958a721b455033038133b0c5cffa7019ed 100644 --- a/api/openapi.yaml +++ b/api/openapi.yaml @@ -84,33 +84,6 @@ paths: schema: $ref: '#/components/schemas/User' x-swagger-router-controller: User - /user/createWithList: - post: - tags: - - user - summary: Creates list of users with given input array - description: Creates list of users with given input array - operationId: createUsersWithListInput - requestBody: - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/User' - responses: - "200": - description: Successful operation - content: - application/json: - schema: - $ref: '#/components/schemas/User' - application/xml: - schema: - $ref: '#/components/schemas/User' - default: - description: successful operation - x-swagger-router-controller: User /user/login: get: tags: @@ -119,22 +92,22 @@ paths: description: "" operationId: loginUser parameters: - - name: username - in: query - description: The user name for login - required: false - style: form - explode: true - schema: - type: string - - name: password - in: query - description: The password for login in clear text - required: false - style: form - explode: true - schema: - type: string + - name: username + in: query + description: The user name for login + required: true + style: form + explode: true + schema: + type: string + - name: password + in: query + description: The password for login in clear text + required: true + style: form + explode: true + schema: + type: string responses: "200": description: successful operation @@ -176,89 +149,6 @@ paths: default: description: successful operation x-swagger-router-controller: User - /user/{username}: - get: - tags: - - user - summary: Get user by user name - description: "" - operationId: getUserByName - parameters: - - name: username - in: path - description: 'The name that needs to be fetched. Use user1 for testing. ' - required: true - style: simple - explode: false - schema: - type: string - responses: - "200": - description: successful operation - content: - application/json: - schema: - $ref: '#/components/schemas/User' - application/xml: - schema: - $ref: '#/components/schemas/User' - "400": - description: Invalid username supplied - "404": - description: User not found - x-swagger-router-controller: User - put: - tags: - - user - summary: Update user - description: This can only be done by the logged in user. - operationId: updateUser - parameters: - - name: username - in: path - description: name that need to be deleted - required: true - style: simple - explode: false - schema: - type: string - requestBody: - description: Update an existent user in the - content: - application/json: - schema: - $ref: '#/components/schemas/User' - application/xml: - schema: - $ref: '#/components/schemas/User' - application/x-www-form-urlencoded: - schema: - $ref: '#/components/schemas/User' - responses: - default: - description: successful operation - x-swagger-router-controller: User - delete: - tags: - - user - summary: Delete user - description: This can only be done by the logged in user. - operationId: deleteUser - parameters: - - name: username - in: path - description: The name that needs to be deleted - required: true - style: simple - explode: false - schema: - type: string - responses: - "400": - description: Invalid username supplied - "404": - description: User not found - x-swagger-router-controller: User components: schemas: Ad: @@ -327,24 +217,91 @@ components: User: type: object properties: - id: - type: integer - format: int64 username: type: string - firstName: - type: string - lastName: - type: string - email: - type: string + example: theUser password: type: string - phone: + example: "12345" + isAgent: + type: boolean + example: true + required: + - username + - password + - isAgent + example: + password: "12345" + username: theUser + isAgent: true + xml: + name: user + Tag: + type: object + properties: + id: + type: integer + format: int64 + name: type: string - userStatus: + example: + name: name + id: 0 + xml: + name: tag + Pet: + required: + - name + - photoUrls + type: object + properties: + id: type: integer - format: int32 + format: int64 + example: 10 + name: + type: string + example: doggie + category: + $ref: '#/components/schemas/Category' + photoUrls: + type: array + xml: + wrapped: true + items: + type: string + xml: + name: photoUrl + tags: + type: array + xml: + wrapped: true + items: + $ref: '#/components/schemas/Tag' + status: + type: string + description: pet status in the store + enum: + - available + - pending + - sold + example: + photoUrls: + - photoUrls + - photoUrls + name: doggie + id: 10 + category: + name: Dogs + id: 1 + tags: + - name: name + id: 0 + - name: name + id: 0 + status: available + xml: + name: pet ApiResponse: type: object properties: diff --git a/controllers/User.js b/controllers/User.js index 121e17ca03b050b61903dca325b6b7d242478eaf..ff5962c22facce13ac000131460e8f6eade9cc1e 100644 --- a/controllers/User.js +++ b/controllers/User.js @@ -2,66 +2,44 @@ var utils = require('../utils/writer.js'); var User = require('../service/UserService'); +var passport = require('../passeport-config'); +var UserModel = require('../models/User'); -module.exports.createUser = function createUser (req, res, next, body) { - User.createUser(body) - .then(function (response) { - utils.writeJson(res, response); - }) - .catch(function (response) { - utils.writeJson(res, response); - }); -}; - -module.exports.createUser = function createUser (req, res, next, body) { - User.createUser(body) - .then(function (response) { - utils.writeJson(res, response); - }) - .catch(function (response) { - utils.writeJson(res, response); - }); -}; +// passport.use(UserModel.createStrategy()); -module.exports.createUsersWithListInput = function createUsersWithListInput (req, res, next, body) { - User.createUsersWithListInput(body) - .then(function (response) { - utils.writeJson(res, response); - }) - .catch(function (response) { - utils.writeJson(res, response); - }); +module.exports.createUser = async function(req, res) { + try { + const { username, password, isAgent } = req.body; + await User.createUser(username, password, isAgent); + utils.writeJson(res, { message: 'Utilisateur créé avec succès' }); + } catch (error) { + utils.writeJson(res, { error: error.message }); + } }; -module.exports.deleteUser = function deleteUser (req, res, next, username) { - User.deleteUser(username) - .then(function (response) { - utils.writeJson(res, response); - }) - .catch(function (response) { - utils.writeJson(res, response); - }); -}; - -module.exports.getUserByName = function getUserByName (req, res, next, username) { - User.getUserByName(username) - .then(function (response) { - utils.writeJson(res, response); - }) - .catch(function (response) { - utils.writeJson(res, response); - }); -}; - -module.exports.loginUser = function loginUser (req, res, next, username, password) { - User.loginUser(username, password) - .then(function (response) { - utils.writeJson(res, response); - }) - .catch(function (response) { - utils.writeJson(res, response); - }); -}; +module.exports.loginUser = async function loginUser(req, res, next) { + try { + passport.authenticate('local', (err, user, info) => { + if (err) { + return res.status(500).send(err); // Erreur interne du serveur + } + if (!user) { + return res.status(401).send('Invalid username or password.'); // Non autorisé + } + // User.loginUser() + // .then(function (response) { + // utils.writeJson(res, response); + // }) + // .catch(function (response) { + // utils.writeJson(res, response); + // }); + return res.status(200).send('Authentication successful.'); // Succès + })(req, res, next); + } catch (error) { + console.error("Erreur lors de la tentative de connexion :", error); + return res.status(500).send(error); + } +} module.exports.logoutUser = function logoutUser (req, res, next) { User.logoutUser() @@ -73,22 +51,19 @@ module.exports.logoutUser = function logoutUser (req, res, next) { }); }; -module.exports.updateUser = function updateUser (req, res, next, body, username) { - User.updateUser(body, username) - .then(function (response) { - utils.writeJson(res, response); - }) - .catch(function (response) { - utils.writeJson(res, response); - }); -}; - -module.exports.updateUser = function updateUser (req, res, next, body, username) { - User.updateUser(body, username) - .then(function (response) { - utils.writeJson(res, response); - }) - .catch(function (response) { - utils.writeJson(res, response); - }); -}; +module.exports.logoutUser = function(req, res, next) { + try { + /* + req.logout(function(err) { + if (err) { + return next(err); + } + res.redirect('/'); + }); + */ + return res.status(200).send('Logout successful.'); // Success + } catch (error) { + console.error("Erreur lors de la déconnexion de l'utilisateur :", error); + return res.status(500).send(error); + } +}; \ No newline at end of file diff --git a/index.js b/index.js index baca121d396ae80fe6fa885da3b978cbfec22371..e7216e0e0c024ce35991856983dfc2d24606df05 100644 --- a/index.js +++ b/index.js @@ -2,6 +2,7 @@ var path = require('path'); var http = require('http'); +var session = require('express-session'); var oas3Tools = require('oas3-tools'); var serverPort = 8080; @@ -17,10 +18,18 @@ var expressAppConfig = oas3Tools.expressAppConfig(path.join(__dirname, 'api/open var app = expressAppConfig.getApp(); const connectToDatabase = require('./data-access/connection'); +const passport = require("./passeport-config"); + +// app.use(session({ secret: 'fifiHajar', resave: true, saveUninitialized: true })); +// app.use(passport.initialize()); +// app.use(passport.session()); // Connect to the database connectToDatabase() .then(() => { + + + // Initialize the Swagger middleware http.createServer(app).listen(serverPort, function () { console.log('Your server is listening on port %d (http://localhost:%d)', serverPort, serverPort); diff --git a/package-lock.json b/package-lock.json index 8b5177e925ca7bb1b3ea84ea27814331b0287d81..b9fa18ea54217485aa2916df92b261280de47a9b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,11 +11,16 @@ "dependencies": { "connect": "^3.2.0", "dotenv": "^16.3.1", + "express-session": "^1.17.3", "js-yaml": "^3.3.0", "mongoose": "^7.6.3", - "nodemon": "^3.0.1", "oas3-tools": "^2.2.3", + "passport": "^0.6.0", + "passport-local": "^1.0.0", "passport-local-mongoose": "^8.0.0" + }, + "devDependencies": { + "nodemon": "^3.0.1" } }, "node_modules/@apidevtools/json-schema-ref-parser": { @@ -175,7 +180,8 @@ "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true }, "node_modules/accepts": { "version": "1.3.8", @@ -208,6 +214,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -245,7 +252,8 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true }, "node_modules/basic-auth": { "version": "2.0.1", @@ -267,6 +275,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, "engines": { "node": ">=8" } @@ -303,6 +312,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -312,6 +322,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, "dependencies": { "fill-range": "^7.0.1" }, @@ -374,6 +385,7 @@ "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, "funding": [ { "type": "individual", @@ -399,7 +411,8 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true }, "node_modules/concat-stream": { "version": "1.6.2", @@ -710,6 +723,40 @@ "node": ">=10.0.0" } }, + "node_modules/express-session": { + "version": "1.17.3", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.3.tgz", + "integrity": "sha512-4+otWXlShYlG1Ma+2Jnn+xgKUZTMJ5QD3YvfilX3AcocOAbIkVylSWEklzALe/+Pu4qV6TYBj5GwOBFfdKqLBw==", + "dependencies": { + "cookie": "0.4.2", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-headers": "~1.0.2", + "parseurl": "~1.3.3", + "safe-buffer": "5.2.1", + "uid-safe": "~2.1.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/express-session/node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express-session/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/express/node_modules/body-parser": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", @@ -868,6 +915,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -912,6 +960,7 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -952,6 +1001,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -974,6 +1024,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, "engines": { "node": ">=4" } @@ -1056,7 +1107,8 @@ "node_modules/ignore-by-default": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==" + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true }, "node_modules/inherits": { "version": "2.0.3", @@ -1080,6 +1132,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, "dependencies": { "binary-extensions": "^2.0.0" }, @@ -1091,6 +1144,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -1099,6 +1153,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -1110,6 +1165,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, "engines": { "node": ">=0.12.0" } @@ -1185,6 +1241,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -1253,6 +1310,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -1453,6 +1511,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz", "integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==", + "dev": true, "dependencies": { "chokidar": "^3.5.2", "debug": "^3.2.7", @@ -1480,6 +1539,7 @@ "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, "dependencies": { "ms": "^2.1.1" } @@ -1487,12 +1547,14 @@ "node_modules/nodemon/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true }, "node_modules/nopt": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, "dependencies": { "abbrev": "1" }, @@ -1507,6 +1569,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -1604,6 +1667,23 @@ "node": ">= 0.8" } }, + "node_modules/passport": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.6.0.tgz", + "integrity": "sha512-0fe+p3ZnrWRW74fe8+SvCyf4a3Pb2/h7gFkQ8yTJpAO50gDzlfjZUZTO1k5Eg9kUct22OxHLqDZoKUWRHOh9ug==", + "dependencies": { + "passport-strategy": "1.x.x", + "pause": "0.0.1", + "utils-merge": "^1.0.1" + }, + "engines": { + "node": ">= 0.4.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jaredhanson" + } + }, "node_modules/passport-local": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/passport-local/-/passport-local-1.0.0.tgz", @@ -1641,10 +1721,16 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.2.0.tgz", "integrity": "sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==" }, + "node_modules/pause": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==" + }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, "engines": { "node": ">=8.6" }, @@ -1672,7 +1758,8 @@ "node_modules/pstree.remy": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true }, "node_modules/punycode": { "version": "2.3.0", @@ -1696,6 +1783,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/random-bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", + "integrity": "sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -1733,6 +1828,7 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, "dependencies": { "picomatch": "^2.2.1" }, @@ -1773,6 +1869,7 @@ "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -1921,6 +2018,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, "dependencies": { "semver": "^7.5.3" }, @@ -1989,6 +2087,7 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -2000,6 +2099,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -2019,6 +2119,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, "dependencies": { "nopt": "~1.0.10" }, @@ -2062,10 +2163,22 @@ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" }, + "node_modules/uid-safe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", + "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", + "dependencies": { + "random-bytes": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/undefsafe": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true }, "node_modules/undici-types": { "version": "5.25.3", @@ -2140,7 +2253,8 @@ "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true } } } diff --git a/package.json b/package.json index d0d1e8ca1abd3065dc5da120c81a04d54b1b9b04..c977aa0d3149639c7f4bbc1c7862ac28208e31de 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,13 @@ "prestart": "npm install", "start": "nodemon index.js" }, + "nodemonConfig": { + "watch": [ + "api/openapi.yaml" + ], + "ext": "js,yaml", + "exec": "node index.js" + }, "keywords": [ "swagger" ], @@ -15,10 +22,15 @@ "dependencies": { "connect": "^3.2.0", "dotenv": "^16.3.1", + "express-session": "^1.17.3", "js-yaml": "^3.3.0", "mongoose": "^7.6.3", - "nodemon": "^3.0.1", "oas3-tools": "^2.2.3", + "passport": "^0.6.0", + "passport-local": "^1.0.0", "passport-local-mongoose": "^8.0.0" + }, + "devDependencies": { + "nodemon": "^3.0.1" } } diff --git a/passeport-config.js b/passeport-config.js new file mode 100644 index 0000000000000000000000000000000000000000..7db6a168b1357d37d3e362ebfe7f8be8885dbfd1 --- /dev/null +++ b/passeport-config.js @@ -0,0 +1,35 @@ +const passport = require('passport'); +const LocalStrategy = require('passport-local').Strategy; + +const User = require('./models/User'); + +passport.use(new LocalStrategy( + { usernameField: 'username' }, + function(username, password, done) { + User.authenticate()(username, password, async function(err, user) { + if (err) { return done(err); } + if (!user) { + return done(null, false); + } + return done(null, user); + }); + } +)); + +passport.serializeUser(function(user, done) { + done(null, user.username); +}); + +passport.deserializeUser( async function(username, done) { + try { + const user = await User.findOne({ username: username }); + if (!user) { + return done(null, false, { message: 'Utilisateur non trouvé.' }); + } + return done(null, user); + } catch (error) { + return done(error); + } +}); + +module.exports = passport; \ No newline at end of file diff --git a/service/UserService.js b/service/UserService.js index b102f62953ae35d93e871ddc1f6d24001342be5f..94127af3d4c976db56e30fba74c72028a29a7d79 100644 --- a/service/UserService.js +++ b/service/UserService.js @@ -1,26 +1,9 @@ 'use strict'; -const User = require('../models/User') - -/** - * Créer un nouvel utilisateur - * Cela ne peut être fait que par l'utilisateur connecté. - * - * body User Object utilisateur créé (optionnel) - * returns User - **/ -exports.createUser = function(body) { - return new Promise(async (resolve, reject) => { - try { - const newUser = new User(body); - const savedUser = await newUser.save(); - resolve(savedUser); - } catch (error) { - reject(error); - } - }); -} +const passport = require('../passeport-config'); +const User = require('../models/User'); +passport.use(User.createStrategy()); /** * Create user @@ -29,98 +12,15 @@ exports.createUser = function(body) { * body User Created user object (optional) * returns User **/ -exports.createUser = function(body) { - return new Promise(function(resolve, reject) { - var examples = {}; - examples['application/json'] = { - "firstName" : "John", - "lastName" : "James", - "password" : "12345", - "userStatus" : 1, - "phone" : "12345", - "id" : 10, - "email" : "john@email.com", - "username" : "theUser" -}; - if (Object.keys(examples).length > 0) { - resolve(examples[Object.keys(examples)[0]]); - } else { - resolve(); - } - }); -} +exports.createUser = async function(username, password, isAgent) { + const existingUser = await User.findOne({ username }); + if (existingUser) { + throw new Error('This user already exists.'); + } -/** - * Creates list of users with given input array - * Creates list of users with given input array - * - * body List (optional) - * returns User - **/ -exports.createUsersWithListInput = function(body) { - return new Promise(function(resolve, reject) { - var examples = {}; - examples['application/json'] = { - "firstName" : "John", - "lastName" : "James", - "password" : "12345", - "userStatus" : 1, - "phone" : "12345", - "id" : 10, - "email" : "john@email.com", - "username" : "theUser" + await User.register(new User ({ username : username, isAgent : isAgent}), password); }; - if (Object.keys(examples).length > 0) { - resolve(examples[Object.keys(examples)[0]]); - } else { - resolve(); - } - }); -} - - -/** - * Delete user - * This can only be done by the logged in user. - * - * username String The name that needs to be deleted - * no response value expected for this operation - **/ -exports.deleteUser = function(username) { - return new Promise(function(resolve, reject) { - resolve(); - }); -} - - -/** - * Get user by user name - * - * username String The name that needs to be fetched. Use user1 for testing. - * returns User - **/ -exports.getUserByName = function(username) { - return new Promise(function(resolve, reject) { - var examples = {}; - examples['application/json'] = { - "firstName" : "John", - "lastName" : "James", - "password" : "12345", - "userStatus" : 1, - "phone" : "12345", - "id" : 10, - "email" : "john@email.com", - "username" : "theUser" -}; - if (Object.keys(examples).length > 0) { - resolve(examples[Object.keys(examples)[0]]); - } else { - resolve(); - } - }); -} - /** * Logs user into the system @@ -129,59 +29,10 @@ exports.getUserByName = function(username) { * password String The password for login in clear text (optional) * returns String **/ -exports.loginUser = function(username,password) { - return new Promise(function(resolve, reject) { - var examples = {}; - examples['application/json'] = ""; - if (Object.keys(examples).length > 0) { - resolve(examples[Object.keys(examples)[0]]); - } else { - resolve(); - } - }); -} - - -/** - * Logs out current logged in user session - * - * no response value expected for this operation - **/ -exports.logoutUser = function() { - return new Promise(function(resolve, reject) { - resolve(); - }); -} - - -/** - * Update user - * This can only be done by the logged in user. - * - * body User Update an existent user in the store (optional) - * username String name that need to be deleted - * no response value expected for this operation - **/ -exports.updateUser = function (body, username) { - return new Promise(function (resolve, reject) { - User.findOneAndUpdate({ username: username }, body, { new: true }) - .then((user) => resolve(user)) - .catch((error) => reject(error)); - }); -}; - - -/** - * Update user - * This can only be done by the logged in user. - * - * body User Update an existent user in the store (optional) - * username String name that need to be deleted - * no response value expected for this operation - **/ -exports.updateUser = function(body,username) { - return new Promise(function(resolve, reject) { - resolve(); - }); +exports.isAuthenticated = function (req, res, next) { + if (req.isAuthenticated()) { + return true; + } + return false; }