From 17e5779355f5557ea8de20f4215bf58e5d64eb35 Mon Sep 17 00:00:00 2001 From: ItzTas Date: Wed, 21 Aug 2024 22:32:10 -0400 Subject: [PATCH 01/31] chore: biblioteca jwt --- package-lock.json | 130 +++++++++++++++++++++++++++++++++++++++++----- package.json | 2 + 2 files changed, 118 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index ef1eb3d..5c63410 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,9 +9,11 @@ "version": "1.0.0", "license": "ISC", "dependencies": { + "@types/jsonwebtoken": "^9.0.6", "cors": "^2.8.5", "express": "^4.19.2", "helmet": "^7.1.0", + "jsonwebtoken": "^9.0.2", "pg": "^8.12.0" }, "devDependencies": { @@ -2268,10 +2270,11 @@ "dev": true }, "node_modules/@semantic-release/github": { - "version": "10.1.3", - "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-10.1.3.tgz", - "integrity": "sha512-QVw7YT3J4VqyVjOnlRsFA3OCERAJHER4QbSPupbav3ER0fawrs2BAWbQFjsr24OAD4KTTKMZsVzF+GYFWCDtaQ==", + "version": "10.1.7", + "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-10.1.7.tgz", + "integrity": "sha512-QnhP4k1eqzYLz6a4kpWrUQeKJYXqHggveMykvUFbSquq07GF85BXvr/QLhpOD7bpDcmEfL8VnphRA7KT5i9lzQ==", "dev": true, + "license": "MIT", "dependencies": { "@octokit/core": "^6.0.0", "@octokit/plugin-paginate-rest": "^11.0.0", @@ -2852,6 +2855,15 @@ "@types/istanbul-lib-report": "*" } }, + "node_modules/@types/jsonwebtoken": { + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.6.tgz", + "integrity": "sha512-/5hndP5dCjloafCXns6SZyESp3Ldq7YjH3zwzwczYnjxIT0Fqzk5ROSYVGfFyczIue7IUEj8hkvLbPoLQ18vQw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/mime": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", @@ -2862,7 +2874,6 @@ "version": "22.1.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.1.0.tgz", "integrity": "sha512-AOmuRF0R2/5j1knA3c6G3HOk523Ga+l+ZXltX8SF1+5oqcXijjfTd8fY3XRZqSihEu9XhtQnKYLmkFaoxgsJHw==", - "dev": true, "dependencies": { "undici-types": "~6.13.0" } @@ -3335,6 +3346,12 @@ "node-int64": "^0.4.0" } }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "license": "BSD-3-Clause" + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -4034,6 +4051,15 @@ "readable-stream": "^2.0.2" } }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -6586,6 +6612,55 @@ "node": "*" } }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "license": "MIT", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsonwebtoken/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==", + "license": "MIT" + }, + "node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "license": "MIT", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, "node_modules/kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", @@ -6683,17 +6758,39 @@ "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", "dev": true }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "license": "MIT" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "license": "MIT" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "license": "MIT" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "license": "MIT" + }, "node_modules/lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" }, "node_modules/lodash.isstring": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", - "dev": true + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" }, "node_modules/lodash.kebabcase": { "version": "4.1.1", @@ -6713,6 +6810,12 @@ "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", "dev": true }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "license": "MIT" + }, "node_modules/lodash.snakecase": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", @@ -10560,10 +10663,11 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/semantic-release": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-24.0.0.tgz", - "integrity": "sha512-v46CRPw+9eI3ZuYGF2oAjqPqsfbnfFTwLBgQsv/lch4goD09ytwOTESMN4QIrx/wPLxUGey60/NMx+ANQtWRsA==", + "version": "24.1.0", + "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-24.1.0.tgz", + "integrity": "sha512-FwaE2hKDHQn9G6GA7xmqsc9WnsjaFD/ppLM5PUg56Do9oKSCf+vH6cPeb3hEBV/m06n8Sh9vbVqPjHu/1onzQw==", "dev": true, + "license": "MIT", "dependencies": { "@semantic-release/commit-analyzer": "^13.0.0-beta.1", "@semantic-release/error": "^4.0.0", @@ -10843,7 +10947,6 @@ "version": "7.6.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, "bin": { "semver": "bin/semver.js" }, @@ -11585,8 +11688,7 @@ "node_modules/undici-types": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.13.0.tgz", - "integrity": "sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==", - "dev": true + "integrity": "sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==" }, "node_modules/unicode-emoji-modifier-base": { "version": "1.0.0", diff --git a/package.json b/package.json index 7c8327b..0959fe4 100644 --- a/package.json +++ b/package.json @@ -20,9 +20,11 @@ "homepage": "https://github.com/TheDevOpsCorp/trainee-backend#readme", "description": "", "dependencies": { + "@types/jsonwebtoken": "^9.0.6", "cors": "^2.8.5", "express": "^4.19.2", "helmet": "^7.1.0", + "jsonwebtoken": "^9.0.2", "pg": "^8.12.0" }, "devDependencies": { From a5eaec226e9af6c2fbf9b3adc221d3b504f3f6e0 Mon Sep 17 00:00:00 2001 From: ItzTas Date: Wed, 21 Aug 2024 22:35:37 -0400 Subject: [PATCH 02/31] chore: decode and get token --- src/helpers/auth.js | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/helpers/auth.js diff --git a/src/helpers/auth.js b/src/helpers/auth.js new file mode 100644 index 0000000..7908b93 --- /dev/null +++ b/src/helpers/auth.js @@ -0,0 +1,38 @@ +/** + * @typedef {import('express').Request} Request + * @typedef {import('express').Response} Response + * + */ +import jwt from 'jsonwebtoken'; +const JWT_SECRET = `${process.env['JWT_SECRET']}`; + +/** + * + * + * @param {String} token + * @param {jwt.VerifyOptions | undefined} [options={}] + * @throws {JsonWebTokenError} + * @throws {TokenExpiredError} + */ +function decodeJWT(token, options = undefined) { + return jwt.verify(token, JWT_SECRET, options); +} + +/** + * + * @param {Request} req + * @throws {Error} + */ +function getToken(req) { + const bearerToken = req.header('Authorization'); + if (!bearerToken) { + throw new Error('sem token de autorização ou nome errado'); + } + const headerDiv = bearerToken.split(' '); + if (headerDiv[0] != 'Bearer') { + throw new Error('formato invalido'); + } + return headerDiv[1]; +} + +export { decodeJWT, getToken }; From 3f752550712e239bfcda0c1a4f720dedde1b1138 Mon Sep 17 00:00:00 2001 From: ItzTas Date: Wed, 21 Aug 2024 22:35:58 -0400 Subject: [PATCH 03/31] =?UTF-8?q?chore:=20middleware=20come=C3=A7ou=20a=20?= =?UTF-8?q?ser=20implementado?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/middlewares/auth_middleware.js | 51 ++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 src/middlewares/auth_middleware.js diff --git a/src/middlewares/auth_middleware.js b/src/middlewares/auth_middleware.js new file mode 100644 index 0000000..47be836 --- /dev/null +++ b/src/middlewares/auth_middleware.js @@ -0,0 +1,51 @@ +/** + * @typedef {import('express').Request} Request + * @typedef {import('express').Response} Response + * + */ + +import { JsonWebTokenError, TokenExpiredError } from 'jsonwebtoken'; +import { decodeJWT, getToken } from '../helpers/auth.js'; + +export default { + /** + * + * + * @param {Request} req + * @param {Response} res + * @param {Function} next + * @async + */ + async authenticatJWT(req, res, next) { + let token; + try { + token = getToken(req); + } catch (err) { + return res.status(401).json({ + error: 'invalido', + }); + } + + let decoded; + try { + //@ts-ignore + decoded = decodeJWT(token); + } catch (err) { + if (err instanceof TokenExpiredError) { + return res.status(401).json({ + error: 'expirado', + }); + } + if (err instanceof JsonWebTokenError) { + return res.status(401).json({ + error: 'invalido', + }); + } + return res.status(500).json({ + error: 'server error', + }); + } + + // req.user = user + }, +}; From 951ca7000c62836aee30b765e54653a9aec25b84 Mon Sep 17 00:00:00 2001 From: LucasEmanoel0 Date: Thu, 22 Aug 2024 00:27:46 -0300 Subject: [PATCH 04/31] chore: add types jest e supertest --- package-lock.json | 241 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 178 insertions(+), 63 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5c63410..bdc9ead 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,9 @@ "version": "1.0.0", "license": "ISC", "dependencies": { + "@types/jest": "^29.5.12", "@types/jsonwebtoken": "^9.0.6", + "@types/supertest": "^6.0.2", "cors": "^2.8.5", "express": "^4.19.2", "helmet": "^7.1.0", @@ -25,6 +27,7 @@ "@semantic-release/release-notes-generator": "^14.0.1", "@types/cors": "^2.8.17", "@types/express": "^4.17.21", + "@types/pg": "^8.11.6", "commitlint": "^19.3.0", "husky": "^9.1.4", "jest": "^29.7.0", @@ -49,7 +52,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", - "dev": true, "dependencies": { "@babel/highlight": "^7.24.7", "picocolors": "^1.0.0" @@ -244,7 +246,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -275,7 +276,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", - "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", @@ -290,7 +290,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -302,7 +301,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -316,7 +314,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "dependencies": { "color-name": "1.1.3" } @@ -324,14 +321,12 @@ "node_modules/@babel/highlight/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/@babel/highlight/node_modules/has-flag": { "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" } @@ -340,7 +335,6 @@ "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" }, @@ -1621,7 +1615,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "dev": true, "dependencies": { "jest-get-type": "^29.6.3" }, @@ -1733,7 +1726,6 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, "dependencies": { "@sinclair/typebox": "^0.27.8" }, @@ -1849,7 +1841,6 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", @@ -1866,7 +1857,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -2669,8 +2659,7 @@ "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" }, "node_modules/@sindresorhus/is": { "version": "4.6.0", @@ -2783,6 +2772,11 @@ "@types/node": "*" } }, + "node_modules/@types/cookiejar": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.5.tgz", + "integrity": "sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==" + }, "node_modules/@types/cors": { "version": "2.8.17", "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", @@ -2834,14 +2828,12 @@ "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" }, "node_modules/@types/istanbul-lib-report": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "dev": true, "dependencies": { "@types/istanbul-lib-coverage": "*" } @@ -2850,11 +2842,19 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dev": true, "dependencies": { "@types/istanbul-lib-report": "*" } }, + "node_modules/@types/jest": { + "version": "29.5.12", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", + "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, "node_modules/@types/jsonwebtoken": { "version": "9.0.6", "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.6.tgz", @@ -2864,6 +2864,11 @@ "@types/node": "*" } }, + "node_modules/@types/methods": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz", + "integrity": "sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==" + }, "node_modules/@types/mime": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", @@ -2884,6 +2889,74 @@ "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", "dev": true }, + "node_modules/@types/pg": { + "version": "8.11.6", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.11.6.tgz", + "integrity": "sha512-/2WmmBXHLsfRqzfHW7BNZ8SbYzE8OSk7i3WjFYvfgRHj7S1xj+16Je5fUKv3lVdVzk/zn9TXOqf+avFCFIE0yQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^4.0.1" + } + }, + "node_modules/@types/pg/node_modules/pg-types": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-4.0.2.tgz", + "integrity": "sha512-cRL3JpS3lKMGsKaWndugWQoLOCoP+Cic8oseVcbr0qhPzYD5DWXK+RZ9LY9wxRf7RQia4SCwQlXk0q6FCPrVng==", + "dev": true, + "dependencies": { + "pg-int8": "1.0.1", + "pg-numeric": "1.0.2", + "postgres-array": "~3.0.1", + "postgres-bytea": "~3.0.0", + "postgres-date": "~2.1.0", + "postgres-interval": "^3.0.0", + "postgres-range": "^1.1.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@types/pg/node_modules/postgres-array": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-3.0.2.tgz", + "integrity": "sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@types/pg/node_modules/postgres-bytea": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-3.0.0.tgz", + "integrity": "sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw==", + "dev": true, + "dependencies": { + "obuf": "~1.1.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@types/pg/node_modules/postgres-date": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-2.1.0.tgz", + "integrity": "sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@types/pg/node_modules/postgres-interval": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-3.0.0.tgz", + "integrity": "sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/@types/qs": { "version": "6.9.15", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", @@ -2926,14 +2999,32 @@ "node_modules/@types/stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==" + }, + "node_modules/@types/superagent": { + "version": "8.1.8", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.8.tgz", + "integrity": "sha512-nTqHJ2OTa7PFEpLahzSEEeFeqbMpmcN7OeayiOc7v+xk+/vyTKljRe+o4MPqSnPeRCMvtxuLG+5QqluUVQJOnA==", + "dependencies": { + "@types/cookiejar": "^2.1.5", + "@types/methods": "^1.1.4", + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "node_modules/@types/supertest": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-6.0.2.tgz", + "integrity": "sha512-137ypx2lk/wTQbW6An6safu9hXmajAifU/s7szAHLN/FeIm5w7yR0Wkl9fdJMRSHwOn4HLAI0DaB2TOORuhPDg==", + "dependencies": { + "@types/methods": "^1.1.4", + "@types/superagent": "^8.1.0" + } }, "node_modules/@types/yargs": { "version": "17.0.32", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", - "dev": true, "dependencies": { "@types/yargs-parser": "*" } @@ -2941,8 +3032,7 @@ "node_modules/@types/yargs-parser": { "version": "21.0.3", "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" }, "node_modules/accepts": { "version": "1.3.8", @@ -3048,7 +3138,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -3101,6 +3190,11 @@ "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", "dev": true }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, "node_modules/babel-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", @@ -3297,7 +3391,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, "dependencies": { "fill-range": "^7.1.1" }, @@ -3447,7 +3540,6 @@ "version": "3.9.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, "funding": [ { "type": "github", @@ -3597,7 +3689,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -3608,8 +3699,18 @@ "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } }, "node_modules/commitlint": { "version": "19.3.0", @@ -3983,6 +4084,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -4013,7 +4122,6 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -4317,7 +4425,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, "engines": { "node": ">=0.8.0" } @@ -4391,7 +4498,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "dev": true, "dependencies": { "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", @@ -4515,7 +4621,6 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -4585,6 +4690,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -4877,8 +4995,7 @@ "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "node_modules/handlebars": { "version": "4.7.8", @@ -4905,7 +5022,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -5365,7 +5481,6 @@ "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" } @@ -5838,7 +5953,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dev": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", @@ -5853,7 +5967,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -5930,7 +6043,6 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -5977,7 +6089,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "dev": true, "dependencies": { "chalk": "^4.0.0", "jest-diff": "^29.7.0", @@ -5992,7 +6103,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -6008,7 +6118,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", @@ -6028,7 +6137,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -6044,7 +6152,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, "engines": { "node": ">=8" } @@ -6340,7 +6447,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -6357,7 +6463,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -6518,8 +6623,7 @@ "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/js-yaml": { "version": "4.1.0", @@ -6960,7 +7064,6 @@ "version": "4.0.7", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", - "dev": true, "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -9723,6 +9826,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -10017,6 +10126,15 @@ "node": ">=4.0.0" } }, + "node_modules/pg-numeric": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pg-numeric/-/pg-numeric-1.0.2.tgz", + "integrity": "sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/pg-pool": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.2.tgz", @@ -10056,14 +10174,12 @@ "node_modules/picocolors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "dev": true + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" }, "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" }, @@ -10277,11 +10393,16 @@ "node": ">=0.10.0" } }, + "node_modules/postgres-range": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/postgres-range/-/postgres-range-1.1.4.tgz", + "integrity": "sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w==", + "dev": true + }, "node_modules/pretty-format": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -10295,7 +10416,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, "engines": { "node": ">=10" }, @@ -10451,8 +10571,7 @@ "node_modules/react-is": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" }, "node_modules/read-package-up": { "version": "11.0.0", @@ -11281,7 +11400,6 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, "dependencies": { "escape-string-regexp": "^2.0.0" }, @@ -11293,7 +11411,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, "engines": { "node": ">=8" } @@ -11417,7 +11534,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -11598,7 +11714,6 @@ "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" }, From 3b42b1978f2c59a7664f55f0dce3011f1007cd4e Mon Sep 17 00:00:00 2001 From: LucasEmanoel0 Date: Thu, 22 Aug 2024 00:28:46 -0300 Subject: [PATCH 05/31] =?UTF-8?q?chore:=20mudan=C3=A7a?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 0959fe4..5319d5b 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,6 @@ "homepage": "https://github.com/TheDevOpsCorp/trainee-backend#readme", "description": "", "dependencies": { - "@types/jsonwebtoken": "^9.0.6", "cors": "^2.8.5", "express": "^4.19.2", "helmet": "^7.1.0", @@ -28,6 +27,9 @@ "pg": "^8.12.0" }, "devDependencies": { + "@types/jest": "^29.5.12", + "@types/jsonwebtoken": "^9.0.6", + "@types/supertest": "^6.0.2", "@commitlint/config-angular": "^19.3.0", "@commitlint/config-conventional": "^19.2.2", "@semantic-release/changelog": "^6.0.3", @@ -36,6 +38,7 @@ "@semantic-release/release-notes-generator": "^14.0.1", "@types/cors": "^2.8.17", "@types/express": "^4.17.21", + "@types/pg": "^8.11.6", "commitlint": "^19.3.0", "husky": "^9.1.4", "jest": "^29.7.0", From 4278942e7360fca6b633ecb1062ad0c626e2e920 Mon Sep 17 00:00:00 2001 From: LucasEmanoel0 Date: Thu, 22 Aug 2024 00:29:08 -0300 Subject: [PATCH 06/31] chore: add conexao database --- src/database/database.js | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/database/database.js diff --git a/src/database/database.js b/src/database/database.js new file mode 100644 index 0000000..5a2228a --- /dev/null +++ b/src/database/database.js @@ -0,0 +1,11 @@ +import { Pool } from "pg"; +let pool = new Pool({ + database: 'postgres', + user: 'postgres', + password: 'postgres', + host:'localhost', + port: 5432, + + }) + +export default pool From 8f47fe1ee8b177d47eff651bf6b8c7d85a28988d Mon Sep 17 00:00:00 2001 From: LucasEmanoel0 Date: Thu, 22 Aug 2024 00:29:47 -0300 Subject: [PATCH 07/31] chore: add logica pegar id do database --- src/middlewares/auth_middleware.js | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/middlewares/auth_middleware.js b/src/middlewares/auth_middleware.js index 47be836..bb1dd9e 100644 --- a/src/middlewares/auth_middleware.js +++ b/src/middlewares/auth_middleware.js @@ -6,6 +6,7 @@ import { JsonWebTokenError, TokenExpiredError } from 'jsonwebtoken'; import { decodeJWT, getToken } from '../helpers/auth.js'; +import pool from '../database/database.js'; export default { /** @@ -16,6 +17,7 @@ export default { * @param {Function} next * @async */ + // @ts-ignore async authenticatJWT(req, res, next) { let token; try { @@ -47,5 +49,20 @@ export default { } // req.user = user + try { + // @ts-ignore + let id = decoded.sub + let user = await pool.query('SELECT *FROM users WHERE id = $1 ',[id]) + if(user.rows.length == 0){ + return res.status(404).json({message:"usuario nao encontrado"}) + } + // @ts-ignore + req.user = user + next() + + } catch (error) { + return res.status(500).json({message:"não foi possivel pegar o usuario"}) + + } }, }; From d55d377fe4ff56846b81fc2ccdba68fb54b077ee Mon Sep 17 00:00:00 2001 From: LucasEmanoel0 Date: Thu, 22 Aug 2024 00:31:02 -0300 Subject: [PATCH 08/31] =?UTF-8?q?chore:=20mudan=C3=A7a=20de=20espa=C3=A7o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/routes/routes.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/routes/routes.js b/src/routes/routes.js index a9ffe6c..0668e8c 100644 --- a/src/routes/routes.js +++ b/src/routes/routes.js @@ -3,5 +3,4 @@ import { Router } from "express"; const router = Router() - export default router \ No newline at end of file From 173c560af4d557d82ef1a009691de96657fc5fc3 Mon Sep 17 00:00:00 2001 From: LucasEmanoel0 Date: Thu, 22 Aug 2024 00:31:37 -0300 Subject: [PATCH 09/31] =?UTF-8?q?chore:=20add=20logica=20test=20autentica?= =?UTF-8?q?=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/auth.test.js | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 test/auth.test.js diff --git a/test/auth.test.js b/test/auth.test.js new file mode 100644 index 0000000..eefcecc --- /dev/null +++ b/test/auth.test.js @@ -0,0 +1,22 @@ +import supertest from "supertest"; +import test_app from "./test.router.js"; + + +describe('AUTH TEST',()=>{ + const path = '/test/middlware/autenticaçao' + + it('401: token nao veio na autenticacao',()=>{ + supertest(test_app).post(path).send().expect((res)=>{ + const {status,body} = res + try { + expect(status).toBe(401) + expect(body).toHaveProperty("error","invalido") + + } catch (error) { + throw new Error(`${status} + ${body} + ${error}`) + } + }) + }) +}) \ No newline at end of file From 4c761a8f02998935099eb6d86e971327e64acf8e Mon Sep 17 00:00:00 2001 From: LucasEmanoel0 Date: Thu, 22 Aug 2024 00:31:59 -0300 Subject: [PATCH 10/31] =?UTF-8?q?chore:=20add=20rota=20test=20autentica?= =?UTF-8?q?=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/test.router.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 test/test.router.js diff --git a/test/test.router.js b/test/test.router.js new file mode 100644 index 0000000..de49739 --- /dev/null +++ b/test/test.router.js @@ -0,0 +1,13 @@ +import express from 'express' +import auth_middleware from '../src/middlewares/auth_middleware.js' + +let test_app = express() +test_app.use(express.json()) + +test_app.post('/test/middlware/autenticaçao', auth_middleware.authenticatJWT,(req,res)=>{ + // @ts-ignore + res.json(req.user) +}) + +export default test_app + From ab1949f162d0f54895ea499e2806164df06f26ee Mon Sep 17 00:00:00 2001 From: LucasEmanoel0 Date: Thu, 22 Aug 2024 00:33:44 -0300 Subject: [PATCH 11/31] chore: add supertest --- package-lock.json | 216 +++++++++++++++++++++++++++++++++++++++++----- package.json | 9 +- 2 files changed, 201 insertions(+), 24 deletions(-) diff --git a/package-lock.json b/package-lock.json index bdc9ead..d22a871 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,14 +9,12 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "@types/jest": "^29.5.12", - "@types/jsonwebtoken": "^9.0.6", - "@types/supertest": "^6.0.2", "cors": "^2.8.5", "express": "^4.19.2", "helmet": "^7.1.0", "jsonwebtoken": "^9.0.2", - "pg": "^8.12.0" + "pg": "^8.12.0", + "supertest": "^7.0.0" }, "devDependencies": { "@commitlint/config-angular": "^19.3.0", @@ -27,7 +25,10 @@ "@semantic-release/release-notes-generator": "^14.0.1", "@types/cors": "^2.8.17", "@types/express": "^4.17.21", + "@types/jest": "^29.5.12", + "@types/jsonwebtoken": "^9.0.6", "@types/pg": "^8.11.6", + "@types/supertest": "^6.0.2", "commitlint": "^19.3.0", "husky": "^9.1.4", "jest": "^29.7.0", @@ -52,6 +53,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "dev": true, "dependencies": { "@babel/highlight": "^7.24.7", "picocolors": "^1.0.0" @@ -246,6 +248,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "dev": true, "engines": { "node": ">=6.9.0" } @@ -276,6 +279,7 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", @@ -290,6 +294,7 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -301,6 +306,7 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -314,6 +320,7 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "dependencies": { "color-name": "1.1.3" } @@ -321,12 +328,14 @@ "node_modules/@babel/highlight/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true }, "node_modules/@babel/highlight/node_modules/has-flag": { "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" } @@ -335,6 +344,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" }, @@ -1615,6 +1625,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, "dependencies": { "jest-get-type": "^29.6.3" }, @@ -1726,6 +1737,7 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, "dependencies": { "@sinclair/typebox": "^0.27.8" }, @@ -1841,6 +1853,7 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", @@ -1857,6 +1870,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -2659,7 +2673,8 @@ "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true }, "node_modules/@sindresorhus/is": { "version": "4.6.0", @@ -2775,7 +2790,8 @@ "node_modules/@types/cookiejar": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.5.tgz", - "integrity": "sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==" + "integrity": "sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==", + "dev": true }, "node_modules/@types/cors": { "version": "2.8.17", @@ -2828,12 +2844,14 @@ "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true }, "node_modules/@types/istanbul-lib-report": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, "dependencies": { "@types/istanbul-lib-coverage": "*" } @@ -2842,6 +2860,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, "dependencies": { "@types/istanbul-lib-report": "*" } @@ -2850,6 +2869,7 @@ "version": "29.5.12", "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", + "dev": true, "dependencies": { "expect": "^29.0.0", "pretty-format": "^29.0.0" @@ -2859,6 +2879,7 @@ "version": "9.0.6", "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.6.tgz", "integrity": "sha512-/5hndP5dCjloafCXns6SZyESp3Ldq7YjH3zwzwczYnjxIT0Fqzk5ROSYVGfFyczIue7IUEj8hkvLbPoLQ18vQw==", + "dev": true, "license": "MIT", "dependencies": { "@types/node": "*" @@ -2867,7 +2888,8 @@ "node_modules/@types/methods": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz", - "integrity": "sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==" + "integrity": "sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==", + "dev": true }, "node_modules/@types/mime": { "version": "1.3.5", @@ -2879,6 +2901,7 @@ "version": "22.1.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.1.0.tgz", "integrity": "sha512-AOmuRF0R2/5j1knA3c6G3HOk523Ga+l+ZXltX8SF1+5oqcXijjfTd8fY3XRZqSihEu9XhtQnKYLmkFaoxgsJHw==", + "dev": true, "dependencies": { "undici-types": "~6.13.0" } @@ -2999,12 +3022,14 @@ "node_modules/@types/stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==" + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true }, "node_modules/@types/superagent": { "version": "8.1.8", "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.8.tgz", "integrity": "sha512-nTqHJ2OTa7PFEpLahzSEEeFeqbMpmcN7OeayiOc7v+xk+/vyTKljRe+o4MPqSnPeRCMvtxuLG+5QqluUVQJOnA==", + "dev": true, "dependencies": { "@types/cookiejar": "^2.1.5", "@types/methods": "^1.1.4", @@ -3016,6 +3041,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-6.0.2.tgz", "integrity": "sha512-137ypx2lk/wTQbW6An6safu9hXmajAifU/s7szAHLN/FeIm5w7yR0Wkl9fdJMRSHwOn4HLAI0DaB2TOORuhPDg==", + "dev": true, "dependencies": { "@types/methods": "^1.1.4", "@types/superagent": "^8.1.0" @@ -3025,6 +3051,7 @@ "version": "17.0.32", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "dev": true, "dependencies": { "@types/yargs-parser": "*" } @@ -3032,7 +3059,8 @@ "node_modules/@types/yargs-parser": { "version": "21.0.3", "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true }, "node_modules/accepts": { "version": "1.3.8", @@ -3138,6 +3166,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -3190,6 +3219,11 @@ "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", "dev": true }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -3391,6 +3425,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, "dependencies": { "fill-range": "^7.1.1" }, @@ -3540,6 +3575,7 @@ "version": "3.9.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, "funding": [ { "type": "github", @@ -3689,6 +3725,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -3699,7 +3736,8 @@ "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/combined-stream": { "version": "1.0.8", @@ -3738,6 +3776,14 @@ "dot-prop": "^5.1.0" } }, + "node_modules/component-emitter": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -3877,6 +3923,11 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, + "node_modules/cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==" + }, "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", @@ -4118,10 +4169,20 @@ "node": ">=8" } }, + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, "node_modules/diff-sequences": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -4425,6 +4486,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, "engines": { "node": ">=0.8.0" } @@ -4498,6 +4560,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, "dependencies": { "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", @@ -4578,6 +4641,11 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, "node_modules/fast-uri": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", @@ -4621,6 +4689,7 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -4703,6 +4772,19 @@ "node": ">= 6" } }, + "node_modules/formidable": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.1.tgz", + "integrity": "sha512-WJWKelbRHN41m5dumb0/k8TeAx7Id/y3a+Z7QfhxP/htI9Js5zYaEDtG8uMgG0vM0lOlqnmjE99/kfpOYi/0Og==", + "dependencies": { + "dezalgo": "^1.0.4", + "hexoid": "^1.0.0", + "once": "^1.4.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -4995,7 +5077,8 @@ "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true }, "node_modules/handlebars": { "version": "4.7.8", @@ -5022,6 +5105,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -5078,6 +5162,14 @@ "node": ">=16.0.0" } }, + "node_modules/hexoid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", + "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", + "engines": { + "node": ">=8" + } + }, "node_modules/highlight.js": { "version": "10.7.3", "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", @@ -5481,6 +5573,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" } @@ -5953,6 +6046,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", @@ -5967,6 +6061,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -6043,6 +6138,7 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -6089,6 +6185,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, "dependencies": { "chalk": "^4.0.0", "jest-diff": "^29.7.0", @@ -6103,6 +6200,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -6118,6 +6216,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", @@ -6137,6 +6236,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -6152,6 +6252,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, "engines": { "node": ">=8" } @@ -6447,6 +6548,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -6463,6 +6565,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -6623,7 +6726,8 @@ "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true }, "node_modules/js-yaml": { "version": "4.1.0", @@ -7064,6 +7168,7 @@ "version": "4.0.7", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "dev": true, "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -9847,7 +9952,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, "dependencies": { "wrappy": "1" } @@ -10174,12 +10278,14 @@ "node_modules/picocolors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "dev": true }, "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" }, @@ -10403,6 +10509,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -10416,6 +10523,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, "engines": { "node": ">=10" }, @@ -10571,7 +10679,8 @@ "node_modules/react-is": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true }, "node_modules/read-package-up": { "version": "11.0.0", @@ -11400,6 +11509,7 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, "dependencies": { "escape-string-regexp": "^2.0.0" }, @@ -11411,6 +11521,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, "engines": { "node": ">=8" } @@ -11530,10 +11641,74 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/superagent": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-9.0.2.tgz", + "integrity": "sha512-xuW7dzkUpcJq7QnhOsnNUgtYp3xRwpt2F7abdRYIpCsAt0hhUqia0EdxyXZQQpNmGtsCzYHryaKSV3q3GJnq7w==", + "dependencies": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.4", + "debug": "^4.3.4", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.0", + "formidable": "^3.5.1", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.11.0" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/superagent/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/superagent/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/superagent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/supertest": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-7.0.0.tgz", + "integrity": "sha512-qlsr7fIC0lSddmA3tzojvzubYxvlGtzumcdHgPwbFWMISQwL22MhM2Y3LNt+6w9Yyx7559VW5ab70dgphm8qQA==", + "dependencies": { + "methods": "^1.1.2", + "superagent": "^9.0.1" + }, + "engines": { + "node": ">=14.18.0" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -11714,6 +11889,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" }, @@ -11803,7 +11979,8 @@ "node_modules/undici-types": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.13.0.tgz", - "integrity": "sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==" + "integrity": "sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==", + "dev": true }, "node_modules/unicode-emoji-modifier-base": { "version": "1.0.0", @@ -11999,8 +12176,7 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/write-file-atomic": { "version": "4.0.2", diff --git a/package.json b/package.json index 5319d5b..4f26eb7 100644 --- a/package.json +++ b/package.json @@ -24,12 +24,10 @@ "express": "^4.19.2", "helmet": "^7.1.0", "jsonwebtoken": "^9.0.2", - "pg": "^8.12.0" + "pg": "^8.12.0", + "supertest": "^7.0.0" }, "devDependencies": { - "@types/jest": "^29.5.12", - "@types/jsonwebtoken": "^9.0.6", - "@types/supertest": "^6.0.2", "@commitlint/config-angular": "^19.3.0", "@commitlint/config-conventional": "^19.2.2", "@semantic-release/changelog": "^6.0.3", @@ -38,7 +36,10 @@ "@semantic-release/release-notes-generator": "^14.0.1", "@types/cors": "^2.8.17", "@types/express": "^4.17.21", + "@types/jest": "^29.5.12", + "@types/jsonwebtoken": "^9.0.6", "@types/pg": "^8.11.6", + "@types/supertest": "^6.0.2", "commitlint": "^19.3.0", "husky": "^9.1.4", "jest": "^29.7.0", From 2e073373f1d0c94caf64e547a59a4214ec997c76 Mon Sep 17 00:00:00 2001 From: LucasEmanoel0 Date: Thu, 22 Aug 2024 00:35:48 -0300 Subject: [PATCH 12/31] chore: add pg --- src/database/database.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/database/database.js b/src/database/database.js index 5a2228a..29b5692 100644 --- a/src/database/database.js +++ b/src/database/database.js @@ -1,4 +1,6 @@ -import { Pool } from "pg"; +import pg from 'pg' +const {Pool} = pg + let pool = new Pool({ database: 'postgres', user: 'postgres', From 050fb566466bee9269e212c9760f69e99c5cc3f1 Mon Sep 17 00:00:00 2001 From: ItzTas Date: Thu, 22 Aug 2024 00:01:51 -0400 Subject: [PATCH 13/31] =?UTF-8?q?chore:=20melhor=20valida=C3=A7=C3=A3o=20d?= =?UTF-8?q?e=20erro?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/helpers/auth.js | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/src/helpers/auth.js b/src/helpers/auth.js index 7908b93..ca6cc98 100644 --- a/src/helpers/auth.js +++ b/src/helpers/auth.js @@ -6,6 +6,10 @@ import jwt from 'jsonwebtoken'; const JWT_SECRET = `${process.env['JWT_SECRET']}`; +class TokenExpiredError extends Error {} + +class JsonWebTokenError extends Error {} + /** * * @@ -15,7 +19,17 @@ const JWT_SECRET = `${process.env['JWT_SECRET']}`; * @throws {TokenExpiredError} */ function decodeJWT(token, options = undefined) { + try { return jwt.verify(token, JWT_SECRET, options); + } catch (/** @type {any}*/ err) { + if (err?.name === 'TokenExpiredError') { + throw new TokenExpiredError('token expirado'); + } + if (err?.name === 'JsonWebTokenError') { + throw new JsonWebTokenError('token invalido'); + } + throw err; + } } /** @@ -24,15 +38,15 @@ function decodeJWT(token, options = undefined) { * @throws {Error} */ function getToken(req) { - const bearerToken = req.header('Authorization'); - if (!bearerToken) { - throw new Error('sem token de autorização ou nome errado'); - } - const headerDiv = bearerToken.split(' '); - if (headerDiv[0] != 'Bearer') { - throw new Error('formato invalido'); - } - return headerDiv[1]; + const bearerToken = req.header('Authorization'); + if (!bearerToken) { + throw new Error('sem token de autorização ou nome errado'); + } + const headerDiv = bearerToken.split(' '); + if (headerDiv[0] != 'Bearer') { + throw new Error('formato invalido'); + } + return headerDiv[1]; } -export { decodeJWT, getToken }; +export { decodeJWT, getToken, TokenExpiredError, JsonWebTokenError }; From a29751b5ca50848f2c26cf998f0ef72258269135 Mon Sep 17 00:00:00 2001 From: ItzTas Date: Thu, 22 Aug 2024 00:02:42 -0400 Subject: [PATCH 14/31] =?UTF-8?q?chore:=20formata=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/middlewares/auth_middleware.js | 116 +++++++++++++++-------------- 1 file changed, 60 insertions(+), 56 deletions(-) diff --git a/src/middlewares/auth_middleware.js b/src/middlewares/auth_middleware.js index bb1dd9e..4a6275e 100644 --- a/src/middlewares/auth_middleware.js +++ b/src/middlewares/auth_middleware.js @@ -4,65 +4,69 @@ * */ -import { JsonWebTokenError, TokenExpiredError } from 'jsonwebtoken'; -import { decodeJWT, getToken } from '../helpers/auth.js'; +import { + decodeJWT, + getToken, + JsonWebTokenError, + TokenExpiredError, +} from '../helpers/auth.js'; import pool from '../database/database.js'; export default { - /** - * - * - * @param {Request} req - * @param {Response} res - * @param {Function} next - * @async - */ - // @ts-ignore - async authenticatJWT(req, res, next) { - let token; - try { - token = getToken(req); - } catch (err) { - return res.status(401).json({ - error: 'invalido', - }); - } + /** + * + * + * @param {Request} req + * @param {Response} res + * @param {Function} next + * @async + */ + // @ts-ignore + async authenticatJWT(req, res, next) { + let token; + try { + token = getToken(req); + } catch (err) { + return res.status(401).json({ + error: 'invalido', + }); + } - let decoded; - try { - //@ts-ignore - decoded = decodeJWT(token); - } catch (err) { - if (err instanceof TokenExpiredError) { - return res.status(401).json({ - error: 'expirado', - }); - } - if (err instanceof JsonWebTokenError) { - return res.status(401).json({ - error: 'invalido', - }); - } - return res.status(500).json({ - error: 'server error', - }); - } + let decoded; + try { + //@ts-ignore + decoded = decodeJWT(token); + } catch (err) { + if (err instanceof TokenExpiredError) { + return res.status(401).json({ + error: 'expirado', + }); + } + if (err instanceof JsonWebTokenError) { + return res.status(401).json({ + error: 'invalido', + }); + } + return res.status(500).json({ + error: 'server error', + }); + } - // req.user = user - try { - // @ts-ignore - let id = decoded.sub - let user = await pool.query('SELECT *FROM users WHERE id = $1 ',[id]) - if(user.rows.length == 0){ - return res.status(404).json({message:"usuario nao encontrado"}) - } - // @ts-ignore - req.user = user - next() - - } catch (error) { - return res.status(500).json({message:"não foi possivel pegar o usuario"}) - - } - }, + // req.user = user + try { + // @ts-ignore + let id = decoded.sub; + let user = await pool.query('SELECT *FROM users WHERE id = $1 ', [id]); + if (user.rows.length == 0) { + return res.status(404).json({ message: 'usuario nao encontrado' }); + } + // @ts-ignore + req.user = user; + next(); + } catch (error) { + return res + .status(500) + .json({ message: 'não foi possivel pegar o usuario' }); + } + }, }; From e0970b646674248a303bd637f63ca25375187d32 Mon Sep 17 00:00:00 2001 From: ItzTas Date: Thu, 22 Aug 2024 19:37:21 -0400 Subject: [PATCH 15/31] chore: moment adicionado --- jest.setup.js | 5 +++++ package-lock.json | 10 ++++++++++ package.json | 1 + src/helpers/general_helpers.js | 11 +++++++++++ 4 files changed, 27 insertions(+) create mode 100644 jest.setup.js create mode 100644 src/helpers/general_helpers.js diff --git a/jest.setup.js b/jest.setup.js new file mode 100644 index 0000000..c0663ce --- /dev/null +++ b/jest.setup.js @@ -0,0 +1,5 @@ +import { configDotenv } from 'dotenv'; + +export default () => { + configDotenv(); +}; diff --git a/package-lock.json b/package-lock.json index d22a871..01a6d3e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "express": "^4.19.2", "helmet": "^7.1.0", "jsonwebtoken": "^9.0.2", + "moment": "^2.30.1", "pg": "^8.12.0", "supertest": "^7.0.0" }, @@ -7237,6 +7238,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", diff --git a/package.json b/package.json index 4f26eb7..2f20309 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "express": "^4.19.2", "helmet": "^7.1.0", "jsonwebtoken": "^9.0.2", + "moment": "^2.30.1", "pg": "^8.12.0", "supertest": "^7.0.0" }, diff --git a/src/helpers/general_helpers.js b/src/helpers/general_helpers.js new file mode 100644 index 0000000..e27e83e --- /dev/null +++ b/src/helpers/general_helpers.js @@ -0,0 +1,11 @@ +/** + * + * + * @param {Object} obj - + * @returns {String} + */ +function formatObject(obj) { + return JSON.stringify(obj, null, 2); +} + +export { formatObject }; From 3612fea5938cc00088331e87b4f123fa50d512c0 Mon Sep 17 00:00:00 2001 From: ItzTas Date: Thu, 22 Aug 2024 19:37:50 -0400 Subject: [PATCH 16/31] =?UTF-8?q?chore:=20come=C3=A7ando=20a=20implementar?= =?UTF-8?q?=20segundo=20teste?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/auth.test.js | 47 ++++++++++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/test/auth.test.js b/test/auth.test.js index eefcecc..a85b7ba 100644 --- a/test/auth.test.js +++ b/test/auth.test.js @@ -1,22 +1,31 @@ -import supertest from "supertest"; -import test_app from "./test.router.js"; +import supertest from 'supertest'; +import test_app from './test.router.js'; +import { signJWT } from '../src/helpers/auth.js'; +import { formatObject } from '../src/helpers/general_helpers.js'; +describe('AUTH TEST', () => { + const path = '/test/middlware/autenticacao'; -describe('AUTH TEST',()=>{ - const path = '/test/middlware/autenticaçao' + it('401: token nao veio na autenticacao', async () => { + await supertest(test_app) + .post(path) + .send() + .expect((res) => { + const { status, body } = res; + try { + expect(status).toBe(401); + expect(body).toHaveProperty('error', 'invalido'); + } catch (error) { + throw new Error(` + \n${status}\n + \n${formatObject(body)}\n + \n${error}\n + `); + } + }); + }); - it('401: token nao veio na autenticacao',()=>{ - supertest(test_app).post(path).send().expect((res)=>{ - const {status,body} = res - try { - expect(status).toBe(401) - expect(body).toHaveProperty("error","invalido") - - } catch (error) { - throw new Error(`${status} - ${body} - ${error}`) - } - }) - }) -}) \ No newline at end of file + it('401: token deve expirar quando passar o tempo', async () => { + const token = signJWT({ id: 1 }, { expiresIn: '1ms' }); + }); +}); From 3ec67b0da76240cbb0e81b3f4ecc6450b9d899b6 Mon Sep 17 00:00:00 2001 From: ItzTas Date: Thu, 22 Aug 2024 19:38:26 -0400 Subject: [PATCH 17/31] =?UTF-8?q?chore:=20melhor=20valida=C3=A7=C3=A3o=20d?= =?UTF-8?q?e=20token=20vazio?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/helpers/auth.js | 59 +++++++++++++++++++----------- src/middlewares/auth_middleware.js | 2 +- test/test.router.js | 27 +++++++++----- 3 files changed, 56 insertions(+), 32 deletions(-) diff --git a/src/helpers/auth.js b/src/helpers/auth.js index ca6cc98..9695b0f 100644 --- a/src/helpers/auth.js +++ b/src/helpers/auth.js @@ -4,11 +4,14 @@ * */ import jwt from 'jsonwebtoken'; +import moment from 'moment'; const JWT_SECRET = `${process.env['JWT_SECRET']}`; -class TokenExpiredError extends Error {} +const defaultExpirationDate = '1hr'; -class JsonWebTokenError extends Error {} +class TokenExpiredError extends Error { } + +class JsonWebTokenError extends Error { } /** * @@ -19,17 +22,17 @@ class JsonWebTokenError extends Error {} * @throws {TokenExpiredError} */ function decodeJWT(token, options = undefined) { - try { - return jwt.verify(token, JWT_SECRET, options); - } catch (/** @type {any}*/ err) { - if (err?.name === 'TokenExpiredError') { - throw new TokenExpiredError('token expirado'); - } - if (err?.name === 'JsonWebTokenError') { - throw new JsonWebTokenError('token invalido'); + try { + return jwt.verify(token, JWT_SECRET, options); + } catch (/** @type {any}*/ err) { + if (err?.name === 'TokenExpiredError') { + throw new TokenExpiredError('token expirado'); + } + if (err?.name === 'JsonWebTokenError') { + throw new JsonWebTokenError('token invalido'); + } + throw err; } - throw err; - } } /** @@ -38,15 +41,27 @@ function decodeJWT(token, options = undefined) { * @throws {Error} */ function getToken(req) { - const bearerToken = req.header('Authorization'); - if (!bearerToken) { - throw new Error('sem token de autorização ou nome errado'); - } - const headerDiv = bearerToken.split(' '); - if (headerDiv[0] != 'Bearer') { - throw new Error('formato invalido'); - } - return headerDiv[1]; + const bearerToken = req.header('Authorization'); + if (!bearerToken) { + throw new Error('sem token de autorização ou nome errado'); + } + const headerDiv = bearerToken.split(' '); + if (headerDiv[0] != 'Bearer' || headerDiv.length === 0) { + throw new Error('formato invalido'); + } + return headerDiv[1]; +} +/** + * + * @param {Object.} payload + * @param {jwt.SignOptions} [options={ expiresIn: defaultTokenExpiration }] + * @returns {String} + */ +function signJWT(payload, options = {}) { + options.expiresIn = options.expiresIn || defaultExpirationDate; + options.subject = `${payload.id}`; + payload.iat = moment().unix(); + return jwt.sign(payload, JWT_SECRET, options); } -export { decodeJWT, getToken, TokenExpiredError, JsonWebTokenError }; +export { decodeJWT, getToken, TokenExpiredError, JsonWebTokenError, signJWT }; diff --git a/src/middlewares/auth_middleware.js b/src/middlewares/auth_middleware.js index 4a6275e..3acb132 100644 --- a/src/middlewares/auth_middleware.js +++ b/src/middlewares/auth_middleware.js @@ -22,7 +22,7 @@ export default { * @async */ // @ts-ignore - async authenticatJWT(req, res, next) { + async authenticateJWT(req, res, next) { let token; try { token = getToken(req); diff --git a/test/test.router.js b/test/test.router.js index de49739..c26a3bf 100644 --- a/test/test.router.js +++ b/test/test.router.js @@ -1,13 +1,22 @@ -import express from 'express' -import auth_middleware from '../src/middlewares/auth_middleware.js' +import express from 'express'; +import auth_middleware from '../src/middlewares/auth_middleware.js'; -let test_app = express() -test_app.use(express.json()) +let test_app = express(); +test_app.use(express.json()); -test_app.post('/test/middlware/autenticaçao', auth_middleware.authenticatJWT,(req,res)=>{ - // @ts-ignore - res.json(req.user) -}) +test_app.post( + '/test/middlware/autenticacao', + auth_middleware.authenticateJWT, + (req, res) => { + // @ts-ignore + res.json(req.user); + } +); -export default test_app +const port = 3000; +test_app.listen(port, () => { + console.log(`test app escutando na porta: ${port}`); +}); + +export default test_app; From 46ca1114dd4855e87ed6802bd8e0d626b544da94 Mon Sep 17 00:00:00 2001 From: LucasEmanoel0 Date: Thu, 22 Aug 2024 21:00:54 -0300 Subject: [PATCH 18/31] =?UTF-8?q?chore:=20mudan=C3=A7a=20de=20message=20pa?= =?UTF-8?q?ra=20error?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/middlewares/auth_middleware.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/middlewares/auth_middleware.js b/src/middlewares/auth_middleware.js index 3acb132..8fb9f31 100644 --- a/src/middlewares/auth_middleware.js +++ b/src/middlewares/auth_middleware.js @@ -58,7 +58,7 @@ export default { let id = decoded.sub; let user = await pool.query('SELECT *FROM users WHERE id = $1 ', [id]); if (user.rows.length == 0) { - return res.status(404).json({ message: 'usuario nao encontrado' }); + return res.status(404).json({ error: 'usuario nao encontrado' }); } // @ts-ignore req.user = user; From c53ada3875f287965dd570d51b94c769124bb168 Mon Sep 17 00:00:00 2001 From: LucasEmanoel0 Date: Thu, 22 Aug 2024 21:01:27 -0300 Subject: [PATCH 19/31] =?UTF-8?q?chore:=20add=20test=20autentica=C3=A7?= =?UTF-8?q?=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/auth.test.js | 59 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) diff --git a/test/auth.test.js b/test/auth.test.js index a85b7ba..a25c099 100644 --- a/test/auth.test.js +++ b/test/auth.test.js @@ -26,6 +26,63 @@ describe('AUTH TEST', () => { }); it('401: token deve expirar quando passar o tempo', async () => { - const token = signJWT({ id: 1 }, { expiresIn: '1ms' }); + const token = signJWT({ id: 1 }, { expiresIn: '1ms' }); + await supertest(test_app).post(path).set("Authorization",`Bearer ${token}`).expect((res)=>{ + const {status,body} = res + try { + expect(status).toBe(401); + expect(body).toHaveProperty('error', 'expirado'); + } catch (error) { + throw new Error(` + \n${status}\n + \n${formatObject(body)}\n + \n${error}\n + `); + + } + }) + + + }); + + it('401: token deve ser invalido', async () => { + await supertest(test_app).post(path).set("Authorization",`Bearer lalaal`).expect((res)=>{ + const {status,body} = res + try { + expect(status).toBe(401); + expect(body).toHaveProperty('error', 'invalido'); + } catch (error) { + throw new Error(` + \n${status}\n + \n${formatObject(body)}\n + \n${error}\n + `); + + } + }) + + + + }); + it('404: Usuario nao encontrado', async () => { + const token = signJWT({ id: 8 }); + await supertest(test_app).post(path).set("Authorization",`Bearer ${token}`).expect((res)=>{ + const {status,body} = res + try { + expect(status).toBe(404); + expect(body).toHaveProperty('error', 'usuario nao encontrado'); + } catch (error) { + throw new Error(` + \n${status}\n + \n${formatObject(body)}\n + \n${error}\n + `); + + } + }) + + + +}); }); From 6b987148a399c742d80c5b7a9ec57c3f70f63223 Mon Sep 17 00:00:00 2001 From: ItzTas Date: Thu, 22 Aug 2024 20:07:57 -0400 Subject: [PATCH 20/31] =?UTF-8?q?chore:=20informa=C3=A7=C3=A3o=20do=20erro?= =?UTF-8?q?=20no=20body=20de=20resposta?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/middlewares/auth_middleware.js | 116 ++++++++++++++--------------- 1 file changed, 58 insertions(+), 58 deletions(-) diff --git a/src/middlewares/auth_middleware.js b/src/middlewares/auth_middleware.js index 8fb9f31..10d91a2 100644 --- a/src/middlewares/auth_middleware.js +++ b/src/middlewares/auth_middleware.js @@ -5,68 +5,68 @@ */ import { - decodeJWT, - getToken, - JsonWebTokenError, - TokenExpiredError, + decodeJWT, + getToken, + JsonWebTokenError, + TokenExpiredError, } from '../helpers/auth.js'; import pool from '../database/database.js'; export default { - /** - * - * - * @param {Request} req - * @param {Response} res - * @param {Function} next - * @async - */ - // @ts-ignore - async authenticateJWT(req, res, next) { - let token; - try { - token = getToken(req); - } catch (err) { - return res.status(401).json({ - error: 'invalido', - }); - } + /** + * + * + * @param {Request} req + * @param {Response} res + * @param {Function} next + * @async + */ + // @ts-ignore + async authenticateJWT(req, res, next) { + let token; + try { + token = getToken(req); + } catch (err) { + return res.status(401).json({ + error: 'invalido', + }); + } - let decoded; - try { - //@ts-ignore - decoded = decodeJWT(token); - } catch (err) { - if (err instanceof TokenExpiredError) { - return res.status(401).json({ - error: 'expirado', - }); - } - if (err instanceof JsonWebTokenError) { - return res.status(401).json({ - error: 'invalido', - }); - } - return res.status(500).json({ - error: 'server error', - }); - } + let decoded; + try { + //@ts-ignore + decoded = decodeJWT(token); + } catch (err) { + if (err instanceof TokenExpiredError) { + return res.status(401).json({ + error: 'expirado', + }); + } + if (err instanceof JsonWebTokenError) { + return res.status(401).json({ + error: 'invalido', + }); + } + return res.status(500).json({ + error: 'server error', + }); + } - // req.user = user - try { - // @ts-ignore - let id = decoded.sub; - let user = await pool.query('SELECT *FROM users WHERE id = $1 ', [id]); - if (user.rows.length == 0) { - return res.status(404).json({ error: 'usuario nao encontrado' }); - } - // @ts-ignore - req.user = user; - next(); - } catch (error) { - return res - .status(500) - .json({ message: 'não foi possivel pegar o usuario' }); - } - }, + // req.user = user + try { + // @ts-ignore + let id = decoded.sub; + let user = await pool.query('SELECT *FROM users WHERE id = $1 ', [id]); + if (user.rows.length == 0) { + return res.status(404).json({ error: 'usuario nao encontrado' }); + } + // @ts-ignore + req.user = user; + next(); + } catch (err) { + return res + .status(500) + .json({ error: 'não foi possivel pegar o usuario', error_infos: err }); + } + }, }; From 151f25ccca6ecb455f6bab2a605126c33c2f6f6d Mon Sep 17 00:00:00 2001 From: LucasEmanoel0 Date: Thu, 22 Aug 2024 21:12:20 -0300 Subject: [PATCH 21/31] chore: add env database --- src/database/database.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/database/database.js b/src/database/database.js index 29b5692..319eb28 100644 --- a/src/database/database.js +++ b/src/database/database.js @@ -2,11 +2,12 @@ import pg from 'pg' const {Pool} = pg let pool = new Pool({ - database: 'postgres', - user: 'postgres', - password: 'postgres', - host:'localhost', - port: 5432, + database: process.env["POSTGRES_DATABASE"], + user: process.env["POSTGRES_USER"], + password: process.env["POSTGRES_PASSWORD"], + host:process.env["POSTGRES_HOST"], + // @ts-ignore + port: process.env["POSTGRES_PORT"], }) From 57a12692de43e2583b4aa8b603dad43afb0099fc Mon Sep 17 00:00:00 2001 From: ItzTas Date: Thu, 22 Aug 2024 20:46:16 -0400 Subject: [PATCH 22/31] chore: consertando workflow --- .github/workflows/ci.yml | 42 ++++++++++++++++++++++++++++++---------- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6e84c5a..a838dc9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,19 +1,41 @@ name: Testes Unitarios on: [push, pull_request] +env: + POSTGRES_USER: ${{vars.POSTGRES_USER}} + POSTGRES_PASSWORD: ${{vars.POSTGRES_PASSWORD}} + POSTGRES_HOST: ${{vars.POSTGRES_HOST}} + POSTGRES_PORT: ${{vars.POSTGRES_PORT}} + POSTGRES_DATABASE: ${{vars.POSTGRES_DATABASE}} + JWT_SECRET: ${{secrets.JWT_SECRET}} jobs: CI: runs-on: ubuntu-latest steps: - - name: Verificação do Repositorio - uses: actions/checkout@v4.1.7 - - name: Configurando Node.Js - uses: actions/setup-node@v4.0.3 - with: - node-version: '20' - - name: Instalando Dependencias - run: npm clean-install - - name: Executando Testes - run: npm run test + - name: Verificação do Repositorio + uses: actions/checkout@v4.1.7 + - name: Iniciando Docker Compose + uses: hoverkraft-tech/compose-action@v2.0.1 + with: + services: database + compose-file: ./docker-compose.yml + + - name: Configurando Node.Js + uses: actions/setup-node@v4.0.3 + with: + node-version: '20' + + - name: Instalando Dependencias + run: npm clean-install + + - name: Executando Testes + run: npm run test + env: + POSTGRES_HOST: ${{env.POSTGRES_HOST}} + POSTGRES_PORT: ${{env.POSTGRES_PORT}} + POSTGRES_USER: ${{env.POSTGRES_USER}} + POSTGRES_PASSWORD: ${{env.POSTGRES_PASSWORD}} + POSTGRES_DATABASE: ${{env.POSTGRES_DATABASE}} + JWT_SECRET: ${{env.JWT_SECRET}} From 7d6b8fb37518fd36366e6ce1ddb70648ce043342 Mon Sep 17 00:00:00 2001 From: ItzTas Date: Thu, 22 Aug 2024 20:53:54 -0400 Subject: [PATCH 23/31] =?UTF-8?q?feat:=20middleware=20de=20autentica=C3=A7?= =?UTF-8?q?=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From bcdccedcc9a0b5210fff9dd1f2dbeb3356f9851d Mon Sep 17 00:00:00 2001 From: ItzTas Date: Thu, 22 Aug 2024 21:25:31 -0400 Subject: [PATCH 24/31] =?UTF-8?q?test:=20ultimo=20teste=20para=20valida?= =?UTF-8?q?=C3=A7=C3=A3o=20de=20resposta=20de=20middleware?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jest.config.mjs | 6 +- package-lock.json | 14 +++ package.json | 1 + src/database/database.js | 21 ++--- src/middlewares/auth_middleware.js | 116 +++++++++++------------ test/auth.test.js | 146 ++++++++++++++++++----------- test/test.router.js | 16 ++-- 7 files changed, 184 insertions(+), 136 deletions(-) diff --git a/jest.config.mjs b/jest.config.mjs index e3e017e..30a2336 100644 --- a/jest.config.mjs +++ b/jest.config.mjs @@ -24,7 +24,7 @@ const config = { // collectCoverageFrom: undefined, // The directory where Jest should output its coverage files - coverageDirectory: "coverage", + coverageDirectory: 'coverage', // An array of regexp pattern strings used to skip coverage collection // coveragePathIgnorePatterns: [ @@ -32,7 +32,7 @@ const config = { // ], // Indicates which provider should be used to instrument code for coverage - coverageProvider: "v8", + coverageProvider: 'v8', // A list of reporter names that Jest uses when writing coverage reports // coverageReporters: [ @@ -60,7 +60,7 @@ const config = { // forceCoverageMatch: [], // A path to a module which exports an async function that is triggered once before all test suites - // globalSetup: undefined, + globalSetup: './jest.setup.js', // A path to a module which exports an async function that is triggered once after all test suites // globalTeardown: undefined, diff --git a/package-lock.json b/package-lock.json index 01a6d3e..5b82599 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,6 +31,7 @@ "@types/pg": "^8.11.6", "@types/supertest": "^6.0.2", "commitlint": "^19.3.0", + "dotenv": "^16.4.5", "husky": "^9.1.4", "jest": "^29.7.0", "semantic-release": "^24.0.0", @@ -4212,6 +4213,19 @@ "node": ">=8" } }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "node_modules/duplexer2": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", diff --git a/package.json b/package.json index 2f20309..6969784 100644 --- a/package.json +++ b/package.json @@ -42,6 +42,7 @@ "@types/pg": "^8.11.6", "@types/supertest": "^6.0.2", "commitlint": "^19.3.0", + "dotenv": "^16.4.5", "husky": "^9.1.4", "jest": "^29.7.0", "semantic-release": "^24.0.0", diff --git a/src/database/database.js b/src/database/database.js index 319eb28..45388f9 100644 --- a/src/database/database.js +++ b/src/database/database.js @@ -1,14 +1,13 @@ -import pg from 'pg' -const {Pool} = pg +import pg from 'pg'; +const { Pool } = pg; let pool = new Pool({ - database: process.env["POSTGRES_DATABASE"], - user: process.env["POSTGRES_USER"], - password: process.env["POSTGRES_PASSWORD"], - host:process.env["POSTGRES_HOST"], - // @ts-ignore - port: process.env["POSTGRES_PORT"], - - }) + database: process.env['POSTGRES_DATABASE'], + user: process.env['POSTGRES_USER'], + password: process.env['POSTGRES_PASSWORD'], + host: process.env['POSTGRES_HOST'], + // @ts-ignore + port: process.env['POSTGRES_PORT'], +}); -export default pool +export default pool; diff --git a/src/middlewares/auth_middleware.js b/src/middlewares/auth_middleware.js index 10d91a2..768c8cd 100644 --- a/src/middlewares/auth_middleware.js +++ b/src/middlewares/auth_middleware.js @@ -5,68 +5,68 @@ */ import { - decodeJWT, - getToken, - JsonWebTokenError, - TokenExpiredError, + decodeJWT, + getToken, + JsonWebTokenError, + TokenExpiredError, } from '../helpers/auth.js'; import pool from '../database/database.js'; export default { - /** - * - * - * @param {Request} req - * @param {Response} res - * @param {Function} next - * @async - */ - // @ts-ignore - async authenticateJWT(req, res, next) { - let token; - try { - token = getToken(req); - } catch (err) { - return res.status(401).json({ - error: 'invalido', - }); - } + /** + * + * + * @param {Request} req + * @param {Response} res + * @param {Function} next + * @async + */ + // @ts-ignore + async authenticateJWT(req, res, next) { + let token; + try { + token = getToken(req); + } catch (err) { + return res.status(401).json({ + error: 'invalido', + }); + } - let decoded; - try { - //@ts-ignore - decoded = decodeJWT(token); - } catch (err) { - if (err instanceof TokenExpiredError) { - return res.status(401).json({ - error: 'expirado', - }); - } - if (err instanceof JsonWebTokenError) { - return res.status(401).json({ - error: 'invalido', - }); - } - return res.status(500).json({ - error: 'server error', - }); - } + let decoded; + try { + //@ts-ignore + decoded = decodeJWT(token); + } catch (err) { + if (err instanceof TokenExpiredError) { + return res.status(401).json({ + error: 'expirado', + }); + } + if (err instanceof JsonWebTokenError) { + return res.status(401).json({ + error: 'invalido', + }); + } + return res.status(500).json({ + error: 'server error', + }); + } - // req.user = user - try { - // @ts-ignore - let id = decoded.sub; - let user = await pool.query('SELECT *FROM users WHERE id = $1 ', [id]); - if (user.rows.length == 0) { - return res.status(404).json({ error: 'usuario nao encontrado' }); - } - // @ts-ignore - req.user = user; - next(); - } catch (err) { - return res - .status(500) - .json({ error: 'não foi possivel pegar o usuario', error_infos: err }); - } - }, + // req.user = user + try { + // @ts-ignore + let id = decoded.sub; + let reuslt = await pool.query('SELECT *FROM users WHERE id = $1 ', [id]); + if (reuslt.rows.length == 0) { + return res.status(404).json({ error: 'usuario nao encontrado' }); + } + // @ts-ignore + req.user = reuslt.rows[0]; + next(); + } catch (err) { + return res + .status(500) + .json({ error: 'não foi possivel pegar o usuario', error_infos: err }); + } + }, }; diff --git a/test/auth.test.js b/test/auth.test.js index a25c099..0bffc0f 100644 --- a/test/auth.test.js +++ b/test/auth.test.js @@ -2,87 +2,119 @@ import supertest from 'supertest'; import test_app from './test.router.js'; import { signJWT } from '../src/helpers/auth.js'; import { formatObject } from '../src/helpers/general_helpers.js'; +import pool from '../src/database/database.js'; +import moment from 'moment'; describe('AUTH TEST', () => { - const path = '/test/middlware/autenticacao'; + afterAll(async () => { + await pool.query('TRUNCATE TABLE users CASCADE'); + }); + const path = '/test/middlware/autenticacao'; - it('401: token nao veio na autenticacao', async () => { - await supertest(test_app) - .post(path) - .send() - .expect((res) => { - const { status, body } = res; - try { - expect(status).toBe(401); - expect(body).toHaveProperty('error', 'invalido'); - } catch (error) { - throw new Error(` + it('401: token nao veio na autenticacao', async () => { + await supertest(test_app) + .post(path) + .send() + .expect((res) => { + const { status, body } = res; + try { + expect(status).toBe(401); + expect(body).toHaveProperty('error', 'invalido'); + } catch (error) { + throw new Error(` \n${status}\n \n${formatObject(body)}\n \n${error}\n `); - } - }); - }); + } + }); + }); - it('401: token deve expirar quando passar o tempo', async () => { - const token = signJWT({ id: 1 }, { expiresIn: '1ms' }); - await supertest(test_app).post(path).set("Authorization",`Bearer ${token}`).expect((res)=>{ - const {status,body} = res - try { - expect(status).toBe(401); - expect(body).toHaveProperty('error', 'expirado'); - } catch (error) { - throw new Error(` + it('401: token deve expirar quando passar o tempo', async () => { + const token = signJWT({ id: 1 }, { expiresIn: '1ms' }); + await supertest(test_app) + .post(path) + .set('Authorization', `Bearer ${token}`) + .expect((res) => { + const { status, body } = res; + try { + expect(status).toBe(401); + expect(body).toHaveProperty('error', 'expirado'); + } catch (error) { + throw new Error(` \n${status}\n \n${formatObject(body)}\n \n${error}\n `); - - } - }) - - - - }); + } + }); + }); - it('401: token deve ser invalido', async () => { - await supertest(test_app).post(path).set("Authorization",`Bearer lalaal`).expect((res)=>{ - const {status,body} = res - try { - expect(status).toBe(401); - expect(body).toHaveProperty('error', 'invalido'); - } catch (error) { - throw new Error(` + it('401: token deve ser invalido', async () => { + await supertest(test_app) + .post(path) + .set('Authorization', `Bearer lalaal`) + .expect((res) => { + const { status, body } = res; + try { + expect(status).toBe(401); + expect(body).toHaveProperty('error', 'invalido'); + } catch (error) { + throw new Error(` \n${status}\n \n${formatObject(body)}\n \n${error}\n `); - - } - }) - - - - }); - it('404: Usuario nao encontrado', async () => { + } + }); + }); + it('404: Usuario nao encontrado', async () => { const token = signJWT({ id: 8 }); - await supertest(test_app).post(path).set("Authorization",`Bearer ${token}`).expect((res)=>{ - const {status,body} = res + await supertest(test_app) + .post(path) + .set('Authorization', `Bearer ${token}`) + .expect((res) => { + const { status, body } = res; try { - expect(status).toBe(404); - expect(body).toHaveProperty('error', 'usuario nao encontrado'); + expect(status).toBe(404); + expect(body).toHaveProperty('error', 'usuario nao encontrado'); } catch (error) { - throw new Error(` + throw new Error(` \n${status}\n \n${formatObject(body)}\n \n${error}\n `); - } - }) + }); + }); - - -}); + it('200: deve dar certo se o token for valido e o usuario existir', async () => { + const result = await pool.query(` + INSERT INTO users (id, username, password) + VALUES (10, 'tales', '123') + RETURNING * + `); + const user = result.rows[0]; + const token = signJWT({ + id: user.id, + }); + + await supertest(test_app) + .post(path) + .set('Authorization', `Bearer ${token}`) + .expect((res) => { + const { status, body } = res; + body.created_at = moment(body.created_at).toDate(); + try { + expect(status).toBe(200); + expect(body).toEqual(user); + } catch (error) { + throw new Error(` + \n${status}\n + \n${formatObject(body)}\n + \n${error}\n + `); + } + }); + }); }); diff --git a/test/test.router.js b/test/test.router.js index c26a3bf..7f50482 100644 --- a/test/test.router.js +++ b/test/test.router.js @@ -5,18 +5,20 @@ let test_app = express(); test_app.use(express.json()); test_app.post( - '/test/middlware/autenticacao', - auth_middleware.authenticateJWT, - (req, res) => { - // @ts-ignore - res.json(req.user); - } + '/test/middlware/autenticacao', + auth_middleware.authenticateJWT, + (req, res) => { + // @ts-ignore + console.log(req.user); + // @ts-ignore + return res.json(req.user); + } ); const port = 3000; test_app.listen(port, () => { - console.log(`test app escutando na porta: ${port}`); + console.log(`test app escutando na porta: ${port}`); }); export default test_app; From 593421ba9a281508d0c8d07d2251c624ca4531a1 Mon Sep 17 00:00:00 2001 From: ItzTas Date: Fri, 23 Aug 2024 19:12:48 -0400 Subject: [PATCH 25/31] chore: moment removido --- package.json | 1 - src/helpers/auth.js | 15 ++-- test/auth.test.js | 165 ++++++++++++++++++++++---------------------- 3 files changed, 90 insertions(+), 91 deletions(-) diff --git a/package.json b/package.json index 6969784..74fd3da 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,6 @@ "express": "^4.19.2", "helmet": "^7.1.0", "jsonwebtoken": "^9.0.2", - "moment": "^2.30.1", "pg": "^8.12.0", "supertest": "^7.0.0" }, diff --git a/src/helpers/auth.js b/src/helpers/auth.js index 9695b0f..37522ef 100644 --- a/src/helpers/auth.js +++ b/src/helpers/auth.js @@ -4,8 +4,10 @@ * */ import jwt from 'jsonwebtoken'; -import moment from 'moment'; -const JWT_SECRET = `${process.env['JWT_SECRET']}`; +const JWT_SECRET = process.env['JWT_SECRET']; +if (!JWT_SECRET) { + process.exit(1); +} const defaultExpirationDate = '1hr'; @@ -17,13 +19,12 @@ class JsonWebTokenError extends Error { } * * * @param {String} token - * @param {jwt.VerifyOptions | undefined} [options={}] * @throws {JsonWebTokenError} * @throws {TokenExpiredError} */ -function decodeJWT(token, options = undefined) { +function decodeJWT(token) { try { - return jwt.verify(token, JWT_SECRET, options); + return jwt.verify(token, JWT_SECRET); } catch (/** @type {any}*/ err) { if (err?.name === 'TokenExpiredError') { throw new TokenExpiredError('token expirado'); @@ -46,7 +47,7 @@ function getToken(req) { throw new Error('sem token de autorização ou nome errado'); } const headerDiv = bearerToken.split(' '); - if (headerDiv[0] != 'Bearer' || headerDiv.length === 0) { + if (headerDiv[0] != 'Bearer' || headerDiv.length !== 2) { throw new Error('formato invalido'); } return headerDiv[1]; @@ -60,7 +61,7 @@ function getToken(req) { function signJWT(payload, options = {}) { options.expiresIn = options.expiresIn || defaultExpirationDate; options.subject = `${payload.id}`; - payload.iat = moment().unix(); + payload.iat = Math.floor(Date.now() / 1000); return jwt.sign(payload, JWT_SECRET, options); } diff --git a/test/auth.test.js b/test/auth.test.js index 0bffc0f..dbe1b19 100644 --- a/test/auth.test.js +++ b/test/auth.test.js @@ -3,118 +3,117 @@ import test_app from './test.router.js'; import { signJWT } from '../src/helpers/auth.js'; import { formatObject } from '../src/helpers/general_helpers.js'; import pool from '../src/database/database.js'; -import moment from 'moment'; describe('AUTH TEST', () => { - afterAll(async () => { - await pool.query('TRUNCATE TABLE users CASCADE'); - }); - const path = '/test/middlware/autenticacao'; + afterAll(async () => { + await pool.query('TRUNCATE TABLE users CASCADE'); + }); + const path = '/test/middlware/autenticacao'; - it('401: token nao veio na autenticacao', async () => { - await supertest(test_app) - .post(path) - .send() - .expect((res) => { - const { status, body } = res; - try { - expect(status).toBe(401); - expect(body).toHaveProperty('error', 'invalido'); - } catch (error) { - throw new Error(` + it('401: token nao veio na autenticacao', async () => { + await supertest(test_app) + .post(path) + .send() + .expect((res) => { + const { status, body } = res; + try { + expect(status).toBe(401); + expect(body).toHaveProperty('error', 'invalido'); + } catch (error) { + throw new Error(` \n${status}\n \n${formatObject(body)}\n \n${error}\n `); - } - }); - }); + } + }); + }); - it('401: token deve expirar quando passar o tempo', async () => { - const token = signJWT({ id: 1 }, { expiresIn: '1ms' }); - await supertest(test_app) - .post(path) - .set('Authorization', `Bearer ${token}`) - .expect((res) => { - const { status, body } = res; - try { - expect(status).toBe(401); - expect(body).toHaveProperty('error', 'expirado'); - } catch (error) { - throw new Error(` + it('401: token deve expirar quando passar o tempo', async () => { + const token = signJWT({ id: 1 }, { expiresIn: '1ms' }); + await supertest(test_app) + .post(path) + .set('Authorization', `Bearer ${token}`) + .expect((res) => { + const { status, body } = res; + try { + expect(status).toBe(401); + expect(body).toHaveProperty('error', 'expirado'); + } catch (error) { + throw new Error(` \n${status}\n \n${formatObject(body)}\n \n${error}\n `); - } - }); - }); + } + }); + }); - it('401: token deve ser invalido', async () => { - await supertest(test_app) - .post(path) - .set('Authorization', `Bearer lalaal`) - .expect((res) => { - const { status, body } = res; - try { - expect(status).toBe(401); - expect(body).toHaveProperty('error', 'invalido'); - } catch (error) { - throw new Error(` + it('401: token deve ser invalido', async () => { + await supertest(test_app) + .post(path) + .set('Authorization', `Bearer lalaal`) + .expect((res) => { + const { status, body } = res; + try { + expect(status).toBe(401); + expect(body).toHaveProperty('error', 'invalido'); + } catch (error) { + throw new Error(` \n${status}\n \n${formatObject(body)}\n \n${error}\n `); - } - }); - }); - it('404: Usuario nao encontrado', async () => { - const token = signJWT({ id: 8 }); - await supertest(test_app) - .post(path) - .set('Authorization', `Bearer ${token}`) - .expect((res) => { - const { status, body } = res; - try { - expect(status).toBe(404); - expect(body).toHaveProperty('error', 'usuario nao encontrado'); - } catch (error) { - throw new Error(` + } + }); + }); + it('404: Usuario nao encontrado', async () => { + const token = signJWT({ id: 8 }); + await supertest(test_app) + .post(path) + .set('Authorization', `Bearer ${token}`) + .expect((res) => { + const { status, body } = res; + try { + expect(status).toBe(404); + expect(body).toHaveProperty('error', 'usuario nao encontrado'); + } catch (error) { + throw new Error(` \n${status}\n \n${formatObject(body)}\n \n${error}\n `); - } - }); - }); + } + }); + }); - it('200: deve dar certo se o token for valido e o usuario existir', async () => { - const result = await pool.query(` + it('200: deve dar certo se o token for valido e o usuario existir', async () => { + const result = await pool.query(` INSERT INTO users (id, username, password) VALUES (10, 'tales', '123') RETURNING * `); - const user = result.rows[0]; - const token = signJWT({ - id: user.id, - }); + const user = result.rows[0]; + const token = signJWT({ + id: user.id, + }); - await supertest(test_app) - .post(path) - .set('Authorization', `Bearer ${token}`) - .expect((res) => { - const { status, body } = res; - body.created_at = moment(body.created_at).toDate(); - try { - expect(status).toBe(200); - expect(body).toEqual(user); - } catch (error) { - throw new Error(` + await supertest(test_app) + .post(path) + .set('Authorization', `Bearer ${token}`) + .expect((res) => { + const { status, body } = res; + body.created_at = new Date(body.created_at); + try { + expect(status).toBe(200); + expect(body).toEqual(user); + } catch (error) { + throw new Error(` \n${status}\n \n${formatObject(body)}\n \n${error}\n `); - } - }); - }); + } + }); + }); }); From 48ef2cedc55124445e5a35b27180b1023a608e39 Mon Sep 17 00:00:00 2001 From: ItzTas Date: Fri, 23 Aug 2024 19:13:19 -0400 Subject: [PATCH 26/31] =?UTF-8?q?chore:=20melhor=20valida=C3=A7=C3=A3o=20d?= =?UTF-8?q?e=20retornos=20do=20pool?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/middlewares/auth_middleware.js | 124 +++++++++++++++-------------- 1 file changed, 66 insertions(+), 58 deletions(-) diff --git a/src/middlewares/auth_middleware.js b/src/middlewares/auth_middleware.js index 768c8cd..b73a43e 100644 --- a/src/middlewares/auth_middleware.js +++ b/src/middlewares/auth_middleware.js @@ -5,68 +5,76 @@ */ import { - decodeJWT, - getToken, - JsonWebTokenError, - TokenExpiredError, + decodeJWT, + getToken, + JsonWebTokenError, + TokenExpiredError, } from '../helpers/auth.js'; import pool from '../database/database.js'; export default { - /** - * - * - * @param {Request} req - * @param {Response} res - * @param {Function} next - * @async - */ - // @ts-ignore - async authenticateJWT(req, res, next) { - let token; - try { - token = getToken(req); - } catch (err) { - return res.status(401).json({ - error: 'invalido', - }); - } + /** + * + * + * @param {Request} req + * @param {Response} res + * @param {Function} next + * @async + */ + // @ts-ignore + async authenticateJWT(req, res, next) { + let token; + try { + token = getToken(req); + } catch (err) { + return res.status(401).json({ + error: 'invalido', + }); + } - let decoded; - try { - //@ts-ignore - decoded = decodeJWT(token); - } catch (err) { - if (err instanceof TokenExpiredError) { - return res.status(401).json({ - error: 'expirado', - }); - } - if (err instanceof JsonWebTokenError) { - return res.status(401).json({ - error: 'invalido', - }); - } - return res.status(500).json({ - error: 'server error', - }); - } + let decoded; + try { + //@ts-ignore + decoded = decodeJWT(token); + } catch (err) { + if (err instanceof TokenExpiredError) { + return res.status(401).json({ + error: 'expirado', + }); + } + if (err instanceof JsonWebTokenError) { + return res.status(401).json({ + error: 'invalido', + }); + } + return res.status(500).json({ + error: 'server error', + }); + } - // req.user = user - try { - // @ts-ignore - let id = decoded.sub; - let reuslt = await pool.query('SELECT *FROM users WHERE id = $1 ', [id]); - if (reuslt.rows.length == 0) { - return res.status(404).json({ error: 'usuario nao encontrado' }); - } - // @ts-ignore - req.user = reuslt.rows[0]; - next(); - } catch (err) { - return res - .status(500) - .json({ error: 'não foi possivel pegar o usuario', error_infos: err }); - } - }, + // req.user = user + try { + // @ts-ignore + let id = decoded.sub; + let result = await pool.query('SELECT * FROM users WHERE id = $1 ', [id]); + if (result.rows.length == 0) { + return res.status(404).json({ error: 'usuario nao encontrado' }); + } + if (result.rows.length > 1) { + console.log(`ERROR: Mais de um usuário foi encontrado com o id ${id}`); + return res + .status(500) + .json({ + error: 'Houve um erro no banco de dados ao autenticar o usuário', + }); + } + // @ts-ignore + req.user = result.rows[0]; + next(); + } catch (err) { + return res + .status(500) + .json({ error: 'não foi possivel pegar o usuario', error_infos: err }); + } + }, }; From 02f1049e442468c224de397859acd5b9b8ce7b47 Mon Sep 17 00:00:00 2001 From: ItzTas Date: Fri, 23 Aug 2024 19:13:38 -0400 Subject: [PATCH 27/31] chore: comentarios pra ajudar alguem --- src/helpers/general_helpers.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/helpers/general_helpers.js b/src/helpers/general_helpers.js index e27e83e..5dfe589 100644 --- a/src/helpers/general_helpers.js +++ b/src/helpers/general_helpers.js @@ -5,7 +5,11 @@ * @returns {String} */ function formatObject(obj) { - return JSON.stringify(obj, null, 2); + return JSON.stringify( + obj, + /** null keys value*/ null, + /** space indentation*/ 2 + ); } export { formatObject }; From 2651baa115671e092fc603fb564df545431266de Mon Sep 17 00:00:00 2001 From: ItzTas Date: Fri, 23 Aug 2024 19:43:26 -0400 Subject: [PATCH 28/31] =?UTF-8?q?chore:=20melhor=20valida=C3=A7=C3=A3o=20d?= =?UTF-8?q?e=20id?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/middlewares/auth_middleware.js | 134 +++++++++++++++-------------- 1 file changed, 68 insertions(+), 66 deletions(-) diff --git a/src/middlewares/auth_middleware.js b/src/middlewares/auth_middleware.js index b73a43e..cbaffeb 100644 --- a/src/middlewares/auth_middleware.js +++ b/src/middlewares/auth_middleware.js @@ -5,76 +5,78 @@ */ import { - decodeJWT, - getToken, - JsonWebTokenError, - TokenExpiredError, + decodeJWT, + getToken, + JsonWebTokenError, + TokenExpiredError, } from '../helpers/auth.js'; import pool from '../database/database.js'; +import { error } from 'console'; export default { - /** - * - * - * @param {Request} req - * @param {Response} res - * @param {Function} next - * @async - */ - // @ts-ignore - async authenticateJWT(req, res, next) { - let token; - try { - token = getToken(req); - } catch (err) { - return res.status(401).json({ - error: 'invalido', - }); - } + /** + * + * + * @param {Request} req + * @param {Response} res + * @param {Function} next + * @async + */ + // @ts-ignore + async authenticateJWT(req, res, next) { + let token; + try { + token = getToken(req); + } catch (err) { + return res.status(401).json({ + error: 'invalido', + }); + } - let decoded; - try { - //@ts-ignore - decoded = decodeJWT(token); - } catch (err) { - if (err instanceof TokenExpiredError) { - return res.status(401).json({ - error: 'expirado', - }); - } - if (err instanceof JsonWebTokenError) { - return res.status(401).json({ - error: 'invalido', - }); - } - return res.status(500).json({ - error: 'server error', - }); - } + let decoded; + try { + //@ts-ignore + decoded = decodeJWT(token); + } catch (err) { + if (err instanceof TokenExpiredError) { + return res.status(401).json({ + error: 'expirado', + }); + } + if (err instanceof JsonWebTokenError) { + return res.status(401).json({ + error: 'invalido', + }); + } + return res.status(500).json({ + error: 'server error', + }); + } - // req.user = user - try { - // @ts-ignore - let id = decoded.sub; - let result = await pool.query('SELECT * FROM users WHERE id = $1 ', [id]); - if (result.rows.length == 0) { - return res.status(404).json({ error: 'usuario nao encontrado' }); - } - if (result.rows.length > 1) { - console.log(`ERROR: Mais de um usuário foi encontrado com o id ${id}`); - return res - .status(500) - .json({ - error: 'Houve um erro no banco de dados ao autenticar o usuário', - }); - } - // @ts-ignore - req.user = result.rows[0]; - next(); - } catch (err) { - return res - .status(500) - .json({ error: 'não foi possivel pegar o usuario', error_infos: err }); - } - }, + // req.user = user + try { + // @ts-ignore + let id = decoded.sub; + if (Number(id) <= 0) { + return res.status(400).json({ error: "id invalido"}) + } + let result = await pool.query('SELECT * FROM users WHERE id = $1 ', [id]); + if (result.rows.length == 0) { + return res.status(404).json({ error: 'usuario nao encontrado' }); + } + if (result.rows.length > 1) { + console.log(`ERROR: Mais de um usuário foi encontrado com o id ${id}`); + return res.status(500).json({ + error: 'Houve um erro no banco de dados ao autenticar o usuário', + }); + } + // @ts-ignore + req.user = result.rows[0]; + next(); + } catch (err) { + return res + .status(500) + .json({ error: 'não foi possivel pegar o usuario', error_infos: err }); + } + }, }; From b04d29127dd16b3f4857debe02106e2691dba911 Mon Sep 17 00:00:00 2001 From: ItzTas Date: Fri, 23 Aug 2024 19:43:56 -0400 Subject: [PATCH 29/31] =?UTF-8?q?test:=20test=20para=20valida=C3=A7=C3=A3o?= =?UTF-8?q?=20de=20id?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/auth.test.js | 186 ++++++++++++++++++++++++++-------------------- 1 file changed, 104 insertions(+), 82 deletions(-) diff --git a/test/auth.test.js b/test/auth.test.js index dbe1b19..8b5b8a2 100644 --- a/test/auth.test.js +++ b/test/auth.test.js @@ -5,115 +5,137 @@ import { formatObject } from '../src/helpers/general_helpers.js'; import pool from '../src/database/database.js'; describe('AUTH TEST', () => { - afterAll(async () => { - await pool.query('TRUNCATE TABLE users CASCADE'); - }); - const path = '/test/middlware/autenticacao'; + afterAll(async () => { + await pool.query('TRUNCATE TABLE users CASCADE'); + }); + const path = '/test/middlware/autenticacao'; - it('401: token nao veio na autenticacao', async () => { - await supertest(test_app) - .post(path) - .send() - .expect((res) => { - const { status, body } = res; - try { - expect(status).toBe(401); - expect(body).toHaveProperty('error', 'invalido'); - } catch (error) { - throw new Error(` + it('401: token nao veio na autenticacao', async () => { + await supertest(test_app) + .post(path) + .send() + .expect((res) => { + const { status, body } = res; + try { + expect(status).toBe(401); + expect(body).toHaveProperty('error', 'invalido'); + } catch (error) { + throw new Error(` \n${status}\n \n${formatObject(body)}\n \n${error}\n `); - } - }); - }); + } + }); + }); - it('401: token deve expirar quando passar o tempo', async () => { - const token = signJWT({ id: 1 }, { expiresIn: '1ms' }); - await supertest(test_app) - .post(path) - .set('Authorization', `Bearer ${token}`) - .expect((res) => { - const { status, body } = res; - try { - expect(status).toBe(401); - expect(body).toHaveProperty('error', 'expirado'); - } catch (error) { - throw new Error(` + it('401: token deve expirar quando passar o tempo', async () => { + const token = signJWT({ id: 1 }, { expiresIn: '1ms' }); + await supertest(test_app) + .post(path) + .set('Authorization', `Bearer ${token}`) + .expect((res) => { + const { status, body } = res; + try { + expect(status).toBe(401); + expect(body).toHaveProperty('error', 'expirado'); + } catch (error) { + throw new Error(` \n${status}\n \n${formatObject(body)}\n \n${error}\n `); - } - }); - }); + } + }); + }); - it('401: token deve ser invalido', async () => { - await supertest(test_app) - .post(path) - .set('Authorization', `Bearer lalaal`) - .expect((res) => { - const { status, body } = res; - try { - expect(status).toBe(401); - expect(body).toHaveProperty('error', 'invalido'); - } catch (error) { - throw new Error(` + it('401: token deve ser invalido', async () => { + await supertest(test_app) + .post(path) + .set('Authorization', `Bearer lalaal`) + .expect((res) => { + const { status, body } = res; + try { + expect(status).toBe(401); + expect(body).toHaveProperty('error', 'invalido'); + } catch (error) { + throw new Error(` \n${status}\n \n${formatObject(body)}\n \n${error}\n `); - } - }); - }); - it('404: Usuario nao encontrado', async () => { - const token = signJWT({ id: 8 }); - await supertest(test_app) - .post(path) - .set('Authorization', `Bearer ${token}`) - .expect((res) => { - const { status, body } = res; - try { - expect(status).toBe(404); - expect(body).toHaveProperty('error', 'usuario nao encontrado'); - } catch (error) { - throw new Error(` + } + }); + }); + it('404: Usuario nao encontrado', async () => { + const token = signJWT({ id: 8 }); + await supertest(test_app) + .post(path) + .set('Authorization', `Bearer ${token}`) + .expect((res) => { + const { status, body } = res; + try { + expect(status).toBe(404); + expect(body).toHaveProperty('error', 'usuario nao encontrado'); + } catch (error) { + throw new Error(` \n${status}\n \n${formatObject(body)}\n \n${error}\n `); - } - }); - }); + } + }); + }); - it('200: deve dar certo se o token for valido e o usuario existir', async () => { - const result = await pool.query(` + it('200: deve dar certo se o token for valido e o usuario existir', async () => { + const result = await pool.query(` INSERT INTO users (id, username, password) VALUES (10, 'tales', '123') RETURNING * `); - const user = result.rows[0]; - const token = signJWT({ - id: user.id, - }); + const user = result.rows[0]; + const token = signJWT({ + id: user.id, + }); - await supertest(test_app) - .post(path) - .set('Authorization', `Bearer ${token}`) - .expect((res) => { - const { status, body } = res; - body.created_at = new Date(body.created_at); - try { - expect(status).toBe(200); - expect(body).toEqual(user); - } catch (error) { - throw new Error(` + await supertest(test_app) + .post(path) + .set('Authorization', `Bearer ${token}`) + .expect((res) => { + const { status, body } = res; + body.created_at = new Date(body.created_at); + try { + expect(status).toBe(200); + expect(body).toEqual(user); + } catch (error) { + throw new Error(` \n${status}\n \n${formatObject(body)}\n \n${error}\n `); - } - }); - }); + } + }); + }); + + it('400: id abaixo de 0 ou 0 deve ser invalido', async () => { + for (let id = -3; id <= 0; id++) { + const token = signJWT({ id: id }); + await supertest(test_app) + .post(path) + .set('Authorization', `Bearer ${token}`) + .expect((res) => { + const { status, body } = res; + try { + expect(status).toBe(400); + expect(body).toHaveProperty('error', 'id invalido'); + } catch (err) { + throw new Error(` + \n${status}\n + \n${formatObject(body)}\n + \n${err}\n + `); + } + }); + } + }); }); From fea31801fb7ac5a70cdc188e35e69b197189ccce Mon Sep 17 00:00:00 2001 From: ItzTas Date: Fri, 23 Aug 2024 20:05:49 -0400 Subject: [PATCH 30/31] =?UTF-8?q?chore:=20melhor=20utiliza=C3=A7=C3=A3o=20?= =?UTF-8?q?do=20sign?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/helpers/auth.js | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/helpers/auth.js b/src/helpers/auth.js index 37522ef..94d4f4f 100644 --- a/src/helpers/auth.js +++ b/src/helpers/auth.js @@ -58,11 +58,31 @@ function getToken(req) { * @param {jwt.SignOptions} [options={ expiresIn: defaultTokenExpiration }] * @returns {String} */ -function signJWT(payload, options = {}) { +function testsignJWT(payload, options = {}) { options.expiresIn = options.expiresIn || defaultExpirationDate; options.subject = `${payload.id}`; payload.iat = Math.floor(Date.now() / 1000); return jwt.sign(payload, JWT_SECRET, options); } -export { decodeJWT, getToken, TokenExpiredError, JsonWebTokenError, signJWT }; +/** + * + * @param {Object.} payload + * @returns {String} + */ +function signJWT(payload) { + /** @type {jwt.SignOptions} */ + let options = {}; + options.expiresIn = options.expiresIn || defaultExpirationDate; + options.subject = `${payload.id}`; + payload.iat = Math.floor(Date.now() / 1000); + return jwt.sign(payload, JWT_SECRET, options); +} +export { + decodeJWT, + getToken, + TokenExpiredError, + JsonWebTokenError, + testsignJWT, + signJWT +}; From dce745b4ce6175700627e35fca48931e8fdcfd7d Mon Sep 17 00:00:00 2001 From: ItzTas Date: Fri, 23 Aug 2024 20:07:22 -0400 Subject: [PATCH 31/31] chore: nome mudado --- test/auth.test.js | 200 +++++++++++++++++++++++----------------------- 1 file changed, 100 insertions(+), 100 deletions(-) diff --git a/test/auth.test.js b/test/auth.test.js index 8b5b8a2..5dd58f3 100644 --- a/test/auth.test.js +++ b/test/auth.test.js @@ -1,141 +1,141 @@ import supertest from 'supertest'; import test_app from './test.router.js'; -import { signJWT } from '../src/helpers/auth.js'; +import { testsignJWT } from '../src/helpers/auth.js'; import { formatObject } from '../src/helpers/general_helpers.js'; import pool from '../src/database/database.js'; describe('AUTH TEST', () => { - afterAll(async () => { - await pool.query('TRUNCATE TABLE users CASCADE'); - }); - const path = '/test/middlware/autenticacao'; + afterAll(async () => { + await pool.query('TRUNCATE TABLE users CASCADE'); + }); + const path = '/test/middlware/autenticacao'; - it('401: token nao veio na autenticacao', async () => { - await supertest(test_app) - .post(path) - .send() - .expect((res) => { - const { status, body } = res; - try { - expect(status).toBe(401); - expect(body).toHaveProperty('error', 'invalido'); - } catch (error) { - throw new Error(` + it('401: token nao veio na autenticacao', async () => { + await supertest(test_app) + .post(path) + .send() + .expect((res) => { + const { status, body } = res; + try { + expect(status).toBe(401); + expect(body).toHaveProperty('error', 'invalido'); + } catch (error) { + throw new Error(` \n${status}\n \n${formatObject(body)}\n \n${error}\n `); - } - }); - }); + } + }); + }); - it('401: token deve expirar quando passar o tempo', async () => { - const token = signJWT({ id: 1 }, { expiresIn: '1ms' }); - await supertest(test_app) - .post(path) - .set('Authorization', `Bearer ${token}`) - .expect((res) => { - const { status, body } = res; - try { - expect(status).toBe(401); - expect(body).toHaveProperty('error', 'expirado'); - } catch (error) { - throw new Error(` + it('401: token deve expirar quando passar o tempo', async () => { + const token = testsignJWT({ id: 1 }, { expiresIn: '1ms' }); + await supertest(test_app) + .post(path) + .set('Authorization', `Bearer ${token}`) + .expect((res) => { + const { status, body } = res; + try { + expect(status).toBe(401); + expect(body).toHaveProperty('error', 'expirado'); + } catch (error) { + throw new Error(` \n${status}\n \n${formatObject(body)}\n \n${error}\n `); - } - }); - }); + } + }); + }); - it('401: token deve ser invalido', async () => { - await supertest(test_app) - .post(path) - .set('Authorization', `Bearer lalaal`) - .expect((res) => { - const { status, body } = res; - try { - expect(status).toBe(401); - expect(body).toHaveProperty('error', 'invalido'); - } catch (error) { - throw new Error(` + it('401: token deve ser invalido', async () => { + await supertest(test_app) + .post(path) + .set('Authorization', `Bearer lalaal`) + .expect((res) => { + const { status, body } = res; + try { + expect(status).toBe(401); + expect(body).toHaveProperty('error', 'invalido'); + } catch (error) { + throw new Error(` \n${status}\n \n${formatObject(body)}\n \n${error}\n `); - } - }); - }); - it('404: Usuario nao encontrado', async () => { - const token = signJWT({ id: 8 }); - await supertest(test_app) - .post(path) - .set('Authorization', `Bearer ${token}`) - .expect((res) => { - const { status, body } = res; - try { - expect(status).toBe(404); - expect(body).toHaveProperty('error', 'usuario nao encontrado'); - } catch (error) { - throw new Error(` + } + }); + }); + it('404: Usuario nao encontrado', async () => { + const token = testsignJWT({ id: 8 }); + await supertest(test_app) + .post(path) + .set('Authorization', `Bearer ${token}`) + .expect((res) => { + const { status, body } = res; + try { + expect(status).toBe(404); + expect(body).toHaveProperty('error', 'usuario nao encontrado'); + } catch (error) { + throw new Error(` \n${status}\n \n${formatObject(body)}\n \n${error}\n `); - } - }); - }); + } + }); + }); - it('200: deve dar certo se o token for valido e o usuario existir', async () => { - const result = await pool.query(` + it('200: deve dar certo se o token for valido e o usuario existir', async () => { + const result = await pool.query(` INSERT INTO users (id, username, password) VALUES (10, 'tales', '123') RETURNING * `); - const user = result.rows[0]; - const token = signJWT({ - id: user.id, - }); + const user = result.rows[0]; + const token = testsignJWT({ + id: user.id, + }); - await supertest(test_app) - .post(path) - .set('Authorization', `Bearer ${token}`) - .expect((res) => { - const { status, body } = res; - body.created_at = new Date(body.created_at); - try { - expect(status).toBe(200); - expect(body).toEqual(user); - } catch (error) { - throw new Error(` + await supertest(test_app) + .post(path) + .set('Authorization', `Bearer ${token}`) + .expect((res) => { + const { status, body } = res; + body.created_at = new Date(body.created_at); + try { + expect(status).toBe(200); + expect(body).toEqual(user); + } catch (error) { + throw new Error(` \n${status}\n \n${formatObject(body)}\n \n${error}\n `); - } - }); - }); + } + }); + }); - it('400: id abaixo de 0 ou 0 deve ser invalido', async () => { - for (let id = -3; id <= 0; id++) { - const token = signJWT({ id: id }); - await supertest(test_app) - .post(path) - .set('Authorization', `Bearer ${token}`) - .expect((res) => { - const { status, body } = res; - try { - expect(status).toBe(400); - expect(body).toHaveProperty('error', 'id invalido'); - } catch (err) { - throw new Error(` + it('400: id abaixo de 0 ou 0 deve ser invalido', async () => { + for (let id = -3; id <= 0; id++) { + const token = testsignJWT({ id: id }); + await supertest(test_app) + .post(path) + .set('Authorization', `Bearer ${token}`) + .expect((res) => { + const { status, body } = res; + try { + expect(status).toBe(400); + expect(body).toHaveProperty('error', 'id invalido'); + } catch (err) { + throw new Error(` \n${status}\n \n${formatObject(body)}\n \n${err}\n `); - } - }); - } - }); + } + }); + } + }); });