From e5f4e2b2843df4fb875226cc00425921bdaa2693 Mon Sep 17 00:00:00 2001 From: carolinemartins Date: Sat, 11 Mar 2023 13:19:08 -0300 Subject: [PATCH 01/31] =?UTF-8?q?inicializa=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env | 8 + .gitignore | 3 + package-lock.json | 2921 ++++++++++++++++++++++++++++++ package.json | 36 + src/business/UserBusiness.ts | 43 + src/controller/UserController.ts | 50 + src/data/BaseDatabase.ts | 30 + src/data/UserDatabase.ts | 39 + src/error/BaseError.ts | 6 + src/index.ts | 19 + src/model/User.ts | 83 + src/routes/userRouter.ts | 10 + src/services/Authenticator.ts | 32 + src/services/HashManager.ts | 17 + src/services/IdGenerator.ts | 8 + tsconfig.json | 14 + 16 files changed, 3319 insertions(+) create mode 100644 .env create mode 100644 .gitignore create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/business/UserBusiness.ts create mode 100644 src/controller/UserController.ts create mode 100644 src/data/BaseDatabase.ts create mode 100644 src/data/UserDatabase.ts create mode 100644 src/error/BaseError.ts create mode 100644 src/index.ts create mode 100644 src/model/User.ts create mode 100644 src/routes/userRouter.ts create mode 100644 src/services/Authenticator.ts create mode 100644 src/services/HashManager.ts create mode 100644 src/services/IdGenerator.ts create mode 100644 tsconfig.json diff --git a/.env b/.env new file mode 100644 index 0000000..1592433 --- /dev/null +++ b/.env @@ -0,0 +1,8 @@ +DB_USER = "4416152-caroline-martins" +DB_PASSWORD = "YH1fV093Kl57DXfCnDFY" +DB_HOST = 35.226.146.116 +DB_PORT = 3306 +DB_DATABASE_NAME = "jbl-4416152-caroline-martins" +BCRYPT_COST= 12 +JWT_KEY = "caroline" +ACCESS_TOKEN_EXPIRES_IN = 60min \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a735ebe --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +node_modules +build +.env diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..ccb03cd --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2921 @@ +{ + "name": "lama-template", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "lama-template", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@types/jsonwebtoken": "^9.0.1", + "@types/node": "^18.15.0", + "@types/uuid": "^9.0.1", + "bcryptjs": "^2.4.3", + "dotenv": "^16.0.3", + "express": "^4.18.2", + "knex": "^2.4.2", + "mysql": "^2.18.1", + "typescript": "^4.9.5", + "uuid": "^9.0.0" + }, + "devDependencies": { + "@types/bcryptjs": "^2.4.2", + "@types/cors": "^2.8.13", + "@types/express": "^4.17.17", + "@types/knex": "^0.16.1", + "cors": "^2.8.5", + "ts-node-dev": "^2.0.0" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "dev": true + }, + "node_modules/@types/bcryptjs": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.2.tgz", + "integrity": "sha512-LiMQ6EOPob/4yUL66SZzu6Yh77cbzJFYll+ZfaPiPPFswtIlA/Fs1MzdKYA7JApHU49zQTbJGX3PDmCpIdDBRQ==", + "dev": true + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cors": { + "version": "2.8.13", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", + "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.33", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz", + "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "node_modules/@types/jsonwebtoken": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz", + "integrity": "sha512-c5ltxazpWabia/4UzhIoaDcIza4KViOQhdbjRlfcIGVnsE3c3brkz9Z+F/EeJIECOQP7W7US2hNE930cWWkPiw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/knex": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@types/knex/-/knex-0.16.1.tgz", + "integrity": "sha512-54gWD1HWwdVx5iLHaJ1qxH3I6KyBsj5fFqzRpXFn7REWiEB2jwspeVCombNsocSrqPd7IRPqKrsIME7/cD+TFQ==", + "deprecated": "This is a stub types definition. knex provides its own type definitions, so you do not need this installed.", + "dev": true, + "dependencies": { + "knex": "*" + } + }, + "node_modules/@types/mime": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", + "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.15.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.0.tgz", + "integrity": "sha512-z6nr0TTEOBGkzLGmbypWOGnpSpSIBorEhC4L+4HeQ2iezKCi4f77kyslRwvHeNitymGQ+oFyIWGP96l/DPSV9w==" + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "node_modules/@types/serve-static": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", + "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", + "dev": true, + "dependencies": { + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ==", + "dev": true + }, + "node_modules/@types/strip-json-comments": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", + "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", + "dev": true + }, + "node_modules/@types/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-rFT3ak0/2trgvp4yYZo5iKFEPsET7vKydKF+VRCxlQ9bpheehyAJH89dAkaLEq/j/RZXJIqcgsmPJKUP1Z28HA==" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/bcryptjs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", + "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==" + }, + "node_modules/bignumber.js": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", + "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==" + }, + "node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dotenv": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/dynamic-dedupe": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz", + "integrity": "sha512-ssuANeD+z97meYOqd50e04Ze5qp4bPqo8cCkI4TRjZkzAUgIDTrXV1R8QCdINpiI+hw14+rYazvTRdQrz0/rFQ==", + "dev": true, + "dependencies": { + "xtend": "^4.0.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/getopts": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.3.0.tgz", + "integrity": "sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA==" + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "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" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/knex": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/knex/-/knex-2.4.2.tgz", + "integrity": "sha512-tMI1M7a+xwHhPxjbl/H9K1kHX+VncEYcvCx5K00M16bWvpYPKAZd6QrCu68PtHAdIZNQPWZn0GVhqVBEthGWCg==", + "dependencies": { + "colorette": "2.0.19", + "commander": "^9.1.0", + "debug": "4.3.4", + "escalade": "^3.1.1", + "esm": "^3.2.25", + "get-package-type": "^0.1.0", + "getopts": "2.3.0", + "interpret": "^2.2.0", + "lodash": "^4.17.21", + "pg-connection-string": "2.5.0", + "rechoir": "^0.8.0", + "resolve-from": "^5.0.0", + "tarn": "^3.0.2", + "tildify": "2.0.0" + }, + "bin": { + "knex": "bin/cli.js" + }, + "engines": { + "node": ">=12" + }, + "peerDependenciesMeta": { + "better-sqlite3": { + "optional": true + }, + "mysql": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "pg": { + "optional": true + }, + "pg-native": { + "optional": true + }, + "sqlite3": { + "optional": true + }, + "tedious": { + "optional": true + } + } + }, + "node_modules/knex/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/knex/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/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/mysql": { + "version": "2.18.1", + "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz", + "integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==", + "dependencies": { + "bignumber.js": "9.0.0", + "readable-stream": "2.3.7", + "safe-buffer": "5.1.2", + "sqlstring": "2.3.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mysql/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "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" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/pg-connection-string": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", + "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" + }, + "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" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/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==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sqlstring": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", + "integrity": "sha512-ooAzh/7dxIG5+uDik1z/Rd1vli0+38izZhGzSa34FwR7IbelPWCCKSNIl8jlL/F7ERvy8CB2jNeM1E9i9mXMAQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tarn": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz", + "integrity": "sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/tildify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tildify/-/tildify-2.0.0.tgz", + "integrity": "sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/to-regex-range": { + "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" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node-dev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-2.0.0.tgz", + "integrity": "sha512-ywMrhCfH6M75yftYvrvNarLEY+SUXtUvU8/0Z6llrHQVBx12GiFk5sStF8UdfE/yfzk9IAq7O5EEbTQsxlBI8w==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.1", + "dynamic-dedupe": "^0.3.0", + "minimist": "^1.2.6", + "mkdirp": "^1.0.4", + "resolve": "^1.0.0", + "rimraf": "^2.6.1", + "source-map-support": "^0.5.12", + "tree-kill": "^1.2.2", + "ts-node": "^10.4.0", + "tsconfig": "^7.0.0" + }, + "bin": { + "ts-node-dev": "lib/bin.js", + "tsnd": "lib/bin.js" + }, + "engines": { + "node": ">=0.8.0" + }, + "peerDependencies": { + "node-notifier": "*", + "typescript": "*" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/tsconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", + "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", + "dev": true, + "dependencies": { + "@types/strip-bom": "^3.0.0", + "@types/strip-json-comments": "0.0.30", + "strip-bom": "^3.0.0", + "strip-json-comments": "^2.0.0" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "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 + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + } + }, + "dependencies": { + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "dev": true + }, + "@types/bcryptjs": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.2.tgz", + "integrity": "sha512-LiMQ6EOPob/4yUL66SZzu6Yh77cbzJFYll+ZfaPiPPFswtIlA/Fs1MzdKYA7JApHU49zQTbJGX3PDmCpIdDBRQ==", + "dev": true + }, + "@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/cors": { + "version": "2.8.13", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", + "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "dev": true, + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.33", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz", + "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "@types/jsonwebtoken": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz", + "integrity": "sha512-c5ltxazpWabia/4UzhIoaDcIza4KViOQhdbjRlfcIGVnsE3c3brkz9Z+F/EeJIECOQP7W7US2hNE930cWWkPiw==", + "requires": { + "@types/node": "*" + } + }, + "@types/knex": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@types/knex/-/knex-0.16.1.tgz", + "integrity": "sha512-54gWD1HWwdVx5iLHaJ1qxH3I6KyBsj5fFqzRpXFn7REWiEB2jwspeVCombNsocSrqPd7IRPqKrsIME7/cD+TFQ==", + "dev": true, + "requires": { + "knex": "*" + } + }, + "@types/mime": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", + "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", + "dev": true + }, + "@types/node": { + "version": "18.15.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.0.tgz", + "integrity": "sha512-z6nr0TTEOBGkzLGmbypWOGnpSpSIBorEhC4L+4HeQ2iezKCi4f77kyslRwvHeNitymGQ+oFyIWGP96l/DPSV9w==" + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "@types/serve-static": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", + "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", + "dev": true, + "requires": { + "@types/mime": "*", + "@types/node": "*" + } + }, + "@types/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ==", + "dev": true + }, + "@types/strip-json-comments": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", + "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", + "dev": true + }, + "@types/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-rFT3ak0/2trgvp4yYZo5iKFEPsET7vKydKF+VRCxlQ9bpheehyAJH89dAkaLEq/j/RZXJIqcgsmPJKUP1Z28HA==" + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "dev": true + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "bcryptjs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", + "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==" + }, + "bignumber.js": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", + "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==" + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==" + }, + "commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "requires": { + "safe-buffer": "5.2.1" + } + }, + "content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" + }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "dotenv": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==" + }, + "dynamic-dedupe": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz", + "integrity": "sha512-ssuANeD+z97meYOqd50e04Ze5qp4bPqo8cCkI4TRjZkzAUgIDTrXV1R8QCdINpiI+hw14+rYazvTRdQrz0/rFQ==", + "dev": true, + "requires": { + "xtend": "^4.0.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + }, + "express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==" + }, + "getopts": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.3.0.tgz", + "integrity": "sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==" + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "requires": { + "has": "^1.0.3" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "knex": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/knex/-/knex-2.4.2.tgz", + "integrity": "sha512-tMI1M7a+xwHhPxjbl/H9K1kHX+VncEYcvCx5K00M16bWvpYPKAZd6QrCu68PtHAdIZNQPWZn0GVhqVBEthGWCg==", + "requires": { + "colorette": "2.0.19", + "commander": "^9.1.0", + "debug": "4.3.4", + "escalade": "^3.1.1", + "esm": "^3.2.25", + "get-package-type": "^0.1.0", + "getopts": "2.3.0", + "interpret": "^2.2.0", + "lodash": "^4.17.21", + "pg-connection-string": "2.5.0", + "rechoir": "^0.8.0", + "resolve-from": "^5.0.0", + "tarn": "^3.0.2", + "tildify": "2.0.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "mysql": { + "version": "2.18.1", + "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz", + "integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==", + "requires": { + "bignumber.js": "9.0.0", + "readable-stream": "2.3.7", + "safe-buffer": "5.1.2", + "sqlstring": "2.3.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "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, + "requires": { + "wrappy": "1" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "pg-connection-string": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", + "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "requires": { + "resolve": "^1.20.0" + } + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "sqlstring": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", + "integrity": "sha512-ooAzh/7dxIG5+uDik1z/Rd1vli0+38izZhGzSa34FwR7IbelPWCCKSNIl8jlL/F7ERvy8CB2jNeM1E9i9mXMAQ==" + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "tarn": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz", + "integrity": "sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==" + }, + "tildify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tildify/-/tildify-2.0.0.tgz", + "integrity": "sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==" + }, + "to-regex-range": { + "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, + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, + "tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true + }, + "ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "requires": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + } + }, + "ts-node-dev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-2.0.0.tgz", + "integrity": "sha512-ywMrhCfH6M75yftYvrvNarLEY+SUXtUvU8/0Z6llrHQVBx12GiFk5sStF8UdfE/yfzk9IAq7O5EEbTQsxlBI8w==", + "dev": true, + "requires": { + "chokidar": "^3.5.1", + "dynamic-dedupe": "^0.3.0", + "minimist": "^1.2.6", + "mkdirp": "^1.0.4", + "resolve": "^1.0.0", + "rimraf": "^2.6.1", + "source-map-support": "^0.5.12", + "tree-kill": "^1.2.2", + "ts-node": "^10.4.0", + "tsconfig": "^7.0.0" + } + }, + "tsconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", + "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", + "dev": true, + "requires": { + "@types/strip-bom": "^3.0.0", + "@types/strip-json-comments": "0.0.30", + "strip-bom": "^3.0.0", + "strip-json-comments": "^2.0.0" + } + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" + }, + "uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" + }, + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + }, + "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 + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..fec853e --- /dev/null +++ b/package.json @@ -0,0 +1,36 @@ +{ + "name": "lama-template", + "version": "1.0.0", + "description": "Projeto LAMA", + "main": "index.js", + "scripts": { + "dev": "ts-node-dev ./src/index.ts", + "start": "tsc && node ./build/index.js" + }, + "keywords": [ + "api", + "LAMA" + ], + "author": "Israel,Andréa,Júnior e Fay", + "license": "ISC", + "dependencies": { + "@types/jsonwebtoken": "^9.0.1", + "@types/node": "^18.15.0", + "@types/uuid": "^9.0.1", + "bcryptjs": "^2.4.3", + "dotenv": "^16.0.3", + "express": "^4.18.2", + "knex": "^2.4.2", + "mysql": "^2.18.1", + "typescript": "^4.9.5", + "uuid": "^9.0.0" + }, + "devDependencies": { + "@types/bcryptjs": "^2.4.2", + "@types/cors": "^2.8.13", + "@types/express": "^4.17.17", + "@types/knex": "^0.16.1", + "cors": "^2.8.5", + "ts-node-dev": "^2.0.0" + } +} diff --git a/src/business/UserBusiness.ts b/src/business/UserBusiness.ts new file mode 100644 index 0000000..b645a82 --- /dev/null +++ b/src/business/UserBusiness.ts @@ -0,0 +1,43 @@ +import { UserInputDTO, LoginInputDTO } from "../model/User"; +import { UserDatabase } from "../data/UserDatabase"; +import { IdGenerator } from "../services/IdGenerator"; +import { HashManager } from "../services/HashManager"; +import { Authenticator } from "../services/Authenticator"; + +export class UserBusiness { + + async createUser(user: UserInputDTO) { + + const idGenerator = new IdGenerator(); + const id = idGenerator.generate(); + + const hashManager = new HashManager(); + const hashPassword = await hashManager.hash(user.password); + + const userDatabase = new UserDatabase(); + await userDatabase.createUser(id, user.email, user.name, hashPassword, user.role); + + const authenticator = new Authenticator(); + const accessToken = authenticator.generateToken({ id, role: user.role }); + + return accessToken; + } + + async getUserByEmail(user: LoginInputDTO) { + + const userDatabase = new UserDatabase(); + const userFromDB = await userDatabase.getUserByEmail(user.email); + + const hashManager = new HashManager(); + const hashCompare = await hashManager.compare(user.password, userFromDB.getPassword()); + + const authenticator = new Authenticator(); + const accessToken = authenticator.generateToken({ id: userFromDB.getId(), role: userFromDB.getRole() }); + + if (!hashCompare) { + throw new Error("Invalid Password!"); + } + + return accessToken; + } +} \ No newline at end of file diff --git a/src/controller/UserController.ts b/src/controller/UserController.ts new file mode 100644 index 0000000..f0139c0 --- /dev/null +++ b/src/controller/UserController.ts @@ -0,0 +1,50 @@ +import { Request, Response } from "express"; +import { UserInputDTO, LoginInputDTO} from "../model/User"; +import { UserBusiness } from "../business/UserBusiness"; +import { BaseDatabase } from "../data/BaseDatabase"; + +export class UserController { + async signup(req: Request, res: Response) { + try { + + const input: UserInputDTO = { + email: req.body.email, + name: req.body.name, + password: req.body.password, + role: req.body.role + } + + const userBusiness = new UserBusiness(); + const token = await userBusiness.createUser(input); + + res.status(200).send({ token }); + + } catch (error:any) { + res.status(400).send({ error: error.message }); + } + + await BaseDatabase.destroyConnection(); + } + + async login(req: Request, res: Response) { + + try { + + const loginData: LoginInputDTO = { + email: req.body.email, + password: req.body.password + }; + + const userBusiness = new UserBusiness(); + const token = await userBusiness.getUserByEmail(loginData); + + res.status(200).send({ token }); + + } catch (error:any) { + res.status(400).send({ error: error.message }); + } + + await BaseDatabase.destroyConnection(); + } + +} \ No newline at end of file diff --git a/src/data/BaseDatabase.ts b/src/data/BaseDatabase.ts new file mode 100644 index 0000000..5a36830 --- /dev/null +++ b/src/data/BaseDatabase.ts @@ -0,0 +1,30 @@ +import knex, { Knex } from "knex"; + +export abstract class BaseDatabase { + + private static connection: Knex | null = null; + + protected getConnection(): Knex{ + if(!BaseDatabase.connection){ + BaseDatabase.connection = knex({ + client: "mysql", + connection: { + host: process.env.DB_HOST, + port: 3306, + user: process.env.DB_USER, + password: process.env.DB_PASSWORD, + database: process.env.DB_DATABASE_NAME, + }, + }); + } + + return BaseDatabase.connection; + } + + public static async destroyConnection(): Promise{ + if(BaseDatabase.connection){ + await BaseDatabase.connection.destroy(); + BaseDatabase.connection = null; + } + } +} \ No newline at end of file diff --git a/src/data/UserDatabase.ts b/src/data/UserDatabase.ts new file mode 100644 index 0000000..f014722 --- /dev/null +++ b/src/data/UserDatabase.ts @@ -0,0 +1,39 @@ +import { BaseDatabase } from "./BaseDatabase"; +import { User } from "../model/User"; + +export class UserDatabase extends BaseDatabase { + + private static TABLE_NAME = ""; + + public async createUser( + id: string, + email: string, + name: string, + password: string, + role: string + ): Promise { + try { + await this.getConnection() + .insert({ + id, + email, + name, + password, + role + }) + .into(UserDatabase.TABLE_NAME); + } catch (error:any) { + throw new Error(error.sqlMessage || error.message); + } + } + + public async getUserByEmail(email: string): Promise { + const result = await this.getConnection() + .select("*") + .from(UserDatabase.TABLE_NAME) + .where({ email }); + + return User.toUserModel(result[0]); + } + +} diff --git a/src/error/BaseError.ts b/src/error/BaseError.ts new file mode 100644 index 0000000..d221001 --- /dev/null +++ b/src/error/BaseError.ts @@ -0,0 +1,6 @@ +export abstract class BaseError extends Error { + constructor(message: string, public code: number) { + super(message); + } + } + \ No newline at end of file diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..3d82c68 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,19 @@ +import dotenv from "dotenv"; +import {AddressInfo} from "net"; +import express from "express"; +import { userRouter } from "./routes/userRouter"; +dotenv.config(); +const app = express(); + +app.use(express.json()); + +app.use("/user", userRouter); + +const server = app.listen(3000, () => { + if (server) { + const address = server.address() as AddressInfo; + console.log(`Servidor rodando em http://localhost:${address.port}`); + } else { + console.error(`Falha ao rodar o servidor.`); + } + }); \ No newline at end of file diff --git a/src/model/User.ts b/src/model/User.ts new file mode 100644 index 0000000..9143a6a --- /dev/null +++ b/src/model/User.ts @@ -0,0 +1,83 @@ +export class User{ + constructor( + private id: string, + private name: string, + private email: string, + private password: string, + private role: UserRole + ){} + + getId(){ + return this.id; + } + + getName(){ + return this.name + } + + getEmail(){ + return this.email; + } + + getPassword(){ + return this.password; + } + + getRole(){ + return this.role; + } + + setId(id: string){ + this.id = id; + } + + setName(name: string){ + this.name = name; + } + + setEmail(email: string){ + this.email = email; + } + + setPassword(password: string){ + this.password = password; + } + + setRole(role: UserRole){ + this.role = role; + } + + static stringToUserRole(input: string): UserRole{ + switch (input) { + case "NORMAL": + return UserRole.NORMAL; + case "ADMIN": + return UserRole.ADMIN; + default: + throw new Error("Invalid user role"); + } + } + + static toUserModel(user: any): User { + return new User(user.id, user.name, user.email, user.password, User.stringToUserRole(user.role)); + } + + +} + +export interface UserInputDTO{ + email: string; + password: string; + name: string; + role: string; +} + +export interface LoginInputDTO{ + email: string; + password: string; +} + +export enum UserRole{ + NORMAL = "NORMAL", + ADMIN = "ADMIN" +} \ No newline at end of file diff --git a/src/routes/userRouter.ts b/src/routes/userRouter.ts new file mode 100644 index 0000000..1b56d3a --- /dev/null +++ b/src/routes/userRouter.ts @@ -0,0 +1,10 @@ +import express from "express"; +import { UserController } from "../controller/UserController"; + + +export const userRouter = express.Router(); + +const userController = new UserController(); + +userRouter.post("/signup", userController.signup); +userRouter.post("/login", userController.login); \ No newline at end of file diff --git a/src/services/Authenticator.ts b/src/services/Authenticator.ts new file mode 100644 index 0000000..d21c80d --- /dev/null +++ b/src/services/Authenticator.ts @@ -0,0 +1,32 @@ +import * as jwt from "jsonwebtoken"; + +export class Authenticator { + public generateToken(input: AuthenticationData, + expiresIn: string = process.env.ACCESS_TOKEN_EXPIRES_IN!): string { + const token = jwt.sign( + { + id: input.id, + role: input.role + }, + process.env.JWT_KEY as string, + { + expiresIn, + } + ); + return token; + } + + public getData(token: string): AuthenticationData { + const payload = jwt.verify(token, process.env.JWT_KEY as string) as any; + const result = { + id: payload.id, + role: payload.role + }; + return result; + } +} + +interface AuthenticationData { + id: string; + role?: string; +} \ No newline at end of file diff --git a/src/services/HashManager.ts b/src/services/HashManager.ts new file mode 100644 index 0000000..45704fb --- /dev/null +++ b/src/services/HashManager.ts @@ -0,0 +1,17 @@ +import * as bcrypt from "bcryptjs"; + + +export class HashManager { + + public async hash(text: string): Promise { + const rounds = 12; + const salt = await bcrypt.genSalt(rounds); + const result = await bcrypt.hash(text, salt); + return result; + } + + public async compare(text: string, hash: string): Promise{ + return await bcrypt.compare(text, hash); + } + +} \ No newline at end of file diff --git a/src/services/IdGenerator.ts b/src/services/IdGenerator.ts new file mode 100644 index 0000000..8dc2b8a --- /dev/null +++ b/src/services/IdGenerator.ts @@ -0,0 +1,8 @@ +import { v4 } from "uuid"; + +export class IdGenerator{ + + generate(): string{ + return v4(); + } +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..670c373 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "es6", + "module": "commonjs", + "outDir": "./build", + "rootDir": "./src", + "removeComments": true, + "strict": true, + "noImplicitAny": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true + } +} From c2c5034f56b01b9f355cb42b511daf956d07fbd5 Mon Sep 17 00:00:00 2001 From: carolinemartins Date: Sat, 11 Mar 2023 13:21:21 -0300 Subject: [PATCH 02/31] git ignore subiu .env --- .env | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 .env diff --git a/.env b/.env deleted file mode 100644 index 1592433..0000000 --- a/.env +++ /dev/null @@ -1,8 +0,0 @@ -DB_USER = "4416152-caroline-martins" -DB_PASSWORD = "YH1fV093Kl57DXfCnDFY" -DB_HOST = 35.226.146.116 -DB_PORT = 3306 -DB_DATABASE_NAME = "jbl-4416152-caroline-martins" -BCRYPT_COST= 12 -JWT_KEY = "caroline" -ACCESS_TOKEN_EXPIRES_IN = 60min \ No newline at end of file From c344ca16e7d820e5f3cf2d82aee0186f5a5052d8 Mon Sep 17 00:00:00 2001 From: carolinemartins Date: Sat, 11 Mar 2023 14:24:01 -0300 Subject: [PATCH 03/31] erro com request --- package-lock.json | 166 ++++++++++++++++++++++++++++++- package.json | 5 +- querys.sql | 24 +++++ request.rest | 13 +++ src/business/UserBusiness.ts | 72 ++++++++++---- src/controller/UserController.ts | 49 ++++----- src/data/UserDatabase.ts | 14 +-- src/error/BaseError.ts | 9 +- src/index.ts | 16 +-- src/model/User.ts | 6 ++ src/routes/userRouter.ts | 5 +- src/services/Authenticator.ts | 37 +++++-- src/services/HashManager.ts | 2 +- tsconfig.json | 2 +- 14 files changed, 336 insertions(+), 84 deletions(-) create mode 100644 querys.sql create mode 100644 request.rest diff --git a/package-lock.json b/package-lock.json index ccb03cd..383e611 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,12 +9,11 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "@types/jsonwebtoken": "^9.0.1", "@types/node": "^18.15.0", - "@types/uuid": "^9.0.1", "bcryptjs": "^2.4.3", "dotenv": "^16.0.3", "express": "^4.18.2", + "jsonwebtoken": "^9.0.0", "knex": "^2.4.2", "mysql": "^2.18.1", "typescript": "^4.9.5", @@ -24,7 +23,9 @@ "@types/bcryptjs": "^2.4.2", "@types/cors": "^2.8.13", "@types/express": "^4.17.17", + "@types/jsonwebtoken": "^9.0.1", "@types/knex": "^0.16.1", + "@types/uuid": "^9.0.1", "cors": "^2.8.5", "ts-node-dev": "^2.0.0" } @@ -151,6 +152,7 @@ "version": "9.0.1", "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz", "integrity": "sha512-c5ltxazpWabia/4UzhIoaDcIza4KViOQhdbjRlfcIGVnsE3c3brkz9Z+F/EeJIECOQP7W7US2hNE930cWWkPiw==", + "dev": true, "dependencies": { "@types/node": "*" } @@ -213,7 +215,8 @@ "node_modules/@types/uuid": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-rFT3ak0/2trgvp4yYZo5iKFEPsET7vKydKF+VRCxlQ9bpheehyAJH89dAkaLEq/j/RZXJIqcgsmPJKUP1Z28HA==" + "integrity": "sha512-rFT3ak0/2trgvp4yYZo5iKFEPsET7vKydKF+VRCxlQ9bpheehyAJH89dAkaLEq/j/RZXJIqcgsmPJKUP1Z28HA==", + "dev": true }, "node_modules/accepts": { "version": "1.3.8", @@ -345,6 +348,11 @@ "node": ">=8" } }, + "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==" + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -524,6 +532,14 @@ "xtend": "^4.0.0" } }, + "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==", + "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", @@ -872,6 +888,45 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, + "node_modules/jsonwebtoken": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", + "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==", + "dependencies": { + "jws": "^3.2.2", + "lodash": "^4.17.21", + "ms": "^2.1.1", + "semver": "^7.3.8" + }, + "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==" + }, + "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==", + "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==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, "node_modules/knex": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/knex/-/knex-2.4.2.tgz", @@ -948,6 +1003,17 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -1315,6 +1381,20 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", @@ -1668,6 +1748,11 @@ "node": ">=0.4" } }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", @@ -1795,6 +1880,7 @@ "version": "9.0.1", "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz", "integrity": "sha512-c5ltxazpWabia/4UzhIoaDcIza4KViOQhdbjRlfcIGVnsE3c3brkz9Z+F/EeJIECOQP7W7US2hNE930cWWkPiw==", + "dev": true, "requires": { "@types/node": "*" } @@ -1856,7 +1942,8 @@ "@types/uuid": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-rFT3ak0/2trgvp4yYZo5iKFEPsET7vKydKF+VRCxlQ9bpheehyAJH89dAkaLEq/j/RZXJIqcgsmPJKUP1Z28HA==" + "integrity": "sha512-rFT3ak0/2trgvp4yYZo5iKFEPsET7vKydKF+VRCxlQ9bpheehyAJH89dAkaLEq/j/RZXJIqcgsmPJKUP1Z28HA==", + "dev": true }, "accepts": { "version": "1.3.8", @@ -1960,6 +2047,11 @@ "fill-range": "^7.0.1" } }, + "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==" + }, "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -2094,6 +2186,14 @@ "xtend": "^4.0.0" } }, + "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==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -2357,6 +2457,43 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, + "jsonwebtoken": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", + "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==", + "requires": { + "jws": "^3.2.2", + "lodash": "^4.17.21", + "ms": "^2.1.1", + "semver": "^7.3.8" + }, + "dependencies": { + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "requires": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, "knex": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/knex/-/knex-2.4.2.tgz", @@ -2398,6 +2535,14 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, "make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -2662,6 +2807,14 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "requires": { + "lru-cache": "^6.0.0" + } + }, "send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", @@ -2911,6 +3064,11 @@ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", diff --git a/package.json b/package.json index fec853e..1bfdefe 100644 --- a/package.json +++ b/package.json @@ -14,12 +14,11 @@ "author": "Israel,Andréa,Júnior e Fay", "license": "ISC", "dependencies": { - "@types/jsonwebtoken": "^9.0.1", "@types/node": "^18.15.0", - "@types/uuid": "^9.0.1", "bcryptjs": "^2.4.3", "dotenv": "^16.0.3", "express": "^4.18.2", + "jsonwebtoken": "^9.0.0", "knex": "^2.4.2", "mysql": "^2.18.1", "typescript": "^4.9.5", @@ -29,7 +28,9 @@ "@types/bcryptjs": "^2.4.2", "@types/cors": "^2.8.13", "@types/express": "^4.17.17", + "@types/jsonwebtoken": "^9.0.1", "@types/knex": "^0.16.1", + "@types/uuid": "^9.0.1", "cors": "^2.8.5", "ts-node-dev": "^2.0.0" } diff --git a/querys.sql b/querys.sql new file mode 100644 index 0000000..fa0b65b --- /dev/null +++ b/querys.sql @@ -0,0 +1,24 @@ +-- Active: 1674084192186@@35.226.146.116@3306@jbl-4416152-caroline-martins +CREATE TABLE IF NOT EXISTS bands ( + id VARCHAR(255) PRIMARY KEY, + name VARCHAR(255) UNIQUE NOT NULL, + music_genre VARCHAR(255) NOT NULL, + responsible VARCHAR(255) UNIQUE NOT NULL +); + +CREATE TABLE IF NOT EXISTS shows ( + id VARCHAR(255) PRIMARY KEY, + week_day VARCHAR(255) NOT NULL, + start_time INT NOT NULL, + end_time INT NOT NULL, + band_id VARCHAR(255) NOT NULL, + FOREIGN KEY(band_id) REFERENCES bands(id) +); + +CREATE TABLE IF NOT EXISTS users_shows ( + id VARCHAR(255) PRIMARY KEY, + name VARCHAR(255) NOT NULL, + email VARCHAR(255) NOT NULL UNIQUE, + password VARCHAR(255) NOT NULL, + role VARCHAR(255) NOT NULL DEFAULT "NORMAL" +) \ No newline at end of file diff --git a/request.rest b/request.rest new file mode 100644 index 0000000..12113f0 --- /dev/null +++ b/request.rest @@ -0,0 +1,13 @@ +POST http://localhost:3003/user/create +Content-Type: application/json + +{ + "email": "bananinha@gmail.com", + "name": "Bananinha", + "password": "123456", + "role": "ADMIN" + +} + +### + diff --git a/src/business/UserBusiness.ts b/src/business/UserBusiness.ts index b645a82..64856df 100644 --- a/src/business/UserBusiness.ts +++ b/src/business/UserBusiness.ts @@ -3,41 +3,69 @@ import { UserDatabase } from "../data/UserDatabase"; import { IdGenerator } from "../services/IdGenerator"; import { HashManager } from "../services/HashManager"; import { Authenticator } from "../services/Authenticator"; +import { CustomError } from "../error/BaseError"; +const idGenerator = new IdGenerator(); +const hashManager = new HashManager(); +const userDatabase = new UserDatabase(); +const authenticator = new Authenticator(); export class UserBusiness { - async createUser(user: UserInputDTO) { + public async createUser({ email, name, password, role }: UserInputDTO) { + try { +console.log(email,name,password,role); - const idGenerator = new IdGenerator(); - const id = idGenerator.generate(); - const hashManager = new HashManager(); - const hashPassword = await hashManager.hash(user.password); + if (!name || !email || !password) { + throw new CustomError(400, 'Fill in the fields "name", "email" and "password"'); + } + if (name.length < 3) { + throw new CustomError(400, 'Very short name'); + } - const userDatabase = new UserDatabase(); - await userDatabase.createUser(id, user.email, user.name, hashPassword, user.role); + if (password.length <= 6) { + throw new CustomError(400, 'Invalid password'); + } + if (!email.includes("@")) { + throw new CustomError(400, "Invalid email address"); + } - const authenticator = new Authenticator(); - const accessToken = authenticator.generateToken({ id, role: user.role }); + const id = idGenerator.generate(); - return accessToken; + const hashPassword = await hashManager.hashGenerator(password); + + await userDatabase.createUser( + id, + email, + name, + password = hashPassword, + role + ); + + const accessToken = authenticator.generateToken({ id, role: role }); + + return accessToken; + + } catch (error: any) { + throw new CustomError(400, error.message); + } } - async getUserByEmail(user: LoginInputDTO) { + // async getUserByEmail(user: LoginInputDTO) { - const userDatabase = new UserDatabase(); - const userFromDB = await userDatabase.getUserByEmail(user.email); + // const userDatabase = new UserDatabase(); + // const userFromDB = await userDatabase.getUserByEmail(user.email); - const hashManager = new HashManager(); - const hashCompare = await hashManager.compare(user.password, userFromDB.getPassword()); + // const hashManager = new HashManager(); + // const hashCompare = await hashManager.compare(user.password, userFromDB.getPassword()); - const authenticator = new Authenticator(); - const accessToken = authenticator.generateToken({ id: userFromDB.getId(), role: userFromDB.getRole() }); + // const authenticator = new Authenticator(); + // const accessToken = authenticator.generateToken({ id: userFromDB.getId(), role: userFromDB.getRole() }); - if (!hashCompare) { - throw new Error("Invalid Password!"); - } + // if (!hashCompare) { + // throw new Error("Invalid Password!"); + // } - return accessToken; - } + // return accessToken; + // } } \ No newline at end of file diff --git a/src/controller/UserController.ts b/src/controller/UserController.ts index f0139c0..4601e16 100644 --- a/src/controller/UserController.ts +++ b/src/controller/UserController.ts @@ -1,50 +1,53 @@ import { Request, Response } from "express"; -import { UserInputDTO, LoginInputDTO} from "../model/User"; +import { UserInputDTO, LoginInputDTO } from "../model/User"; import { UserBusiness } from "../business/UserBusiness"; import { BaseDatabase } from "../data/BaseDatabase"; +const userBusiness = new UserBusiness(); export class UserController { - async signup(req: Request, res: Response) { + + public async createUser(req: Request, res: Response) { try { + const { email, name, password, role } = req.body const input: UserInputDTO = { - email: req.body.email, - name: req.body.name, - password: req.body.password, - role: req.body.role + email, + name, + password, + role } - const userBusiness = new UserBusiness(); + const token = await userBusiness.createUser(input); res.status(200).send({ token }); - } catch (error:any) { + } catch (error: any) { res.status(400).send({ error: error.message }); } - await BaseDatabase.destroyConnection(); + // await BaseDatabase.destroyConnection(); } - async login(req: Request, res: Response) { + // async login(req: Request, res: Response) { - try { + // try { - const loginData: LoginInputDTO = { - email: req.body.email, - password: req.body.password - }; + // const loginData: LoginInputDTO = { + // email: req.body.email, + // password: req.body.password + // }; - const userBusiness = new UserBusiness(); - const token = await userBusiness.getUserByEmail(loginData); + // const userBusiness = new UserBusiness(); + // const token = await userBusiness.getUserByEmail(loginData); - res.status(200).send({ token }); + // res.status(200).send({ token }); - } catch (error:any) { - res.status(400).send({ error: error.message }); - } + // } catch (error: any) { + // res.status(400).send({ error: error.message }); + // } - await BaseDatabase.destroyConnection(); - } + // await BaseDatabase.destroyConnection(); + // } } \ No newline at end of file diff --git a/src/data/UserDatabase.ts b/src/data/UserDatabase.ts index f014722..8b6d751 100644 --- a/src/data/UserDatabase.ts +++ b/src/data/UserDatabase.ts @@ -3,17 +3,11 @@ import { User } from "../model/User"; export class UserDatabase extends BaseDatabase { - private static TABLE_NAME = ""; + private static TABLE_NAME = "users_shows"; - public async createUser( - id: string, - email: string, - name: string, - password: string, - role: string - ): Promise { + public async createUser(id: string, email: string, name: string,password: string,role: string): Promise { try { - await this.getConnection() + const result =await this.getConnection() .insert({ id, email, @@ -22,6 +16,8 @@ export class UserDatabase extends BaseDatabase { role }) .into(UserDatabase.TABLE_NAME); + console.log(result); + } catch (error:any) { throw new Error(error.sqlMessage || error.message); } diff --git a/src/error/BaseError.ts b/src/error/BaseError.ts index d221001..79da73d 100644 --- a/src/error/BaseError.ts +++ b/src/error/BaseError.ts @@ -1,6 +1,5 @@ -export abstract class BaseError extends Error { - constructor(message: string, public code: number) { - super(message); - } +export class CustomError extends Error { + constructor(statusCode: number, message: string){ + super(message) } - \ No newline at end of file +} \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 3d82c68..cc0bae3 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,5 @@ import dotenv from "dotenv"; -import {AddressInfo} from "net"; +import { AddressInfo } from "net"; import express from "express"; import { userRouter } from "./routes/userRouter"; dotenv.config(); @@ -10,10 +10,10 @@ app.use(express.json()); app.use("/user", userRouter); const server = app.listen(3000, () => { - if (server) { - const address = server.address() as AddressInfo; - console.log(`Servidor rodando em http://localhost:${address.port}`); - } else { - console.error(`Falha ao rodar o servidor.`); - } - }); \ No newline at end of file + if (server) { + const address = server.address() as AddressInfo; + console.log(`Servidor rodando em http://localhost:${address.port}`); + } else { + console.error(`Falha ao rodar o servidor.`); + } +}); \ No newline at end of file diff --git a/src/model/User.ts b/src/model/User.ts index 9143a6a..c801c51 100644 --- a/src/model/User.ts +++ b/src/model/User.ts @@ -64,6 +64,12 @@ export class User{ } +export interface UserDTO { + id: string, + name: string, + email: string, + password: string +} export interface UserInputDTO{ email: string; diff --git a/src/routes/userRouter.ts b/src/routes/userRouter.ts index 1b56d3a..51b2e0e 100644 --- a/src/routes/userRouter.ts +++ b/src/routes/userRouter.ts @@ -6,5 +6,6 @@ export const userRouter = express.Router(); const userController = new UserController(); -userRouter.post("/signup", userController.signup); -userRouter.post("/login", userController.login); \ No newline at end of file +userRouter.post("/create", userController.createUser); + +// userRouter.post("/login", userController.login); \ No newline at end of file diff --git a/src/services/Authenticator.ts b/src/services/Authenticator.ts index d21c80d..019dbef 100644 --- a/src/services/Authenticator.ts +++ b/src/services/Authenticator.ts @@ -1,5 +1,9 @@ -import * as jwt from "jsonwebtoken"; +import * as jwt from "jsonwebtoken" +interface AuthenticationData { + id: string; + role?: string; +} export class Authenticator { public generateToken(input: AuthenticationData, expiresIn: string = process.env.ACCESS_TOKEN_EXPIRES_IN!): string { @@ -10,14 +14,15 @@ export class Authenticator { }, process.env.JWT_KEY as string, { - expiresIn, + expiresIn } ); return token; } public getData(token: string): AuthenticationData { - const payload = jwt.verify(token, process.env.JWT_KEY as string) as any; + const payload = jwt.verify( + token, process.env.JWT_KEY as string) as any; const result = { id: payload.id, role: payload.role @@ -26,7 +31,25 @@ export class Authenticator { } } -interface AuthenticationData { - id: string; - role?: string; -} \ No newline at end of file + + +// export class Authenticator { + +// public generateToken = ({ id , role}: AuthenticationData) => { +// const token = jwt.sign( +// { id, role }, +// process.env.JWT_KEY as string, +// { expiresIn: "4h" } +// ) +// return token +// } + +// public tokenData = (token: string): AuthenticationData => { +// const payload = jwt.verify( +// token, +// process.env.JWT_KEY as string +// ) as jwt.JwtPayload + +// return { id: payload.id as string, role: payload.role as string } +// } +// } \ No newline at end of file diff --git a/src/services/HashManager.ts b/src/services/HashManager.ts index 45704fb..53d4568 100644 --- a/src/services/HashManager.ts +++ b/src/services/HashManager.ts @@ -3,7 +3,7 @@ import * as bcrypt from "bcryptjs"; export class HashManager { - public async hash(text: string): Promise { + public async hashGenerator(text: string): Promise { const rounds = 12; const salt = await bcrypt.genSalt(rounds); const result = await bcrypt.hash(text, salt); diff --git a/tsconfig.json b/tsconfig.json index 670c373..2b9a0c4 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,5 +1,5 @@ { - "compilerOptions": { + "compilerOptions": { "target": "es6", "module": "commonjs", "outDir": "./build", From 1eab2bf38a2d224c56350289db154351f9aa8d48 Mon Sep 17 00:00:00 2001 From: carolinemartins Date: Sat, 11 Mar 2023 14:53:13 -0300 Subject: [PATCH 04/31] login e testes funcionando --- request.rest | 8 ++- src/business/UserBusiness.ts | 36 ++++++++++- src/controller/UserController.ts | 29 +++++---- src/data/UserDatabase.ts | 2 +- src/index.ts | 2 +- src/model/User.ts | 104 +++++++++++++++---------------- src/routes/userRouter.ts | 2 +- src/services/Authenticator.ts | 4 +- src/services/HashManager.ts | 4 +- 9 files changed, 115 insertions(+), 76 deletions(-) diff --git a/request.rest b/request.rest index 12113f0..5bbb94e 100644 --- a/request.rest +++ b/request.rest @@ -4,10 +4,16 @@ Content-Type: application/json { "email": "bananinha@gmail.com", "name": "Bananinha", - "password": "123456", + "password": "1234567", "role": "ADMIN" } ### +POST http://localhost:3003/user/login +Content-Type: application/json +{ + "email":"bananinha@gmail.com" , + "password": "1234567" +} diff --git a/src/business/UserBusiness.ts b/src/business/UserBusiness.ts index 64856df..be628a5 100644 --- a/src/business/UserBusiness.ts +++ b/src/business/UserBusiness.ts @@ -1,4 +1,4 @@ -import { UserInputDTO, LoginInputDTO } from "../model/User"; +import { UserInputDTO, LoginInputDTO, UserRole } from "../model/User"; import { UserDatabase } from "../data/UserDatabase"; import { IdGenerator } from "../services/IdGenerator"; import { HashManager } from "../services/HashManager"; @@ -32,6 +32,10 @@ console.log(email,name,password,role); const id = idGenerator.generate(); + if (role.toUpperCase() !== UserRole.ADMIN && role.toUpperCase() !== UserRole.NORMAL) { + throw new CustomError(400, "Invalid NORMAL, ADMIN"); + } + const hashPassword = await hashManager.hashGenerator(password); await userDatabase.createUser( @@ -68,4 +72,34 @@ console.log(email,name,password,role); // return accessToken; // } + + public async login({ email, password }: LoginInputDTO): Promise { + try { + if (!email || !password) { + throw new CustomError(400, 'Fill in the fields "email" and "password"'); + } + if (!email.includes("@")) { + throw new CustomError(400, "Invalid email address"); + } + + const user = await userDatabase.getUserByEmail(email) + + if (!user) { + throw new CustomError (400,"User Not Found") + } + + const comparePassword: boolean = await hashManager.compare(password, user.password) + + if (!comparePassword) { + throw new CustomError(400, "Invalid password"); + } + + const token = await authenticator.generateToken({ id: user.id, role: user.role }) + + return token; + + } catch (error: any) { + throw new CustomError(400, error.message); + } + } } \ No newline at end of file diff --git a/src/controller/UserController.ts b/src/controller/UserController.ts index 4601e16..c3fef71 100644 --- a/src/controller/UserController.ts +++ b/src/controller/UserController.ts @@ -5,7 +5,7 @@ import { BaseDatabase } from "../data/BaseDatabase"; const userBusiness = new UserBusiness(); export class UserController { - + public async createUser(req: Request, res: Response) { try { const { email, name, password, role } = req.body @@ -29,25 +29,24 @@ export class UserController { // await BaseDatabase.destroyConnection(); } - // async login(req: Request, res: Response) { + public async login(req: Request, res: Response) { - // try { + try { - // const loginData: LoginInputDTO = { - // email: req.body.email, - // password: req.body.password - // }; + const loginData: LoginInputDTO = { + email: req.body.email, + password: req.body.password + }; - // const userBusiness = new UserBusiness(); - // const token = await userBusiness.getUserByEmail(loginData); + const token = await userBusiness.login(loginData); - // res.status(200).send({ token }); + res.status(200).send({ token }); - // } catch (error: any) { - // res.status(400).send({ error: error.message }); - // } + } catch (error: any) { + res.status(400).send({ error: error.message }); + } - // await BaseDatabase.destroyConnection(); - // } + // await BaseDatabase.destroyConnection(); + } } \ No newline at end of file diff --git a/src/data/UserDatabase.ts b/src/data/UserDatabase.ts index 8b6d751..263f30c 100644 --- a/src/data/UserDatabase.ts +++ b/src/data/UserDatabase.ts @@ -29,7 +29,7 @@ export class UserDatabase extends BaseDatabase { .from(UserDatabase.TABLE_NAME) .where({ email }); - return User.toUserModel(result[0]); + return (result[0]); } } diff --git a/src/index.ts b/src/index.ts index cc0bae3..1896527 100644 --- a/src/index.ts +++ b/src/index.ts @@ -9,7 +9,7 @@ app.use(express.json()); app.use("/user", userRouter); -const server = app.listen(3000, () => { +const server = app.listen(3003, () => { if (server) { const address = server.address() as AddressInfo; console.log(`Servidor rodando em http://localhost:${address.port}`); diff --git a/src/model/User.ts b/src/model/User.ts index c801c51..5d23599 100644 --- a/src/model/User.ts +++ b/src/model/User.ts @@ -1,69 +1,69 @@ -export class User{ - constructor( - private id: string, - private name: string, - private email: string, - private password: string, - private role: UserRole - ){} - - getId(){ - return this.id; +export interface User{ + id: string, + email: string, + password: string, + name: string, + nickname: string, + role: string } - getName(){ - return this.name - } +// getId(){ +// return this.id; +// } - getEmail(){ - return this.email; - } +// getName(){ +// return this.name +// } - getPassword(){ - return this.password; - } +// getEmail(){ +// return this.email; +// } - getRole(){ - return this.role; - } +// getPassword(){ +// return this.password; +// } - setId(id: string){ - this.id = id; - } +// getRole(){ +// return this.role; +// } - setName(name: string){ - this.name = name; - } +// setId(id: string){ +// this.id = id; +// } - setEmail(email: string){ - this.email = email; - } +// setName(name: string){ +// this.name = name; +// } - setPassword(password: string){ - this.password = password; - } +// setEmail(email: string){ +// this.email = email; +// } - setRole(role: UserRole){ - this.role = role; - } +// setPassword(password: string){ +// this.password = password; +// } - static stringToUserRole(input: string): UserRole{ - switch (input) { - case "NORMAL": - return UserRole.NORMAL; - case "ADMIN": - return UserRole.ADMIN; - default: - throw new Error("Invalid user role"); - } - } +// setRole(role: UserRole){ +// this.role = role; +// } - static toUserModel(user: any): User { - return new User(user.id, user.name, user.email, user.password, User.stringToUserRole(user.role)); - } +// static stringToUserRole(input: string): UserRole{ +// switch (input) { +// case "NORMAL": +// return UserRole.NORMAL; +// case "ADMIN": +// return UserRole.ADMIN; +// default: +// throw new Error("Invalid user role"); +// } +// } +// static toUserModel(user: any): User { +// return new User(user.id, user.name, user.email, user.password, User.stringToUserRole(user.role)); +// } -} + +// } export interface UserDTO { id: string, name: string, diff --git a/src/routes/userRouter.ts b/src/routes/userRouter.ts index 51b2e0e..f8dc45b 100644 --- a/src/routes/userRouter.ts +++ b/src/routes/userRouter.ts @@ -8,4 +8,4 @@ const userController = new UserController(); userRouter.post("/create", userController.createUser); -// userRouter.post("/login", userController.login); \ No newline at end of file +userRouter.post("/login", userController.login); \ No newline at end of file diff --git a/src/services/Authenticator.ts b/src/services/Authenticator.ts index 019dbef..d1d6678 100644 --- a/src/services/Authenticator.ts +++ b/src/services/Authenticator.ts @@ -24,8 +24,8 @@ export class Authenticator { const payload = jwt.verify( token, process.env.JWT_KEY as string) as any; const result = { - id: payload.id, - role: payload.role + id: payload.id as string, + role: payload.role as string }; return result; } diff --git a/src/services/HashManager.ts b/src/services/HashManager.ts index 53d4568..22e4c54 100644 --- a/src/services/HashManager.ts +++ b/src/services/HashManager.ts @@ -4,8 +4,8 @@ import * as bcrypt from "bcryptjs"; export class HashManager { public async hashGenerator(text: string): Promise { - const rounds = 12; - const salt = await bcrypt.genSalt(rounds); + const cost: number = Number(process.env.BCRYPT_COST) + const salt = await bcrypt.genSalt(cost); const result = await bcrypt.hash(text, salt); return result; } From 2ec862c21022ae4e76af115ffea2d4e9695fc699 Mon Sep 17 00:00:00 2001 From: carolinemartins Date: Sat, 11 Mar 2023 14:55:31 -0300 Subject: [PATCH 05/31] comentados identacao --- src/business/UserBusiness.ts | 26 ++++---------------------- src/controller/UserController.ts | 3 --- src/index.ts | 1 + src/model/User.ts | 10 +++++----- src/services/Authenticator.ts | 23 ----------------------- src/services/IdGenerator.ts | 4 ++-- 6 files changed, 12 insertions(+), 55 deletions(-) diff --git a/src/business/UserBusiness.ts b/src/business/UserBusiness.ts index be628a5..21d9cf4 100644 --- a/src/business/UserBusiness.ts +++ b/src/business/UserBusiness.ts @@ -13,7 +13,7 @@ export class UserBusiness { public async createUser({ email, name, password, role }: UserInputDTO) { try { -console.log(email,name,password,role); + console.log(email, name, password, role); if (!name || !email || !password) { @@ -34,7 +34,7 @@ console.log(email,name,password,role); if (role.toUpperCase() !== UserRole.ADMIN && role.toUpperCase() !== UserRole.NORMAL) { throw new CustomError(400, "Invalid NORMAL, ADMIN"); - } + } const hashPassword = await hashManager.hashGenerator(password); @@ -55,24 +55,6 @@ console.log(email,name,password,role); } } - // async getUserByEmail(user: LoginInputDTO) { - - // const userDatabase = new UserDatabase(); - // const userFromDB = await userDatabase.getUserByEmail(user.email); - - // const hashManager = new HashManager(); - // const hashCompare = await hashManager.compare(user.password, userFromDB.getPassword()); - - // const authenticator = new Authenticator(); - // const accessToken = authenticator.generateToken({ id: userFromDB.getId(), role: userFromDB.getRole() }); - - // if (!hashCompare) { - // throw new Error("Invalid Password!"); - // } - - // return accessToken; - // } - public async login({ email, password }: LoginInputDTO): Promise { try { if (!email || !password) { @@ -85,14 +67,14 @@ console.log(email,name,password,role); const user = await userDatabase.getUserByEmail(email) if (!user) { - throw new CustomError (400,"User Not Found") + throw new CustomError(400, "User Not Found") } const comparePassword: boolean = await hashManager.compare(password, user.password) if (!comparePassword) { throw new CustomError(400, "Invalid password"); - } + } const token = await authenticator.generateToken({ id: user.id, role: user.role }) diff --git a/src/controller/UserController.ts b/src/controller/UserController.ts index c3fef71..9cd66ec 100644 --- a/src/controller/UserController.ts +++ b/src/controller/UserController.ts @@ -1,7 +1,6 @@ import { Request, Response } from "express"; import { UserInputDTO, LoginInputDTO } from "../model/User"; import { UserBusiness } from "../business/UserBusiness"; -import { BaseDatabase } from "../data/BaseDatabase"; const userBusiness = new UserBusiness(); export class UserController { @@ -26,7 +25,6 @@ export class UserController { res.status(400).send({ error: error.message }); } - // await BaseDatabase.destroyConnection(); } public async login(req: Request, res: Response) { @@ -46,7 +44,6 @@ export class UserController { res.status(400).send({ error: error.message }); } - // await BaseDatabase.destroyConnection(); } } \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 1896527..dbac848 100644 --- a/src/index.ts +++ b/src/index.ts @@ -7,6 +7,7 @@ const app = express(); app.use(express.json()); +///ENDPOINT USER app.use("/user", userRouter); const server = app.listen(3003, () => { diff --git a/src/model/User.ts b/src/model/User.ts index 5d23599..255551c 100644 --- a/src/model/User.ts +++ b/src/model/User.ts @@ -1,11 +1,11 @@ -export interface User{ +export interface User { id: string, email: string, password: string, name: string, nickname: string, role: string - } +} // getId(){ // return this.id; @@ -71,19 +71,19 @@ export interface UserDTO { password: string } -export interface UserInputDTO{ +export interface UserInputDTO { email: string; password: string; name: string; role: string; } -export interface LoginInputDTO{ +export interface LoginInputDTO { email: string; password: string; } -export enum UserRole{ +export enum UserRole { NORMAL = "NORMAL", ADMIN = "ADMIN" } \ No newline at end of file diff --git a/src/services/Authenticator.ts b/src/services/Authenticator.ts index d1d6678..75d6805 100644 --- a/src/services/Authenticator.ts +++ b/src/services/Authenticator.ts @@ -30,26 +30,3 @@ export class Authenticator { return result; } } - - - -// export class Authenticator { - -// public generateToken = ({ id , role}: AuthenticationData) => { -// const token = jwt.sign( -// { id, role }, -// process.env.JWT_KEY as string, -// { expiresIn: "4h" } -// ) -// return token -// } - -// public tokenData = (token: string): AuthenticationData => { -// const payload = jwt.verify( -// token, -// process.env.JWT_KEY as string -// ) as jwt.JwtPayload - -// return { id: payload.id as string, role: payload.role as string } -// } -// } \ No newline at end of file diff --git a/src/services/IdGenerator.ts b/src/services/IdGenerator.ts index 8dc2b8a..f906ba3 100644 --- a/src/services/IdGenerator.ts +++ b/src/services/IdGenerator.ts @@ -1,8 +1,8 @@ import { v4 } from "uuid"; -export class IdGenerator{ +export class IdGenerator { - generate(): string{ + generate(): string { return v4(); } } \ No newline at end of file From aee66f41ef2abc3839a6d75cc0f714c31ea40c01 Mon Sep 17 00:00:00 2001 From: carolinemartins Date: Sat, 11 Mar 2023 15:01:08 -0300 Subject: [PATCH 06/31] readme --- README.md | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 69 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 6a2f62f..926aef6 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,72 @@ # Labenu Music Awards Como você deve saber muito bem, o nosso querido chefinho Astrodev é uma pessoa com Networking incrível e ele conhece vários artistas estrelados. Além disso, ele também é um grande ~~megalomaníaco~~ visionário e está planejando fazer um grande evento: o **LAMA**, *Labenu Musical Awards*, um festival com várias bandas famosas para a formatura da sua turma e, no final, vocês podem eleger a banda que mais gostaram! Entretanto, na opinião dele, vocês só serão merecedores se entregarem um sistema impecável que permita o gerenciamento completo desses shows. -Para isso já deixamos algumas tabelas prontas para vocês não precisarem se preocupar com a modelagem do banco. Deixamos também um template do projeto já com a estrutura da parte de usuários. Vocês podem usá-las a vontade, mas, se quiser fazer do zero sem esse auxílio, também pode. +

💻 Funcionalidades:

+✅ Cadastrar pessoas usuária;
+✅ Login;
+ + +--- + +

🛠 Ferramentas:

+- Typescript
+- Node.js
+- MySQL
+- Express
+- Uuid
+- JsonWebToken
+- Knex
+- Bcrypt
+ +--- + +

🐱‍🚀 Documentação Postam:

+ +[---Documentação---]() + +--- + +

🔗 Link Render:

+ +[---LINK AQUI---]() + +--- + +

⚙️ Instruções para rodar o projeto:

+ +> O arquivo *requests.rest*, presente na pasta raiz do projeto, contém todos os endpoints com url do deploy disponível online (Render) + +Caso queira rodar o projeto localmente, as instruções são: + +``` +git clone https://github.com/future4code/Barros-LAMA1.git + +npm install -> para instalar as dependências do projeto + +criar um arquivo .env com as informações do seus banco de dados + +executar as queries do arquivo queries.sql para criar as tabelas + +npm run dev -> para rodar o servidor +Instruções para preencher o arquivo dotenv: +``` + +criar um arquivo .env na pasta raiz com as seguintes variáveis: + +``` + DB_USER = + DB_PASSWORD = + DB_HOST = + DB_PORT = + DB_DATABASE_NAME = +``` + +Preencher as variáveis com as informações do seu banco de dados. + +Ainda no .env, preencher também as variáveis: + + + JWT_KEY: , (palavra passe) + BCRYPT_COST: , (cost da lib Bcrypt, geralmente 12) + ACCESS_TOKEN_EXPIRES_IN = 60min + From 97dda261c383bccffdf30e998578bcdc0e138330 Mon Sep 17 00:00:00 2001 From: carolinemartins Date: Sat, 11 Mar 2023 20:14:57 -0300 Subject: [PATCH 07/31] create band data/business --- src/business/BandBusiness.ts | 43 ++++++++++++++++++++++++++++++++++++ src/business/UserBusiness.ts | 2 -- src/data/BandDatabase.ts | 24 ++++++++++++++++++++ src/data/UserDatabase.ts | 3 +-- src/model/Band.ts | 21 ++++++++++++++++++ 5 files changed, 89 insertions(+), 4 deletions(-) create mode 100644 src/business/BandBusiness.ts create mode 100644 src/data/BandDatabase.ts create mode 100644 src/model/Band.ts diff --git a/src/business/BandBusiness.ts b/src/business/BandBusiness.ts new file mode 100644 index 0000000..d4dcd17 --- /dev/null +++ b/src/business/BandBusiness.ts @@ -0,0 +1,43 @@ +import { BandDatabase } from "../data/BandDatabase"; +import { CustomError } from "../error/BaseError"; +import { InputBandDTO, InsertBandDTO } from "../model/Band"; +import { Authenticator } from "../services/Authenticator"; +import { HashManager } from "../services/HashManager"; +import { IdGenerator } from "../services/IdGenerator"; + +const idGenerator = new IdGenerator(); +const hashManager = new HashManager(); +const bandDatabase = new BandDatabase(); +const authenticator = new Authenticator(); + +export class BandBusiness { + public createBand = async ({name, musicGenre,responsible, idAutorization}:InputBandDTO )=>{ + + try{ + if(!name || !musicGenre || !responsible){ + throw new CustomError(400, '"name" or "musicGenre" or "responsible"'); + } + if(!idAutorization){ + throw new CustomError(400, 'Not authorized'); + } + + const idUser = authenticator.getData(idAutorization) + + const id = idGenerator.generate() + + const insertBand: InsertBandDTO ={ + id: id, + name:name, + musicGenre:musicGenre, + responsible: responsible, + idAutorization: idUser.id + } + + await bandDatabase.create(insertBand) + + }catch(error:any){ + throw new CustomError(400, error.message); + } + + } +} \ No newline at end of file diff --git a/src/business/UserBusiness.ts b/src/business/UserBusiness.ts index 21d9cf4..f4efc45 100644 --- a/src/business/UserBusiness.ts +++ b/src/business/UserBusiness.ts @@ -13,8 +13,6 @@ export class UserBusiness { public async createUser({ email, name, password, role }: UserInputDTO) { try { - console.log(email, name, password, role); - if (!name || !email || !password) { throw new CustomError(400, 'Fill in the fields "name", "email" and "password"'); diff --git a/src/data/BandDatabase.ts b/src/data/BandDatabase.ts new file mode 100644 index 0000000..5a879db --- /dev/null +++ b/src/data/BandDatabase.ts @@ -0,0 +1,24 @@ +import { Band } from "../model/Band"; +import { BaseDatabase } from "./BaseDatabase"; + +export class BandDatabase extends BaseDatabase { + private static TABLE_NAME = "band"; + + public create = async ({id,name,musicGenre,responsible}:Band) => { + try{ + + await this.getConnection().insert({ + id: id, + name: name, + music_genre: musicGenre, + responsible: responsible + }).into(BandDatabase.TABLE_NAME) + + }catch(error:any){ + throw new Error(error.sqlMessage || error.message) + } + + } + + +} \ No newline at end of file diff --git a/src/data/UserDatabase.ts b/src/data/UserDatabase.ts index 263f30c..9971a00 100644 --- a/src/data/UserDatabase.ts +++ b/src/data/UserDatabase.ts @@ -16,8 +16,7 @@ export class UserDatabase extends BaseDatabase { role }) .into(UserDatabase.TABLE_NAME); - console.log(result); - + } catch (error:any) { throw new Error(error.sqlMessage || error.message); } diff --git a/src/model/Band.ts b/src/model/Band.ts new file mode 100644 index 0000000..6605da5 --- /dev/null +++ b/src/model/Band.ts @@ -0,0 +1,21 @@ +export interface Band{ + id: string; + name: string; + musicGenre: string; + responsible: string +} + +export interface InputBandDTO{ + name:string, + musicGenre:string, + responsible:string, + idAutorization:string +} + +export interface InsertBandDTO{ + id:string, + name:string, + musicGenre:string, + responsible:string, + idAutorization:string +} \ No newline at end of file From 846d82f4dd0963860bf7d36f2b2fe97dc85f6340 Mon Sep 17 00:00:00 2001 From: carolinemartins Date: Sat, 11 Mar 2023 20:46:33 -0300 Subject: [PATCH 08/31] create band controller --- src/controller/BandController.ts | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 src/controller/BandController.ts diff --git a/src/controller/BandController.ts b/src/controller/BandController.ts new file mode 100644 index 0000000..c2e5f77 --- /dev/null +++ b/src/controller/BandController.ts @@ -0,0 +1,26 @@ +import { Request, Response } from "express"; +import { BandBusiness } from "../business/BandBusiness"; + +const bandBusiness = new BandBusiness(); + +export class BandController { + create = async (req: Request, res: Response) => { + try { + const idAutorization = req.headers.authorization as string; + const { name, musicGenre, responsible } = req.body + + const insertBand = { + name: name, + musicGenre: musicGenre, + responsible: responsible, + idAutorization: idAutorization + } + await bandBusiness.createBand(insertBand) + + res.status(201).send({ message: "Band created successfully!" }) + } catch (error: any) { + throw new Error(error.message || error.sqlMessage); + } + + } +} \ No newline at end of file From 5c049e2d0d1ef5da39a3440d080f30e0898100d7 Mon Sep 17 00:00:00 2001 From: carolinemartins Date: Sat, 11 Mar 2023 20:57:48 -0300 Subject: [PATCH 09/31] create band funcionando --- request.rest | 11 +++++++++++ src/controller/BandController.ts | 2 +- src/data/BandDatabase.ts | 2 +- src/index.ts | 3 +++ src/routes/bandRouter.ts | 8 ++++++++ 5 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 src/routes/bandRouter.ts diff --git a/request.rest b/request.rest index 5bbb94e..61a376e 100644 --- a/request.rest +++ b/request.rest @@ -17,3 +17,14 @@ Content-Type: application/json "email":"bananinha@gmail.com" , "password": "1234567" } + +### +POST http://localhost:3003/band/create +Content-Type: application/json +Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjQyY2E3MGJiLWMwNDgtNDEzZS1hY2YzLWZmYjg3NTgzOGFiNCIsInJvbGUiOiJBRE1JTiIsImlhdCI6MTY3ODU3ODg2OCwiZXhwIjoxNjc4NTgyNDY4fQ.erbqSR2Te-xdeAHfy4BxTz4qCLXEXDao-mOVUzqgLoU + +{ + "name": "twenty one pilots", + "musicGenre": "rock-music", + "responsible":"Caroline" +} \ No newline at end of file diff --git a/src/controller/BandController.ts b/src/controller/BandController.ts index c2e5f77..c7d4468 100644 --- a/src/controller/BandController.ts +++ b/src/controller/BandController.ts @@ -19,7 +19,7 @@ export class BandController { res.status(201).send({ message: "Band created successfully!" }) } catch (error: any) { - throw new Error(error.message || error.sqlMessage); + res.status(400).send({ error: error.message }); } } diff --git a/src/data/BandDatabase.ts b/src/data/BandDatabase.ts index 5a879db..edafafb 100644 --- a/src/data/BandDatabase.ts +++ b/src/data/BandDatabase.ts @@ -2,7 +2,7 @@ import { Band } from "../model/Band"; import { BaseDatabase } from "./BaseDatabase"; export class BandDatabase extends BaseDatabase { - private static TABLE_NAME = "band"; + private static TABLE_NAME = "bands"; public create = async ({id,name,musicGenre,responsible}:Band) => { try{ diff --git a/src/index.ts b/src/index.ts index dbac848..db3df6b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,6 +2,7 @@ import dotenv from "dotenv"; import { AddressInfo } from "net"; import express from "express"; import { userRouter } from "./routes/userRouter"; +import { bandRouter } from "./routes/bandRouter"; dotenv.config(); const app = express(); @@ -10,6 +11,8 @@ app.use(express.json()); ///ENDPOINT USER app.use("/user", userRouter); +app.use("/band", bandRouter); + const server = app.listen(3003, () => { if (server) { const address = server.address() as AddressInfo; diff --git a/src/routes/bandRouter.ts b/src/routes/bandRouter.ts new file mode 100644 index 0000000..572faae --- /dev/null +++ b/src/routes/bandRouter.ts @@ -0,0 +1,8 @@ +import express from "express" +import { BandController } from "../controller/BandController" + +export const bandRouter = express.Router() + +const bandController = new BandController() + +bandRouter.post("/create", bandController.create) \ No newline at end of file From 3312325adc942de1029dcb6c4280d788f1514c1f Mon Sep 17 00:00:00 2001 From: carolinemartins Date: Sat, 11 Mar 2023 21:06:31 -0300 Subject: [PATCH 10/31] =?UTF-8?q?verifica=C3=A7=C3=A3o=20user=20role?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- request.rest | 14 +++++++------- src/business/BandBusiness.ts | 5 +++++ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/request.rest b/request.rest index 61a376e..bafc63e 100644 --- a/request.rest +++ b/request.rest @@ -2,10 +2,10 @@ POST http://localhost:3003/user/create Content-Type: application/json { - "email": "bananinha@gmail.com", - "name": "Bananinha", + "email": "caroline@email.com", + "name": "Carol", "password": "1234567", - "role": "ADMIN" + "role": "NORMAL" } @@ -21,10 +21,10 @@ Content-Type: application/json ### POST http://localhost:3003/band/create Content-Type: application/json -Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjQyY2E3MGJiLWMwNDgtNDEzZS1hY2YzLWZmYjg3NTgzOGFiNCIsInJvbGUiOiJBRE1JTiIsImlhdCI6MTY3ODU3ODg2OCwiZXhwIjoxNjc4NTgyNDY4fQ.erbqSR2Te-xdeAHfy4BxTz4qCLXEXDao-mOVUzqgLoU +Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjQyY2E3MGJiLWMwNDgtNDEzZS1hY2YzLWZmYjg3NTgzOGFiNCIsInJvbGUiOiJBRE1JTiIsImlhdCI6MTY3ODU3OTUyMSwiZXhwIjoxNjc4NTgzMTIxfQ.HCWXKUlbH1XuZvJod2opbZRI94s2nihZHm_hxoHK9_E { - "name": "twenty one pilots", - "musicGenre": "rock-music", - "responsible":"Caroline" + "name": "Muleque", + "musicGenre": "pagode", + "responsible":"Ana" } \ No newline at end of file diff --git a/src/business/BandBusiness.ts b/src/business/BandBusiness.ts index d4dcd17..71f5bf5 100644 --- a/src/business/BandBusiness.ts +++ b/src/business/BandBusiness.ts @@ -1,6 +1,7 @@ import { BandDatabase } from "../data/BandDatabase"; import { CustomError } from "../error/BaseError"; import { InputBandDTO, InsertBandDTO } from "../model/Band"; +import { UserRole } from "../model/User"; import { Authenticator } from "../services/Authenticator"; import { HashManager } from "../services/HashManager"; import { IdGenerator } from "../services/IdGenerator"; @@ -23,6 +24,10 @@ export class BandBusiness { const idUser = authenticator.getData(idAutorization) + if(idUser.role !== UserRole.ADMIN){ + throw new Error("Only a normal user can access this funcionality"); + } + const id = idGenerator.generate() const insertBand: InsertBandDTO ={ From 6e486cb81a9409bdecfbb234427e2bb19708c24d Mon Sep 17 00:00:00 2001 From: carolinemartins Date: Sat, 11 Mar 2023 21:30:37 -0300 Subject: [PATCH 11/31] get all band by id --- request.rest | 9 +++++++++ src/business/BandBusiness.ts | 21 +++++++++++++++++++++ src/controller/BandController.ts | 17 +++++++++++++++++ src/data/BandDatabase.ts | 20 ++++++++++++++++---- src/routes/bandRouter.ts | 4 +++- 5 files changed, 66 insertions(+), 5 deletions(-) diff --git a/request.rest b/request.rest index bafc63e..5ec77af 100644 --- a/request.rest +++ b/request.rest @@ -27,4 +27,13 @@ Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjQyY2E3MGJiLWMwNDgt "name": "Muleque", "musicGenre": "pagode", "responsible":"Ana" +} + +### +GET http://localhost:3003/band/get +Content-Type: application/json +Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjQyY2E3MGJiLWMwNDgtNDEzZS1hY2YzLWZmYjg3NTgzOGFiNCIsInJvbGUiOiJBRE1JTiIsImlhdCI6MTY3ODU3OTUyMSwiZXhwIjoxNjc4NTgzMTIxfQ.HCWXKUlbH1XuZvJod2opbZRI94s2nihZHm_hxoHK9_E + +{ + "id": "69446129-691a-44c6-96c6-747a6f7918e8" } \ No newline at end of file diff --git a/src/business/BandBusiness.ts b/src/business/BandBusiness.ts index 71f5bf5..8e9c846 100644 --- a/src/business/BandBusiness.ts +++ b/src/business/BandBusiness.ts @@ -45,4 +45,25 @@ export class BandBusiness { } } + + public getAllIdBand = async (id:string, idAutorization:string)=>{ + try{ + if(!id){ + throw new CustomError(400, "Invalid id"); + } + + const authorizationId = authenticator.getData(idAutorization); + + if(!authorizationId){ + throw new CustomError(400, "Invalid authorization"); + } + + + const result = bandDatabase.getAllId(id) + + return result + }catch(error:any){ + throw new CustomError(400, error.message); + } + } } \ No newline at end of file diff --git a/src/controller/BandController.ts b/src/controller/BandController.ts index c7d4468..978e7a9 100644 --- a/src/controller/BandController.ts +++ b/src/controller/BandController.ts @@ -23,4 +23,21 @@ export class BandController { } } + + getAllIdBand = async (req: Request, res: Response) => { + + try{ + const idAutorization = req.headers.authorization as string; + + const id = req.body.id + + const result = await bandBusiness.getAllIdBand(id, idAutorization) + + res.status(200).send(result) + + }catch(error:any) { + res.status(400).send({ error: error.message }); + } + } + } \ No newline at end of file diff --git a/src/data/BandDatabase.ts b/src/data/BandDatabase.ts index edafafb..31c7295 100644 --- a/src/data/BandDatabase.ts +++ b/src/data/BandDatabase.ts @@ -4,8 +4,8 @@ import { BaseDatabase } from "./BaseDatabase"; export class BandDatabase extends BaseDatabase { private static TABLE_NAME = "bands"; - public create = async ({id,name,musicGenre,responsible}:Band) => { - try{ + public create = async ({ id, name, musicGenre, responsible }: Band) => { + try { await this.getConnection().insert({ id: id, @@ -14,11 +14,23 @@ export class BandDatabase extends BaseDatabase { responsible: responsible }).into(BandDatabase.TABLE_NAME) - }catch(error:any){ + } catch (error: any) { throw new Error(error.sqlMessage || error.message) } - } + public getAllId = async (id: string) => { + try { + + const result = await this.getConnection() + .select("*") + .from(BandDatabase.TABLE_NAME) + .where({ "id": id }) + + return result[0] + } catch (error: any) { + throw new Error(error.sqlMessage || error.message) + } + } } \ No newline at end of file diff --git a/src/routes/bandRouter.ts b/src/routes/bandRouter.ts index 572faae..8437520 100644 --- a/src/routes/bandRouter.ts +++ b/src/routes/bandRouter.ts @@ -5,4 +5,6 @@ export const bandRouter = express.Router() const bandController = new BandController() -bandRouter.post("/create", bandController.create) \ No newline at end of file +bandRouter.post("/create", bandController.create) + +bandRouter.get("/get", bandController.getAllIdBand) \ No newline at end of file From 7b0db0c802c3d25fdfcede201c1e2fa98038771c Mon Sep 17 00:00:00 2001 From: carolinemartins Date: Sat, 11 Mar 2023 21:32:55 -0300 Subject: [PATCH 12/31] readme --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 926aef6..eea1bea 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,8 @@ Como você deve saber muito bem, o nosso querido chefinho Astrodev é uma pessoa

💻 Funcionalidades:

✅ Cadastrar pessoas usuária;
✅ Login;
+✅ Registrar banda (com autorização administrativa)
+✅ Visualizar detalhes da banda
--- From 668fe1bedf033abe340c092c573ca84083258143 Mon Sep 17 00:00:00 2001 From: carolinemartins Date: Sat, 11 Mar 2023 21:45:10 -0300 Subject: [PATCH 13/31] dataBase shows --- src/data/ShowDatabase.ts | 22 ++++++++++++++++++++++ src/data/UserDatabase.ts | 2 +- src/model/Show.ts | 7 +++++++ 3 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 src/data/ShowDatabase.ts create mode 100644 src/model/Show.ts diff --git a/src/data/ShowDatabase.ts b/src/data/ShowDatabase.ts new file mode 100644 index 0000000..8f0d6a6 --- /dev/null +++ b/src/data/ShowDatabase.ts @@ -0,0 +1,22 @@ +import { Show } from "../model/Show"; +import { BaseDatabase } from "./BaseDatabase"; + +export class ShowDatabase extends BaseDatabase{ + private static TABLE_NAME = "shows"; + + create = async({id, weekDay, startTime, endTime, bandId}:Show)=>{ + try{ + await this.getConnection() + .insert({ + id:id, + week_day:weekDay, + start_time:startTime, + end_time:endTime, + band_id:bandId + }).into(ShowDatabase.TABLE_NAME) + + }catch(error:any){ + throw new Error(error.sqlMessage || error.message); + } + } +} \ No newline at end of file diff --git a/src/data/UserDatabase.ts b/src/data/UserDatabase.ts index 9971a00..39b2f1d 100644 --- a/src/data/UserDatabase.ts +++ b/src/data/UserDatabase.ts @@ -7,7 +7,7 @@ export class UserDatabase extends BaseDatabase { public async createUser(id: string, email: string, name: string,password: string,role: string): Promise { try { - const result =await this.getConnection() + await this.getConnection() .insert({ id, email, diff --git a/src/model/Show.ts b/src/model/Show.ts new file mode 100644 index 0000000..65586b9 --- /dev/null +++ b/src/model/Show.ts @@ -0,0 +1,7 @@ +export interface Show { + id: string, + weekDay: string, + startTime: string, + endTime: string, + bandId: string +} \ No newline at end of file From b6863601400553bc164ada40388e95fb34e52a13 Mon Sep 17 00:00:00 2001 From: carolinemartins Date: Sat, 11 Mar 2023 22:06:08 -0300 Subject: [PATCH 14/31] show business --- src/business/ShowBusiness.ts | 48 ++++++++++++++++++++++++++++++++++++ src/model/Show.ts | 16 +++++++++++- 2 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 src/business/ShowBusiness.ts diff --git a/src/business/ShowBusiness.ts b/src/business/ShowBusiness.ts new file mode 100644 index 0000000..ce8d6b8 --- /dev/null +++ b/src/business/ShowBusiness.ts @@ -0,0 +1,48 @@ +import { ShowDatabase } from "../data/ShowDatabase"; +import { CustomError } from "../error/BaseError"; +import { InputShow, Show, WeekDay } from "../model/Show"; +import { UserRole } from "../model/User"; +import { Authenticator } from "../services/Authenticator"; +import { IdGenerator } from "../services/IdGenerator"; + +const showDatabase = new ShowDatabase() +const idGenerator = new IdGenerator() +const authenticator = new Authenticator() + +export class ShowBusiness{ + + createShow = async ({weekDay, startTime, endTime, bandId, idAutentication}:InputShow)=>{ + try{ + if(!startTime || !endTime || !bandId){ + throw new CustomError(400, "Invalid startTime or endTime or bandId") + } + + if(weekDay.toUpperCase() !== WeekDay.SABADO || + weekDay.toUpperCase() !== WeekDay.DOMINGO || weekDay.toUpperCase() !== WeekDay.SEXTA){ + throw new CustomError(400, "Invalid week day 'sexta', 'sabado' or 'domingo' "); + } + + const id = idGenerator.generate() + + const authenticatorId = authenticator.getData(idAutentication) + + if(authenticatorId.role !== UserRole.ADMIN){ + throw new CustomError(400, "Authentication invalid, not admin") + } + + const insertShow ={ + id:id, + weekDay:weekDay, + startTime:startTime, + endTime:endTime, + bandId: bandId, + idAutentication: authenticatorId + } + + await showDatabase.create(insertShow) + + }catch(error:any){ + throw new CustomError(400, error.message); + } + } +} \ No newline at end of file diff --git a/src/model/Show.ts b/src/model/Show.ts index 65586b9..519d778 100644 --- a/src/model/Show.ts +++ b/src/model/Show.ts @@ -1,7 +1,21 @@ export interface Show { id: string, - weekDay: string, + weekDay: WeekDay, startTime: string, endTime: string, bandId: string +} + +export interface InputShow { + weekDay: WeekDay, + startTime: string, + endTime: string, + bandId: string, + idAutentication: string +} + +export enum WeekDay{ + SEXTA = "sexta", + SABADO = "sabado", + DOMINGO = "domingo" } \ No newline at end of file From 645a0e3eddd3004cc35f1a82b801bf525ce96d69 Mon Sep 17 00:00:00 2001 From: carolinemartins Date: Sun, 12 Mar 2023 11:32:38 -0300 Subject: [PATCH 15/31] com erros, week day aceita qualquer dia, e a condicional da erro --- request.rest | 14 +++++++++++++- src/business/ShowBusiness.ts | 17 ++++++++++++----- src/controller/ShowController.ts | 29 +++++++++++++++++++++++++++++ src/data/ShowDatabase.ts | 3 ++- src/index.ts | 3 +++ src/model/Show.ts | 17 +++++++++++++---- src/routes/showRouter.ts | 8 ++++++++ 7 files changed, 80 insertions(+), 11 deletions(-) create mode 100644 src/controller/ShowController.ts create mode 100644 src/routes/showRouter.ts diff --git a/request.rest b/request.rest index 5ec77af..cc46151 100644 --- a/request.rest +++ b/request.rest @@ -14,7 +14,7 @@ POST http://localhost:3003/user/login Content-Type: application/json { - "email":"bananinha@gmail.com" , + "email":"caroline@email.com" , "password": "1234567" } @@ -36,4 +36,16 @@ Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjQyY2E3MGJiLWMwNDgt { "id": "69446129-691a-44c6-96c6-747a6f7918e8" +} + +### +POST http://localhost:3003/show/create +Content-Type: application/json +Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjU5MDM1MzUzLTE1YWYtNDEyYS1hMWUwLTc1YzEzYmZhYWU1MCIsInJvbGUiOiJOT1JNQUwiLCJpYXQiOjE2Nzg2MzE0ODksImV4cCI6MTY3ODYzNTA4OX0.uSNe53kgddisSeh0ATfuF_06rWi01fz-nE3aYSvLyS4 + +{ + "weekDay": "sab", + "startTime": 9, + "endTime": 11, + "bandId": "69446129-691a-44c6-96c6-747a6f7918e8" } \ No newline at end of file diff --git a/src/business/ShowBusiness.ts b/src/business/ShowBusiness.ts index ce8d6b8..7dd1a0e 100644 --- a/src/business/ShowBusiness.ts +++ b/src/business/ShowBusiness.ts @@ -1,6 +1,6 @@ import { ShowDatabase } from "../data/ShowDatabase"; import { CustomError } from "../error/BaseError"; -import { InputShow, Show, WeekDay } from "../model/Show"; +import { InputShow, Show, WeekDayEnum } from "../model/Show"; import { UserRole } from "../model/User"; import { Authenticator } from "../services/Authenticator"; import { IdGenerator } from "../services/IdGenerator"; @@ -17,10 +17,15 @@ export class ShowBusiness{ throw new CustomError(400, "Invalid startTime or endTime or bandId") } - if(weekDay.toUpperCase() !== WeekDay.SABADO || - weekDay.toUpperCase() !== WeekDay.DOMINGO || weekDay.toUpperCase() !== WeekDay.SEXTA){ - throw new CustomError(400, "Invalid week day 'sexta', 'sabado' or 'domingo' "); - } + // if(weekDay.toUpperCase() !== WeekDayEnum.SEXTA ){ + // throw new CustomError(400, "Invalid week day 'sexta', 'sabado' or 'domingo' "); + // } + // if(weekDay.toUpperCase() !== WeekDayEnum.SABADO){ + // throw new CustomError(400, "Invalid week day 'sabado' "); + // } + // if(weekDay.toUpperCase() !== WeekDayEnum.DOMINGO){ + // throw new CustomError(400, "Invalid week day 'domingo' "); + // } const id = idGenerator.generate() @@ -38,6 +43,8 @@ export class ShowBusiness{ bandId: bandId, idAutentication: authenticatorId } + console.log(insertShow); + await showDatabase.create(insertShow) diff --git a/src/controller/ShowController.ts b/src/controller/ShowController.ts new file mode 100644 index 0000000..5cd63ff --- /dev/null +++ b/src/controller/ShowController.ts @@ -0,0 +1,29 @@ +import { Request, Response } from "express"; +import { ShowBusiness } from "../business/ShowBusiness" +import { InputShow } from "../model/Show" + +const showBusinnes = new ShowBusiness(); + +export class ShowController { + createShow = async (req: Request, res: Response) => { + try { + const idAutorization = req.headers.authorization as string; + const { weekDay, startTime, endTime, bandId } = req.body + + const newShow: InputShow = { + weekDay, + startTime, + endTime, + bandId, + idAutentication: idAutorization + } + await showBusinnes.createShow(newShow) + res.status(201).send({ message: "Show created successfully!" }) + + } catch (error: any) { + res.status(400).send({ error: error.message }); + } + + + } +} \ No newline at end of file diff --git a/src/data/ShowDatabase.ts b/src/data/ShowDatabase.ts index 8f0d6a6..cd333ef 100644 --- a/src/data/ShowDatabase.ts +++ b/src/data/ShowDatabase.ts @@ -6,7 +6,7 @@ export class ShowDatabase extends BaseDatabase{ create = async({id, weekDay, startTime, endTime, bandId}:Show)=>{ try{ - await this.getConnection() + const result = await this.getConnection() .insert({ id:id, week_day:weekDay, @@ -14,6 +14,7 @@ export class ShowDatabase extends BaseDatabase{ end_time:endTime, band_id:bandId }).into(ShowDatabase.TABLE_NAME) +console.log(result); }catch(error:any){ throw new Error(error.sqlMessage || error.message); diff --git a/src/index.ts b/src/index.ts index db3df6b..22fe825 100644 --- a/src/index.ts +++ b/src/index.ts @@ -3,6 +3,7 @@ import { AddressInfo } from "net"; import express from "express"; import { userRouter } from "./routes/userRouter"; import { bandRouter } from "./routes/bandRouter"; +import { showRouter } from "./routes/showRouter"; dotenv.config(); const app = express(); @@ -13,6 +14,8 @@ app.use("/user", userRouter); app.use("/band", bandRouter); +app.use("/show", showRouter); + const server = app.listen(3003, () => { if (server) { const address = server.address() as AddressInfo; diff --git a/src/model/Show.ts b/src/model/Show.ts index 519d778..a5376b7 100644 --- a/src/model/Show.ts +++ b/src/model/Show.ts @@ -1,21 +1,30 @@ export interface Show { id: string, - weekDay: WeekDay, + weekDay: WeekDayEnum, startTime: string, endTime: string, bandId: string } export interface InputShow { - weekDay: WeekDay, + weekDay: WeekDayEnum, startTime: string, endTime: string, bandId: string, - idAutentication: string + idAutentication:string } -export enum WeekDay{ +export enum WeekDayEnum{ SEXTA = "sexta", SABADO = "sabado", DOMINGO = "domingo" +} + +export interface CreateShow{ + id: string, + weekDay: WeekDayEnum, + startTime: string, + endTime: string, + bandId: string, + authentication:string } \ No newline at end of file diff --git a/src/routes/showRouter.ts b/src/routes/showRouter.ts new file mode 100644 index 0000000..c694d31 --- /dev/null +++ b/src/routes/showRouter.ts @@ -0,0 +1,8 @@ +import express from "express"; +import { ShowController } from "../controller/ShowController"; + +export const showRouter = express.Router(); + +const showController = new ShowController(); + +showRouter.post("/create", showController.createShow); \ No newline at end of file From adc9469da716bb7f340cbd703fd226eb6b29ad0c Mon Sep 17 00:00:00 2001 From: carolinemartins Date: Sun, 12 Mar 2023 12:12:18 -0300 Subject: [PATCH 16/31] inicio show get all day --- request.rest | 8 ++++---- src/data/ShowDatabase.ts | 20 +++++++++++++++++++- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/request.rest b/request.rest index cc46151..18fb561 100644 --- a/request.rest +++ b/request.rest @@ -14,7 +14,7 @@ POST http://localhost:3003/user/login Content-Type: application/json { - "email":"caroline@email.com" , + "email":"bananinha@gmail.com" , "password": "1234567" } @@ -41,11 +41,11 @@ Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjQyY2E3MGJiLWMwNDgt ### POST http://localhost:3003/show/create Content-Type: application/json -Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjU5MDM1MzUzLTE1YWYtNDEyYS1hMWUwLTc1YzEzYmZhYWU1MCIsInJvbGUiOiJOT1JNQUwiLCJpYXQiOjE2Nzg2MzE0ODksImV4cCI6MTY3ODYzNTA4OX0.uSNe53kgddisSeh0ATfuF_06rWi01fz-nE3aYSvLyS4 +Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjQyY2E3MGJiLWMwNDgtNDEzZS1hY2YzLWZmYjg3NTgzOGFiNCIsInJvbGUiOiJBRE1JTiIsImlhdCI6MTY3ODYzMDExNSwiZXhwIjoxNjc4NjMzNzE1fQ.aO3l2iBhAtgnMC_yUNpbjP2vMRl0bduMA0j2WQHdUMI { - "weekDay": "sab", + "weekDay": "domingo", "startTime": 9, "endTime": 11, - "bandId": "69446129-691a-44c6-96c6-747a6f7918e8" + "bandId": "70d93276-59d5-44b2-98cb-c36f74696255" } \ No newline at end of file diff --git a/src/data/ShowDatabase.ts b/src/data/ShowDatabase.ts index cd333ef..fe2b543 100644 --- a/src/data/ShowDatabase.ts +++ b/src/data/ShowDatabase.ts @@ -14,7 +14,25 @@ export class ShowDatabase extends BaseDatabase{ end_time:endTime, band_id:bandId }).into(ShowDatabase.TABLE_NAME) -console.log(result); + + }catch(error:any){ + throw new Error(error.sqlMessage || error.message); + } + } + + getAllDay = async (weekDay:string)=>{ + try{ + + const result = await this.getConnection() + .select("name","music_genre") + .from("bands as b") + .join("show as s","b.band_id", "b.id") + .where({week_id: weekDay}) + .orderBy("s.start_time", "asc") + + console.log(result); + + return (result) }catch(error:any){ throw new Error(error.sqlMessage || error.message); From c5470b5bdb32305fb8541e7e2d9ba2e3aedff63e Mon Sep 17 00:00:00 2001 From: carolinemartins Date: Sun, 12 Mar 2023 12:18:25 -0300 Subject: [PATCH 17/31] inicio show get all day business --- src/business/ShowBusiness.ts | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/business/ShowBusiness.ts b/src/business/ShowBusiness.ts index 7dd1a0e..340bdfa 100644 --- a/src/business/ShowBusiness.ts +++ b/src/business/ShowBusiness.ts @@ -43,10 +43,25 @@ export class ShowBusiness{ bandId: bandId, idAutentication: authenticatorId } - console.log(insertShow); + await showDatabase.create(insertShow) + + }catch(error:any){ + throw new CustomError(400, error.message); + } + } + + getAllShowDay=async (weekDay:string, authentication:string)=>{ + try{ + const dataAutentication = authenticator.getData(authentication); + if(!dataAutentication){ + throw new CustomError(400, "Invalid authentication") + }else{ - await showDatabase.create(insertShow) + const bands = await showDatabase.getAllDay(weekDay) + + return bands + } }catch(error:any){ throw new CustomError(400, error.message); From cab0cb97713f997676f2fef5564e55af75c7d587 Mon Sep 17 00:00:00 2001 From: carolinemartins Date: Sun, 12 Mar 2023 12:28:44 -0300 Subject: [PATCH 18/31] get all day funcionando --- request.rest | 11 ++++++++++- src/controller/ShowController.ts | 16 ++++++++++++++++ src/data/ShowDatabase.ts | 4 ++-- src/routes/showRouter.ts | 4 +++- 4 files changed, 31 insertions(+), 4 deletions(-) diff --git a/request.rest b/request.rest index 18fb561..0adb59d 100644 --- a/request.rest +++ b/request.rest @@ -44,8 +44,17 @@ Content-Type: application/json Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjQyY2E3MGJiLWMwNDgtNDEzZS1hY2YzLWZmYjg3NTgzOGFiNCIsInJvbGUiOiJBRE1JTiIsImlhdCI6MTY3ODYzMDExNSwiZXhwIjoxNjc4NjMzNzE1fQ.aO3l2iBhAtgnMC_yUNpbjP2vMRl0bduMA0j2WQHdUMI { - "weekDay": "domingo", + "weekDay": "do", "startTime": 9, "endTime": 11, "bandId": "70d93276-59d5-44b2-98cb-c36f74696255" +} + +### +GET http://localhost:3003/show/day +Content-Type: application/json +Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjQyY2E3MGJiLWMwNDgtNDEzZS1hY2YzLWZmYjg3NTgzOGFiNCIsInJvbGUiOiJBRE1JTiIsImlhdCI6MTY3ODYzNDcyMywiZXhwIjoxNjc4NjM4MzIzfQ.0OGIOwvGn40mv8gT3hzynrn69F9mzGYC-IhG47ppbos + +{ + "weekDay": "domingo" } \ No newline at end of file diff --git a/src/controller/ShowController.ts b/src/controller/ShowController.ts index 5cd63ff..1ec8ecc 100644 --- a/src/controller/ShowController.ts +++ b/src/controller/ShowController.ts @@ -23,7 +23,23 @@ export class ShowController { } catch (error: any) { res.status(400).send({ error: error.message }); } + } + + getAllShowDay=async(req:Request, res:Response) => { + + try{ + + const authentication = req.headers.authorization as string + + const weekDay = req.body.weekDay + const bands = await showBusinnes.getAllShowDay(weekDay,authentication) + + res.status(200).send(bands) + + }catch(error: any){ + res.status(400).send({ error: error.message }); + } } } \ No newline at end of file diff --git a/src/data/ShowDatabase.ts b/src/data/ShowDatabase.ts index fe2b543..cc600ff 100644 --- a/src/data/ShowDatabase.ts +++ b/src/data/ShowDatabase.ts @@ -26,8 +26,8 @@ export class ShowDatabase extends BaseDatabase{ const result = await this.getConnection() .select("name","music_genre") .from("bands as b") - .join("show as s","b.band_id", "b.id") - .where({week_id: weekDay}) + .join("shows as s","s.band_id", "b.id") + .where({week_day: weekDay}) .orderBy("s.start_time", "asc") console.log(result); diff --git a/src/routes/showRouter.ts b/src/routes/showRouter.ts index c694d31..e12523a 100644 --- a/src/routes/showRouter.ts +++ b/src/routes/showRouter.ts @@ -5,4 +5,6 @@ export const showRouter = express.Router(); const showController = new ShowController(); -showRouter.post("/create", showController.createShow); \ No newline at end of file +showRouter.post("/create", showController.createShow); + +showRouter.get("/day", showController.getAllShowDay); \ No newline at end of file From 5dcecd8ff8b5ba278d2ca5d56ed7080c6209288d Mon Sep 17 00:00:00 2001 From: carolinemartins Date: Sun, 12 Mar 2023 12:49:02 -0300 Subject: [PATCH 19/31] reamde --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index eea1bea..5dd10d4 100644 --- a/README.md +++ b/README.md @@ -5,8 +5,14 @@ Como você deve saber muito bem, o nosso querido chefinho Astrodev é uma pessoa ✅ Cadastrar pessoas usuária;
✅ Login;
✅ Registrar banda (com autorização administrativa)
-✅ Visualizar detalhes da banda
+✅ Visualizar detalhes da banda
; +✅ Pegar todos os shows de uma data
+--- +

❌ Problemas:

+ +Show não está retornando erro para marcar na mesma hora e dia.(ou seja pode marcar diversos shows simultaneamente) +Sem validação de horário --- From 27bac937a4c78ec1429fd82e33a79e6bfbb4293c Mon Sep 17 00:00:00 2001 From: carolinemartins Date: Sun, 12 Mar 2023 13:40:31 -0300 Subject: [PATCH 20/31] reamde testes render, postman --- README.md | 4 ++-- request.rest | 5 ++++- src/business/UserBusiness.ts | 2 +- src/controller/UserController.ts | 2 +- src/data/ShowDatabase.ts | 2 -- 5 files changed, 8 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 5dd10d4..3e36773 100644 --- a/README.md +++ b/README.md @@ -30,13 +30,13 @@ Sem validação de horário

🐱‍🚀 Documentação Postam:

-[---Documentação---]() +[---Documentação---](https://documenter.getpostman.com/view/25513685/2s93JtR4D1) ---

🔗 Link Render:

-[---LINK AQUI---]() +[---LINK AQUI---](https://lama-barros-caroline-martins.onrender.com) --- diff --git a/request.rest b/request.rest index 0adb59d..2665ca3 100644 --- a/request.rest +++ b/request.rest @@ -2,7 +2,7 @@ POST http://localhost:3003/user/create Content-Type: application/json { - "email": "caroline@email.com", + "email": "carol@email.com", "name": "Carol", "password": "1234567", "role": "NORMAL" @@ -17,8 +17,10 @@ Content-Type: application/json "email":"bananinha@gmail.com" , "password": "1234567" } +// babaninha@gmail.com é um email com role de ADMIN ### +//só para admin POST http://localhost:3003/band/create Content-Type: application/json Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjQyY2E3MGJiLWMwNDgtNDEzZS1hY2YzLWZmYjg3NTgzOGFiNCIsInJvbGUiOiJBRE1JTiIsImlhdCI6MTY3ODU3OTUyMSwiZXhwIjoxNjc4NTgzMTIxfQ.HCWXKUlbH1XuZvJod2opbZRI94s2nihZHm_hxoHK9_E @@ -39,6 +41,7 @@ Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjQyY2E3MGJiLWMwNDgt } ### +// só admin POST http://localhost:3003/show/create Content-Type: application/json Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjQyY2E3MGJiLWMwNDgtNDEzZS1hY2YzLWZmYjg3NTgzOGFiNCIsInJvbGUiOiJBRE1JTiIsImlhdCI6MTY3ODYzMDExNSwiZXhwIjoxNjc4NjMzNzE1fQ.aO3l2iBhAtgnMC_yUNpbjP2vMRl0bduMA0j2WQHdUMI diff --git a/src/business/UserBusiness.ts b/src/business/UserBusiness.ts index f4efc45..a7c75cd 100644 --- a/src/business/UserBusiness.ts +++ b/src/business/UserBusiness.ts @@ -46,7 +46,7 @@ export class UserBusiness { const accessToken = authenticator.generateToken({ id, role: role }); - return accessToken; + return (accessToken); } catch (error: any) { throw new CustomError(400, error.message); diff --git a/src/controller/UserController.ts b/src/controller/UserController.ts index 9cd66ec..dd26796 100644 --- a/src/controller/UserController.ts +++ b/src/controller/UserController.ts @@ -19,7 +19,7 @@ export class UserController { const token = await userBusiness.createUser(input); - res.status(200).send({ token }); + res.status(200).send({token}); } catch (error: any) { res.status(400).send({ error: error.message }); diff --git a/src/data/ShowDatabase.ts b/src/data/ShowDatabase.ts index cc600ff..24d86e8 100644 --- a/src/data/ShowDatabase.ts +++ b/src/data/ShowDatabase.ts @@ -29,8 +29,6 @@ export class ShowDatabase extends BaseDatabase{ .join("shows as s","s.band_id", "b.id") .where({week_day: weekDay}) .orderBy("s.start_time", "asc") - - console.log(result); return (result) From 219f8ad41553fda9a15ce6428f01293953f0e65d Mon Sep 17 00:00:00 2001 From: MartinsCaroline <102299433+CarolineMartins09@users.noreply.github.com> Date: Sun, 12 Mar 2023 13:42:51 -0300 Subject: [PATCH 21/31] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3e36773..5709860 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ Como você deve saber muito bem, o nosso querido chefinho Astrodev é uma pessoa ✅ Cadastrar pessoas usuária;
✅ Login;
✅ Registrar banda (com autorização administrativa)
-✅ Visualizar detalhes da banda
; +✅ Visualizar detalhes da banda
✅ Pegar todos os shows de uma data
--- From 8f152cbec030de057c4b35dbb654c3d0e0dfca95 Mon Sep 17 00:00:00 2001 From: MartinsCaroline <102299433+CarolineMartins09@users.noreply.github.com> Date: Sun, 12 Mar 2023 13:44:27 -0300 Subject: [PATCH 22/31] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 5709860..2ee0cbe 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,7 @@ Como você deve saber muito bem, o nosso querido chefinho Astrodev é uma pessoa ✅ Login;
✅ Registrar banda (com autorização administrativa)
✅ Visualizar detalhes da banda
+⬛ Adicionar show a um dia
✅ Pegar todos os shows de uma data
--- From ed23b2e80b6f5c677e09c580c751ab7dbb253283 Mon Sep 17 00:00:00 2001 From: carolinemartins Date: Sun, 12 Mar 2023 14:00:53 -0300 Subject: [PATCH 23/31] conf --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 1bfdefe..0d74422 100644 --- a/package.json +++ b/package.json @@ -4,8 +4,8 @@ "description": "Projeto LAMA", "main": "index.js", "scripts": { - "dev": "ts-node-dev ./src/index.ts", - "start": "tsc && node ./build/index.js" + "start": "tsc && node build/index.js", + "dev": "ts-node-dev ./src/index.ts" }, "keywords": [ "api", From 82c0caa624cef49a1704ec21f5b26a94b3320ae1 Mon Sep 17 00:00:00 2001 From: carolinemartins Date: Sun, 12 Mar 2023 14:03:29 -0300 Subject: [PATCH 24/31] port --- src/index.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index 22fe825..3f58893 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,7 +4,9 @@ import express from "express"; import { userRouter } from "./routes/userRouter"; import { bandRouter } from "./routes/bandRouter"; import { showRouter } from "./routes/showRouter"; + dotenv.config(); + const app = express(); app.use(express.json()); @@ -16,7 +18,7 @@ app.use("/band", bandRouter); app.use("/show", showRouter); -const server = app.listen(3003, () => { +const server = app.listen(process.env.DB_PORT || 3003, () => { if (server) { const address = server.address() as AddressInfo; console.log(`Servidor rodando em http://localhost:${address.port}`); From acb8a72871a19c4c52655ee8e091a04d50575487 Mon Sep 17 00:00:00 2001 From: carolinemartins Date: Mon, 13 Mar 2023 13:07:57 -0300 Subject: [PATCH 25/31] app,index separado --- src/app.ts | 18 ++++++++++++++++++ src/index.ts | 17 +---------------- 2 files changed, 19 insertions(+), 16 deletions(-) create mode 100644 src/app.ts diff --git a/src/app.ts b/src/app.ts new file mode 100644 index 0000000..334e131 --- /dev/null +++ b/src/app.ts @@ -0,0 +1,18 @@ +import express from 'express' +import cors from 'cors' +import { AddressInfo } from "net"; + +export const app = express() + +app.use(express.json()) +app.use(cors()) + + +const server = app.listen(process.env.PORT || 3003, () => { + if (server) { + const address = server.address() as AddressInfo; + console.log(`Server is running in http://localhost:${address.port}`); + } else { + console.error("failure upon starting server"); + } +}) \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 3f58893..6a840fd 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,15 +1,8 @@ -import dotenv from "dotenv"; -import { AddressInfo } from "net"; -import express from "express"; +import {app} from "./app"; import { userRouter } from "./routes/userRouter"; import { bandRouter } from "./routes/bandRouter"; import { showRouter } from "./routes/showRouter"; -dotenv.config(); - -const app = express(); - -app.use(express.json()); ///ENDPOINT USER app.use("/user", userRouter); @@ -18,11 +11,3 @@ app.use("/band", bandRouter); app.use("/show", showRouter); -const server = app.listen(process.env.DB_PORT || 3003, () => { - if (server) { - const address = server.address() as AddressInfo; - console.log(`Servidor rodando em http://localhost:${address.port}`); - } else { - console.error(`Falha ao rodar o servidor.`); - } -}); \ No newline at end of file From 657dd20ca77c75504111c02016c3af6c1c6e6963 Mon Sep 17 00:00:00 2001 From: carolinemartins Date: Mon, 13 Mar 2023 15:19:00 -0300 Subject: [PATCH 26/31] readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3e36773..086ddb7 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ Sem validação de horário

🔗 Link Render:

-[---LINK AQUI---](https://lama-barros-caroline-martins.onrender.com) +[---LINK AQUI---](https://carol-barros-barros.onrender.com) --- From 4905085ed8f7230a6e92b51ab2e52461f59e67f2 Mon Sep 17 00:00:00 2001 From: MartinsCaroline <102299433+CarolineMartins09@users.noreply.github.com> Date: Mon, 13 Mar 2023 17:25:05 -0300 Subject: [PATCH 27/31] Update README.md --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index e989e0b..3a60a6e 100644 --- a/README.md +++ b/README.md @@ -6,13 +6,14 @@ Como você deve saber muito bem, o nosso querido chefinho Astrodev é uma pessoa ✅ Login;
✅ Registrar banda (com autorização administrativa)
✅ Visualizar detalhes da banda
-⬛ Adicionar show a um dia
+✅ Adicionar show a um dia
✅ Pegar todos os shows de uma data
---

❌ Problemas:

-Show não está retornando erro para marcar na mesma hora e dia.(ou seja pode marcar diversos shows simultaneamente) +Show não está retornando erro para marcar na mesma hora e dia.
+(ou seja pode marcar diversos shows simultaneamente) Sem validação de horário --- @@ -77,5 +78,5 @@ Ainda no .env, preencher também as variáveis: JWT_KEY: , (palavra passe) BCRYPT_COST: , (cost da lib Bcrypt, geralmente 12) - ACCESS_TOKEN_EXPIRES_IN = 60min + ACCESS_TOKEN_EXPIRES_IN = 1day From 8b7b14edf5c175c354be0e1979b1ca5fea3fc9a2 Mon Sep 17 00:00:00 2001 From: carolinemartins Date: Tue, 14 Mar 2023 21:21:19 -0300 Subject: [PATCH 28/31] erros if --- request.rest | 14 +++++++++----- src/app.ts | 3 +++ src/business/ShowBusiness.ts | 16 +++++++--------- src/data/BaseDatabase.ts | 8 +++++++- src/index.ts | 4 ++++ src/model/Show.ts | 6 +++--- src/services/Authenticator.ts | 3 +++ src/services/HashManager.ts | 2 ++ 8 files changed, 38 insertions(+), 18 deletions(-) diff --git a/request.rest b/request.rest index 2665ca3..0046607 100644 --- a/request.rest +++ b/request.rest @@ -2,8 +2,8 @@ POST http://localhost:3003/user/create Content-Type: application/json { - "email": "carol@email.com", - "name": "Carol", + "email": "caroSEMIF@platnao", + "name": "Plantão", "password": "1234567", "role": "NORMAL" @@ -17,6 +17,7 @@ Content-Type: application/json "email":"bananinha@gmail.com" , "password": "1234567" } + // babaninha@gmail.com é um email com role de ADMIN ### @@ -44,10 +45,10 @@ Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjQyY2E3MGJiLWMwNDgt // só admin POST http://localhost:3003/show/create Content-Type: application/json -Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjQyY2E3MGJiLWMwNDgtNDEzZS1hY2YzLWZmYjg3NTgzOGFiNCIsInJvbGUiOiJBRE1JTiIsImlhdCI6MTY3ODYzMDExNSwiZXhwIjoxNjc4NjMzNzE1fQ.aO3l2iBhAtgnMC_yUNpbjP2vMRl0bduMA0j2WQHdUMI +Authorization:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjQyY2E3MGJiLWMwNDgtNDEzZS1hY2YzLWZmYjg3NTgzOGFiNCIsInJvbGUiOiJBRE1JTiIsImlhdCI6MTY3ODgzOTU1MSwiZXhwIjoxNjc5MTg1MTUxfQ.7rfJBH13HaK2ututuVsEVzogBKGiu9H7EpO3fXXjH14 { - "weekDay": "do", + "weekDay": "DOMINGO", "startTime": 9, "endTime": 11, "bandId": "70d93276-59d5-44b2-98cb-c36f74696255" @@ -60,4 +61,7 @@ Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjQyY2E3MGJiLWMwNDgt { "weekDay": "domingo" -} \ No newline at end of file +} + +### +GET http://localhost:3003/ \ No newline at end of file diff --git a/src/app.ts b/src/app.ts index 334e131..f0a1512 100644 --- a/src/app.ts +++ b/src/app.ts @@ -1,6 +1,9 @@ import express from 'express' import cors from 'cors' import { AddressInfo } from "net"; +import dotenv from "dotenv" + +dotenv.config() export const app = express() diff --git a/src/business/ShowBusiness.ts b/src/business/ShowBusiness.ts index 340bdfa..a38fd8d 100644 --- a/src/business/ShowBusiness.ts +++ b/src/business/ShowBusiness.ts @@ -13,19 +13,17 @@ export class ShowBusiness{ createShow = async ({weekDay, startTime, endTime, bandId, idAutentication}:InputShow)=>{ try{ + if(!startTime || !endTime || !bandId){ throw new CustomError(400, "Invalid startTime or endTime or bandId") } - // if(weekDay.toUpperCase() !== WeekDayEnum.SEXTA ){ - // throw new CustomError(400, "Invalid week day 'sexta', 'sabado' or 'domingo' "); - // } - // if(weekDay.toUpperCase() !== WeekDayEnum.SABADO){ - // throw new CustomError(400, "Invalid week day 'sabado' "); - // } - // if(weekDay.toUpperCase() !== WeekDayEnum.DOMINGO){ - // throw new CustomError(400, "Invalid week day 'domingo' "); - // } + if(weekDay.toUpperCase() === WeekDayEnum.SEXTA || weekDay.toUpperCase() === WeekDayEnum.SABADO || weekDay.toUpperCase() === WeekDayEnum.DOMINGO){ + + }else{ + throw new CustomError(400, "Invalid 'SEXT' ") + } + const id = idGenerator.generate() diff --git a/src/data/BaseDatabase.ts b/src/data/BaseDatabase.ts index 5a36830..52daee7 100644 --- a/src/data/BaseDatabase.ts +++ b/src/data/BaseDatabase.ts @@ -1,7 +1,13 @@ import knex, { Knex } from "knex"; +import dotenv from "dotenv" +dotenv.config() export abstract class BaseDatabase { - + // DB_HOST = 35.226.146.116 + // DB_USER = "4416152-caroline-martins" + // DB_PASSWORD = "YH1fV093Kl57DXfCnDFY" + // DB_DATABASE_NAME = "jbl-4416152-caroline-martins" + private static connection: Knex | null = null; protected getConnection(): Knex{ diff --git a/src/index.ts b/src/index.ts index 6a840fd..94b537c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,6 +2,7 @@ import {app} from "./app"; import { userRouter } from "./routes/userRouter"; import { bandRouter } from "./routes/bandRouter"; import { showRouter } from "./routes/showRouter"; +import { Request, Response } from "express"; ///ENDPOINT USER @@ -11,3 +12,6 @@ app.use("/band", bandRouter); app.use("/show", showRouter); +app.get("/",(req:Request, res:Response)=>{ + res.send("FUNCIONANDO AQUI!") +}) \ No newline at end of file diff --git a/src/model/Show.ts b/src/model/Show.ts index a5376b7..69df911 100644 --- a/src/model/Show.ts +++ b/src/model/Show.ts @@ -15,9 +15,9 @@ export interface InputShow { } export enum WeekDayEnum{ - SEXTA = "sexta", - SABADO = "sabado", - DOMINGO = "domingo" + SEXTA = "SEXTA", + SABADO = "SABADO", + DOMINGO = "DOMINGO" } export interface CreateShow{ diff --git a/src/services/Authenticator.ts b/src/services/Authenticator.ts index 75d6805..c73fb67 100644 --- a/src/services/Authenticator.ts +++ b/src/services/Authenticator.ts @@ -1,5 +1,7 @@ import * as jwt from "jsonwebtoken" +import dotenv from "dotenv" +dotenv.config() interface AuthenticationData { id: string; role?: string; @@ -17,6 +19,7 @@ export class Authenticator { expiresIn } ); + return token; } diff --git a/src/services/HashManager.ts b/src/services/HashManager.ts index 22e4c54..e338ffd 100644 --- a/src/services/HashManager.ts +++ b/src/services/HashManager.ts @@ -1,5 +1,7 @@ import * as bcrypt from "bcryptjs"; +import dotenv from "dotenv" +dotenv.config() export class HashManager { From 986ff8f6699eb7b17742e1a9071028e949e91620 Mon Sep 17 00:00:00 2001 From: MartinsCaroline <102299433+CarolineMartins09@users.noreply.github.com> Date: Tue, 14 Mar 2023 21:23:19 -0300 Subject: [PATCH 29/31] Update README.md --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 3a60a6e..086c5ab 100644 --- a/README.md +++ b/README.md @@ -12,8 +12,6 @@ Como você deve saber muito bem, o nosso querido chefinho Astrodev é uma pessoa ---

❌ Problemas:

-Show não está retornando erro para marcar na mesma hora e dia.
-(ou seja pode marcar diversos shows simultaneamente) Sem validação de horário --- From 4a4cfac26b477b3009ba4ae7cf3e892264f580d8 Mon Sep 17 00:00:00 2001 From: carolinemartins Date: Tue, 21 Mar 2023 19:19:18 -0300 Subject: [PATCH 30/31] erro create band --- src/business/BandBusiness.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/business/BandBusiness.ts b/src/business/BandBusiness.ts index 8e9c846..f494d39 100644 --- a/src/business/BandBusiness.ts +++ b/src/business/BandBusiness.ts @@ -24,7 +24,7 @@ export class BandBusiness { const idUser = authenticator.getData(idAutorization) - if(idUser.role !== UserRole.ADMIN){ + if(idUser.role?.toUpperCase() !== UserRole.ADMIN){ throw new Error("Only a normal user can access this funcionality"); } From 1c43a487c80e5dc202436e65cb288285d20ac5f4 Mon Sep 17 00:00:00 2001 From: MartinsCaroline <102299433+CarolineMartins09@users.noreply.github.com> Date: Tue, 8 Aug 2023 10:44:25 -0300 Subject: [PATCH 31/31] Update BaseDatabase.ts --- src/data/BaseDatabase.ts | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/data/BaseDatabase.ts b/src/data/BaseDatabase.ts index 52daee7..de2d787 100644 --- a/src/data/BaseDatabase.ts +++ b/src/data/BaseDatabase.ts @@ -3,11 +3,7 @@ import dotenv from "dotenv" dotenv.config() export abstract class BaseDatabase { - // DB_HOST = 35.226.146.116 - // DB_USER = "4416152-caroline-martins" - // DB_PASSWORD = "YH1fV093Kl57DXfCnDFY" - // DB_DATABASE_NAME = "jbl-4416152-caroline-martins" - + private static connection: Knex | null = null; protected getConnection(): Knex{ @@ -33,4 +29,4 @@ export abstract class BaseDatabase { BaseDatabase.connection = null; } } -} \ No newline at end of file +}