From c719cfc9e590a74001dfe4b920a7ed30dff71ed0 Mon Sep 17 00:00:00 2001 From: firdaous elhalafi Date: Mon, 23 Oct 2023 16:39:28 +0200 Subject: [PATCH 1/2] Creation d'un utilisateur --- api/openapi.yaml | 145 ++-------------------------------- controllers/User.js | 89 +++++++-------------- package-lock.json | 78 ++++++++++++++++--- package.json | 8 +- passeport-config.js | 35 +++++++++ service/UserService.js | 172 +++-------------------------------------- 6 files changed, 159 insertions(+), 368 deletions(-) create mode 100644 passeport-config.js diff --git a/api/openapi.yaml b/api/openapi.yaml index 65b0786..69cdcfa 100644 --- a/api/openapi.yaml +++ b/api/openapi.yaml @@ -486,33 +486,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: @@ -578,89 +551,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 store - 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: Order: @@ -754,42 +644,23 @@ components: User: type: object properties: - id: - type: integer - format: int64 - example: 10 username: type: string example: theUser - firstName: - type: string - example: John - lastName: - type: string - example: James - email: - type: string - example: john@email.com password: type: string example: "12345" - phone: - type: string - example: "12345" - userStatus: - type: integer - description: User Status - format: int32 - example: 1 + isAgent: + type: boolean + example: true + required: + - username + - password + - isAgent example: - firstName: John - lastName: James password: "12345" - userStatus: 1 - phone: "12345" - id: 10 - email: john@email.com username: theUser + isAgent: true xml: name: user Tag: diff --git a/controllers/User.js b/controllers/User.js index 121e17c..c8dc749 100644 --- a/controllers/User.js +++ b/controllers/User.js @@ -2,66 +2,35 @@ var utils = require('../utils/writer.js'); var User = require('../service/UserService'); - -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); - }); -}; - -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.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); - }); -}; +var passport = require('../passeport-config') + +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.loginUser = async function loginUser(req, res) { + passport.authenticate('local', (err, user, info) => { + console.log("-----", req.body); + if (err) { + throw new Error(err); + } + if (!user) { + throw new Error('Invalid username or password.'); + } + req.logIn(user, (err) => { + if (err) { + throw new Error(err); + } + return true; + }); + })(req, res); +} module.exports.logoutUser = function logoutUser (req, res, next) { User.logoutUser() diff --git a/package-lock.json b/package-lock.json index 8b5177e..464ee55 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,9 +13,13 @@ "dotenv": "^16.3.1", "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 +179,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 +213,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 +251,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 +274,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 +311,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 +321,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 +384,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 +410,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", @@ -868,6 +880,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 +925,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 +966,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 +989,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 +1072,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 +1097,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 +1109,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 +1118,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 +1130,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 +1206,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 +1275,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 +1476,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 +1504,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 +1512,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 +1534,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 +1632,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 +1686,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 +1723,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", @@ -1733,6 +1785,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 +1826,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 +1975,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 +2044,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 +2056,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 +2076,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" }, @@ -2065,7 +2123,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 +2199,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 d0d1e8c..b109465 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "main": "index.js", "scripts": { "prestart": "npm install", - "start": "nodemon index.js" + "start": "nodemon index.js openapi.yaml" }, "keywords": [ "swagger" @@ -17,8 +17,12 @@ "dotenv": "^16.3.1", "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 0000000..c511bb1 --- /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, 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 f697bcc..6952050 100644 --- a/service/UserService.js +++ b/service/UserService.js @@ -1,5 +1,6 @@ 'use strict'; +const User = require('../models/User'); /** * Create user @@ -8,127 +9,15 @@ * 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(); - } - }); -} - - -/** - * Create user - * This can only be done by the logged in user. - * - * 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(); - } - }); -} - - -/** - * 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" -}; - 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(); - }); -} +exports.createUser = async function(username, password, isAgent) { + const existingUser = await User.findOne({ username }); + if (existingUser) { + throw new Error('This user already exists.'); + } -/** - * 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" + await User.register(new User ({ username : username, isAgent : isAgent}), password); }; - if (Object.keys(examples).length > 0) { - resolve(examples[Object.keys(examples)[0]]); - } else { - resolve(); - } - }); -} - /** * Logs user into the system @@ -137,19 +26,13 @@ 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(); - } - }); +exports.isAuthenticated = function (req, res, next) { + if (req.isAuthenticated()) { + return true; + } + return false; } - /** * Logs out current logged in user session * @@ -160,34 +43,3 @@ exports.logoutUser = function() { 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) { - 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) { - resolve(); - }); -} - -- GitLab From 035dd28ace8f72ae1ab2a1cc7cbed9b214b7e706 Mon Sep 17 00:00:00 2001 From: firdaous elhalafi Date: Thu, 26 Oct 2023 15:51:28 +0200 Subject: [PATCH 2/2] Creation et verification de la presence de l'utilisateur dans la BD --- api/openapi.yaml | 4 +-- controllers/User.js | 74 +++++++++++++++++++++++------------------- index.js | 9 +++++ package-lock.json | 54 ++++++++++++++++++++++++++++++ package.json | 10 +++++- passeport-config.js | 2 +- service/UserService.js | 13 ++------ 7 files changed, 118 insertions(+), 48 deletions(-) diff --git a/api/openapi.yaml b/api/openapi.yaml index 69cdcfa..063f388 100644 --- a/api/openapi.yaml +++ b/api/openapi.yaml @@ -497,7 +497,7 @@ paths: - name: username in: query description: The user name for login - required: false + required: true style: form explode: true schema: @@ -505,7 +505,7 @@ paths: - name: password in: query description: The password for login in clear text - required: false + required: true style: form explode: true schema: diff --git a/controllers/User.js b/controllers/User.js index c8dc749..ff5962c 100644 --- a/controllers/User.js +++ b/controllers/User.js @@ -2,7 +2,10 @@ var utils = require('../utils/writer.js'); var User = require('../service/UserService'); -var passport = require('../passeport-config') +var passport = require('../passeport-config'); +var UserModel = require('../models/User'); + +// passport.use(UserModel.createStrategy()); module.exports.createUser = async function(req, res) { try { @@ -14,22 +17,28 @@ module.exports.createUser = async function(req, res) { } }; -module.exports.loginUser = async function loginUser(req, res) { - passport.authenticate('local', (err, user, info) => { - console.log("-----", req.body); - if (err) { - throw new Error(err); - } - if (!user) { - throw new Error('Invalid username or password.'); - } - req.logIn(user, (err) => { +module.exports.loginUser = async function loginUser(req, res, next) { + try { + passport.authenticate('local', (err, user, info) => { if (err) { - throw new Error(err); + return res.status(500).send(err); // Erreur interne du serveur } - return true; - }); - })(req, res); + 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) { @@ -42,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 baca121..e7216e0 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 464ee55..b9fa18e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,7 @@ "dependencies": { "connect": "^3.2.0", "dotenv": "^16.3.1", + "express-session": "^1.17.3", "js-yaml": "^3.3.0", "mongoose": "^7.6.3", "oas3-tools": "^2.2.3", @@ -722,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", @@ -1748,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", @@ -2120,6 +2163,17 @@ "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", diff --git a/package.json b/package.json index b109465..c977aa0 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,14 @@ "main": "index.js", "scripts": { "prestart": "npm install", - "start": "nodemon index.js openapi.yaml" + "start": "nodemon index.js" + }, + "nodemonConfig": { + "watch": [ + "api/openapi.yaml" + ], + "ext": "js,yaml", + "exec": "node index.js" }, "keywords": [ "swagger" @@ -15,6 +22,7 @@ "dependencies": { "connect": "^3.2.0", "dotenv": "^16.3.1", + "express-session": "^1.17.3", "js-yaml": "^3.3.0", "mongoose": "^7.6.3", "oas3-tools": "^2.2.3", diff --git a/passeport-config.js b/passeport-config.js index c511bb1..7db6a16 100644 --- a/passeport-config.js +++ b/passeport-config.js @@ -6,7 +6,7 @@ const User = require('./models/User'); passport.use(new LocalStrategy( { usernameField: 'username' }, function(username, password, done) { - User.authenticate()(username, password, function(err, user) { + User.authenticate()(username, password, async function(err, user) { if (err) { return done(err); } if (!user) { return done(null, false); diff --git a/service/UserService.js b/service/UserService.js index 6952050..94127af 100644 --- a/service/UserService.js +++ b/service/UserService.js @@ -1,7 +1,10 @@ 'use strict'; +const passport = require('../passeport-config'); const User = require('../models/User'); +passport.use(User.createStrategy()); + /** * Create user * This can only be done by the logged in user. @@ -33,13 +36,3 @@ exports.isAuthenticated = function (req, res, next) { return false; } -/** - * Logs out current logged in user session - * - * no response value expected for this operation - **/ -exports.logoutUser = function() { - return new Promise(function(resolve, reject) { - resolve(); - }); -} -- GitLab