From d872189f54139e6658fbe152cbfc5f2a3098e882 Mon Sep 17 00:00:00 2001 From: Pape Mayel Diagne THIAM Date: Tue, 23 Jul 2024 14:18:53 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=A4=8C=20add=20full=20example=20use=20of?= =?UTF-8?q?=20the=20template,=20otp=20mail=20&=20blob=20service=20from=20v?= =?UTF-8?q?ercel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- env/.env => .env | 21 + .gitignore | 5 +- README.md | 2 + env/.env.dev | 12 - env/.env.prod | 12 - package-lock.json | 490 ++++++++++- package.json | 22 +- prisma/schema.prisma | 30 +- public/swagger.json | 786 +++++++++++++++++- .../overview-server-running-browser.png | Bin 11225 -> 179536 bytes src/app.ts | 48 +- src/contexts/context.test.ts | 10 + src/contexts/context.ts | 22 + src/controllers/admin.controller.ts | 210 +++++ src/controllers/user.controller.ts | 27 - src/dependency-injection.ts | 8 + src/enums/role.enum.ts | 2 +- src/middlewares/auth.middleware.ts | 28 + src/middlewares/user.middleware.ts | 0 src/models/admin.model.ts | 15 + src/models/otp.model.ts | 13 + src/models/user-input.model.ts | 7 + src/repositories/admin.repository.ts | 149 ++++ src/repositories/otp.repository.test.ts | 122 +++ src/repositories/otp.repository.ts | 87 ++ src/repositories/user.repositories.ts | 0 ...er.routes.test.ts => admin.routes.test.ts} | 0 src/routes/admin.routes.ts | 87 ++ src/routes/user.routes.ts | 14 - src/services/admin.service.ts | 78 ++ src/services/auth.service.ts | 27 + src/services/blob.service.ts | 47 ++ src/services/email.service.ts | 51 ++ src/services/otp.service.ts | 91 ++ src/utils/constants.ts | 23 + src/utils/mapping.ts | 15 + tsconfig.json | 8 +- 37 files changed, 2435 insertions(+), 134 deletions(-) rename env/.env => .env (61%) delete mode 100644 env/.env.dev delete mode 100644 env/.env.prod create mode 100644 src/contexts/context.test.ts create mode 100644 src/contexts/context.ts create mode 100644 src/controllers/admin.controller.ts delete mode 100644 src/controllers/user.controller.ts create mode 100644 src/dependency-injection.ts create mode 100644 src/middlewares/auth.middleware.ts delete mode 100644 src/middlewares/user.middleware.ts create mode 100644 src/models/admin.model.ts create mode 100644 src/models/otp.model.ts create mode 100644 src/models/user-input.model.ts create mode 100644 src/repositories/admin.repository.ts create mode 100644 src/repositories/otp.repository.test.ts create mode 100644 src/repositories/otp.repository.ts delete mode 100644 src/repositories/user.repositories.ts rename src/routes/{user.routes.test.ts => admin.routes.test.ts} (100%) create mode 100644 src/routes/admin.routes.ts delete mode 100644 src/routes/user.routes.ts create mode 100644 src/services/admin.service.ts create mode 100644 src/services/auth.service.ts create mode 100644 src/services/blob.service.ts create mode 100644 src/services/email.service.ts create mode 100644 src/services/otp.service.ts create mode 100644 src/utils/constants.ts create mode 100644 src/utils/mapping.ts diff --git a/env/.env b/.env similarity index 61% rename from env/.env rename to .env index 524d93e..b1c897b 100644 --- a/env/.env +++ b/.env @@ -2,6 +2,27 @@ NODE_ENV=template PORT=3000 API_URL=http://localhost:3000 +ACCESS_SECRET_TOKEN='' +REFRESH_SECRET_TOKEN='' + +# BOT MAIL FOR SENDING OTP +BOT_MAIL_ADDRESS='' +BOT_EMAIL_PASSWORD='' + + +# TO BE REPLACED BY YOUR TWILIO API KEY AND ACCOUNT SID AND AUTH TOKEN +TEXT_FLOW_API_KEY='' +TWILIO_ACCOUNT_SID='' +TWILIO_SERVICE_SID='' +TWILIO_AUTH_TOKEN='' + +# PAYTECH API KEY & API SECRET +PAYTECH_API_KEY='' +PAYTECH_API_SECRET='' + +# Vercel Blob +BLOB_READ_WRITE_TOKEN='' + # This was inserted by `prisma init`: # Environment variables declared in this file are automatically made available to Prisma. diff --git a/.gitignore b/.gitignore index ab90406..49bf737 100644 --- a/.gitignore +++ b/.gitignore @@ -13,4 +13,7 @@ public #db persistance pg_db #coverage test -coverage \ No newline at end of file +coverage +#ignore +.env.dev +.env.prod diff --git a/README.md b/README.md index d16d1cd..34f1882 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,8 @@ This is an opinionated boilerplate (template or skeleton, whatever you want) for git clone https://github.com/mayel15/node-express-template ``` +- 👽 Create an `environment files` at the root of the project and name them `.env.dev` for `dev environment` and `.env.prod` for `prod environment`. And after that, in those files add the `environment variables` you need by inspiring you in the `environment template file` named `.env` + - 🚀 Run the server app with `Docker` ```sh diff --git a/env/.env.dev b/env/.env.dev deleted file mode 100644 index 19960d6..0000000 --- a/env/.env.dev +++ /dev/null @@ -1,12 +0,0 @@ -NODE_ENV=development -PORT=3000 -API_URL=http://localhost:3000 - -# This was inserted by `prisma init`: -# Environment variables declared in this file are automatically made available to Prisma. -# See the documentation for more detail: https://pris.ly/d/prisma-schema#accessing-environment-variables-from-the-schema - -# Prisma supports the native connection string format for PostgreSQL, MySQL, SQLite, SQL Server, MongoDB and CockroachDB. -# See the documentation for all the connection string options: https://pris.ly/d/connection-strings - -DATABASE_URL="postgresql://postgres:postgres@localhost:5435/node-express-template" \ No newline at end of file diff --git a/env/.env.prod b/env/.env.prod deleted file mode 100644 index b2476de..0000000 --- a/env/.env.prod +++ /dev/null @@ -1,12 +0,0 @@ -NODE_ENV=production -PORT=3000 -API_URL=http://localhost:3000 - -# This was inserted by `prisma init`: -# Environment variables declared in this file are automatically made available to Prisma. -# See the documentation for more detail: https://pris.ly/d/prisma-schema#accessing-environment-variables-from-the-schema - -# Prisma supports the native connection string format for PostgreSQL, MySQL, SQLite, SQL Server, MongoDB and CockroachDB. -# See the documentation for all the connection string options: https://pris.ly/d/connection-strings - -DATABASE_URL="postgresql://postgres:postgres@localhost:5435/node-express-template" \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 4534637..eac707f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,19 +9,25 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "@prisma/client": "^5.14.0", + "@prisma/client": "^5.17.0", "@types/node": "^20.12.12", + "@vercel/blob": "^0.23.4", "bcrypt": "^5.1.1", "dotenv": "^16.4.5", "dotenv-cli": "^7.4.2", + "joi": "^17.13.3", "jsonwebtoken": "^9.0.2", "morgan": "^1.10.0", + "multer": "^1.4.5-lts.1", + "nodemailer": "^6.9.14", + "randomstring": "^1.3.0", "reflect-metadata": "^0.2.2", "swagger-jsdoc": "^6.2.8", "swagger-ui-express": "^5.0.0", "ts-node": "^10.9.2", "tsoa": "^6.2.1", - "tsyringe": "^4.8.0" + "tsyringe": "^4.8.0", + "twilio": "^5.2.2" }, "devDependencies": { "@types/jest": "^29.5.12", @@ -31,8 +37,9 @@ "concurrently": "^8.2.2", "express": "^4.19.2", "jest": "^29.7.0", + "jest-mock-extended": "^3.0.7", "nodemon": "^3.1.0", - "prisma": "^5.14.0", + "prisma": "^5.17.0", "supertest": "^7.0.0", "ts-jest": "^29.1.3", "tslint": "^5.20.1", @@ -696,6 +703,15 @@ "node": ">=12" } }, + "node_modules/@fastify/busboy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, "node_modules/@hapi/accept": { "version": "6.0.3", "license": "BSD-3-Clause", @@ -1836,10 +1852,11 @@ } }, "node_modules/@prisma/client": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.14.0.tgz", - "integrity": "sha512-akMSuyvLKeoU4LeyBAUdThP/uhVP3GuLygFE3MlYzaCb3/J8SfsYBE5PkaFuLuVpLyA6sFoW+16z/aPhNAESqg==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.17.0.tgz", + "integrity": "sha512-N2tnyKayT0Zf7mHjwEyE8iG7FwTmXDHFZ1GnNhQp0pJUObsuel4ZZ1XwfuAYkq5mRIiC/Kot0kt0tGCfLJ70Jw==", "hasInstallScript": true, + "license": "Apache-2.0", "engines": { "node": ">=16.13" }, @@ -1853,50 +1870,82 @@ } }, "node_modules/@prisma/debug": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.14.0.tgz", - "integrity": "sha512-iq56qBZuFfX3fCxoxT8gBX33lQzomBU0qIUaEj1RebsKVz1ob/BVH1XSBwwwvRVtZEV1b7Fxx2eVu34Ge/mg3w==", - "devOptional": true + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.17.0.tgz", + "integrity": "sha512-l7+AteR3P8FXiYyo496zkuoiJ5r9jLQEdUuxIxNCN1ud8rdbH3GTxm+f+dCyaSv9l9WY+29L9czaVRXz9mULfg==", + "devOptional": true, + "license": "Apache-2.0" }, "node_modules/@prisma/engines": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.14.0.tgz", - "integrity": "sha512-lgxkKZ6IEygVcw6IZZUlPIfLQ9hjSYAtHjZ5r64sCLDgVzsPFCi2XBBJgzPMkOQ5RHzUD4E/dVdpn9+ez8tk1A==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.17.0.tgz", + "integrity": "sha512-+r+Nf+JP210Jur+/X8SIPLtz+uW9YA4QO5IXA+KcSOBe/shT47bCcRMTYCbOESw3FFYFTwe7vU6KTWHKPiwvtg==", "devOptional": true, "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "5.14.0", - "@prisma/engines-version": "5.14.0-25.e9771e62de70f79a5e1c604a2d7c8e2a0a874b48", - "@prisma/fetch-engine": "5.14.0", - "@prisma/get-platform": "5.14.0" + "@prisma/debug": "5.17.0", + "@prisma/engines-version": "5.17.0-31.393aa359c9ad4a4bb28630fb5613f9c281cde053", + "@prisma/fetch-engine": "5.17.0", + "@prisma/get-platform": "5.17.0" } }, "node_modules/@prisma/engines-version": { - "version": "5.14.0-25.e9771e62de70f79a5e1c604a2d7c8e2a0a874b48", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.14.0-25.e9771e62de70f79a5e1c604a2d7c8e2a0a874b48.tgz", - "integrity": "sha512-ip6pNkRo1UxWv+6toxNcYvItNYaqQjXdFNGJ+Nuk2eYtRoEdoF13wxo7/jsClJFFenMPVNVqXQDV0oveXnR1cA==", - "devOptional": true + "version": "5.17.0-31.393aa359c9ad4a4bb28630fb5613f9c281cde053", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.17.0-31.393aa359c9ad4a4bb28630fb5613f9c281cde053.tgz", + "integrity": "sha512-tUuxZZysZDcrk5oaNOdrBnnkoTtmNQPkzINFDjz7eG6vcs9AVDmA/F6K5Plsb2aQc/l5M2EnFqn3htng9FA4hg==", + "devOptional": true, + "license": "Apache-2.0" }, "node_modules/@prisma/fetch-engine": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-5.14.0.tgz", - "integrity": "sha512-VrheA9y9DMURK5vu8OJoOgQpxOhas3qF0IBHJ8G/0X44k82kc8E0w98HCn2nhnbOOMwbWsJWXfLC2/F8n5u0gQ==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-5.17.0.tgz", + "integrity": "sha512-ESxiOaHuC488ilLPnrv/tM2KrPhQB5TRris/IeIV4ZvUuKeaicCl4Xj/JCQeG9IlxqOgf1cCg5h5vAzlewN91Q==", "devOptional": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "5.14.0", - "@prisma/engines-version": "5.14.0-25.e9771e62de70f79a5e1c604a2d7c8e2a0a874b48", - "@prisma/get-platform": "5.14.0" + "@prisma/debug": "5.17.0", + "@prisma/engines-version": "5.17.0-31.393aa359c9ad4a4bb28630fb5613f9c281cde053", + "@prisma/get-platform": "5.17.0" } }, "node_modules/@prisma/get-platform": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-5.14.0.tgz", - "integrity": "sha512-/yAyBvcEjRv41ynZrhdrPtHgk47xLRRq/o5eWGcUpBJ1YrUZTYB8EoPiopnP7iQrMATK8stXQdPOoVlrzuTQZw==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-5.17.0.tgz", + "integrity": "sha512-UlDgbRozCP1rfJ5Tlkf3Cnftb6srGrEQ4Nm3og+1Se2gWmCZ0hmPIi+tQikGDUVLlvOWx3Gyi9LzgRP+HTXV9w==", "devOptional": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "5.14.0" + "@prisma/debug": "5.17.0" } }, + "node_modules/@sideway/address": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/address/node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", + "license": "BSD-3-Clause" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "license": "BSD-3-Clause" + }, "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", @@ -2320,6 +2369,22 @@ "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "dev": true }, + "node_modules/@vercel/blob": { + "version": "0.23.4", + "resolved": "https://registry.npmjs.org/@vercel/blob/-/blob-0.23.4.tgz", + "integrity": "sha512-cOU2e01RWZXFyc/OVRq+zZg38m34bcxpQk5insKp3Td9akNWThrXiF2URFHpRlm4fbaQ/l7pPSOB5nkLq+t6pw==", + "license": "Apache-2.0", + "dependencies": { + "async-retry": "^1.3.3", + "bytes": "^3.1.2", + "is-buffer": "^2.0.5", + "is-plain-object": "^5.0.0", + "undici": "^5.28.4" + }, + "engines": { + "node": ">=16.14" + } + }, "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -2430,6 +2495,12 @@ "node": ">= 8" } }, + "node_modules/append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==", + "license": "MIT" + }, "node_modules/aproba": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", @@ -2470,11 +2541,30 @@ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true }, + "node_modules/async-retry": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", + "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", + "license": "MIT", + "dependencies": { + "retry": "0.13.1" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/axios": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", + "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } }, "node_modules/babel-jest": { "version": "29.7.0", @@ -2806,8 +2896,7 @@ "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 + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "node_modules/builtin-modules": { "version": "1.1.1", @@ -2817,6 +2906,17 @@ "node": ">=0.10.0" } }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, "node_modules/bytes": { "version": "3.1.2", "license": "MIT", @@ -3010,7 +3110,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, "dependencies": { "delayed-stream": "~1.0.0" }, @@ -3036,6 +3135,51 @@ "version": "0.0.1", "license": "MIT" }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concat-stream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "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/concat-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==", + "license": "MIT" + }, + "node_modules/concat-stream/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==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/concurrently": { "version": "8.2.2", "dev": true, @@ -3185,6 +3329,12 @@ "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", "dev": true }, + "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==", + "license": "MIT" + }, "node_modules/create-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", @@ -3307,6 +3457,12 @@ "url": "https://opencollective.com/date-fns" } }, + "node_modules/dayjs": { + "version": "1.11.12", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.12.tgz", + "integrity": "sha512-Rt2g+nTbLlDWZTwwrIXjy9MeiZmSDI375FvZs72ngxx8PDC6YXOeR3q5LAuPzjZQxhiWdRKac7RKV+YyQYfYIg==", + "license": "MIT" + }, "node_modules/debug": { "version": "2.6.9", "license": "MIT", @@ -3356,7 +3512,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, "engines": { "node": ">=0.4.0" } @@ -3737,6 +3892,26 @@ "node": ">=8" } }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/foreground-child": { "version": "3.1.1", "license": "ISC", @@ -3755,7 +3930,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -4208,6 +4382,29 @@ "node": ">=8" } }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/is-core-module": { "version": "2.13.1", "dev": true, @@ -4262,6 +4459,15 @@ "node": ">=0.12.0" } }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -4284,6 +4490,12 @@ "url": "https://github.com/sponsors/mesqueeb" } }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, "node_modules/isexe": { "version": "2.0.0", "license": "ISC" @@ -5221,6 +5433,19 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-mock-extended": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/jest-mock-extended/-/jest-mock-extended-3.0.7.tgz", + "integrity": "sha512-7lsKdLFcW9B9l5NzZ66S/yTQ9k8rFtnwYdCNuRU/81fqDWicNDVhitTSPnrGmNeNm0xyw0JHexEOShrIKRCIRQ==", + "dev": true, + "dependencies": { + "ts-essentials": "^10.0.0" + }, + "peerDependencies": { + "jest": "^24.0.0 || ^25.0.0 || ^26.0.0 || ^27.0.0 || ^28.0.0 || ^29.0.0", + "typescript": "^3.0.0 || ^4.0.0 || ^5.0.0" + } + }, "node_modules/jest-pnp-resolver": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", @@ -5982,6 +6207,34 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/joi": { + "version": "17.13.3", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", + "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/joi/node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", + "license": "BSD-3-Clause" + }, + "node_modules/joi/node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -6377,7 +6630,6 @@ }, "node_modules/mkdirp": { "version": "0.5.6", - "dev": true, "license": "MIT", "dependencies": { "minimist": "^1.2.6" @@ -6414,6 +6666,24 @@ "version": "2.0.0", "license": "MIT" }, + "node_modules/multer": { + "version": "1.4.5-lts.1", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz", + "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==", + "license": "MIT", + "dependencies": { + "append-field": "^1.0.0", + "busboy": "^1.0.0", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.4", + "object-assign": "^4.1.1", + "type-is": "^1.6.4", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -6467,6 +6737,15 @@ "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "dev": true }, + "node_modules/nodemailer": { + "version": "6.9.14", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.14.tgz", + "integrity": "sha512-Dobp/ebDKBvz91sbtRKhcznLThrKxKt97GI2FAlAyy+fk19j73Uz3sBXolVtmcXjaorivqsbbbjDY+Jkt4/bQA==", + "license": "MIT-0", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/nodemon": { "version": "3.1.0", "dev": true, @@ -6818,13 +7097,14 @@ } }, "node_modules/prisma": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.14.0.tgz", - "integrity": "sha512-gCNZco7y5XtjrnQYeDJTiVZmT/ncqCr5RY1/Cf8X2wgLRmyh9ayPAGBNziI4qEE4S6SxCH5omQLVo9lmURaJ/Q==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.17.0.tgz", + "integrity": "sha512-m4UWkN5lBE6yevqeOxEvmepnL5cNPEjzMw2IqDB59AcEV6w7D8vGljDLd1gPFH+W6gUxw9x7/RmN5dCS/WTPxA==", "devOptional": true, "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.14.0" + "@prisma/engines": "5.17.0" }, "bin": { "prisma": "build/index.js" @@ -6833,6 +7113,12 @@ "node": ">=16.13" } }, + "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==", + "license": "MIT" + }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -6857,6 +7143,12 @@ "node": ">= 0.10" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, "node_modules/pstree.remy": { "version": "1.1.8", "dev": true, @@ -6891,6 +7183,27 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/randombytes": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.3.tgz", + "integrity": "sha512-lDVjxQQFoCG1jcrP06LNo2lbWp4QTShEXnhActFBwYuHprllQV6VUpwreApsYqCgD+N1mHoqJ/BI/4eV4R2GYg==", + "license": "MIT" + }, + "node_modules/randomstring": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/randomstring/-/randomstring-1.3.0.tgz", + "integrity": "sha512-gY7aQ4i1BgwZ8I1Op4YseITAyiDiajeZOPQUbIq9TPGPhUm5FX59izIaOpmKbME1nmnEiABf28d9K2VSii6BBg==", + "license": "MIT", + "dependencies": { + "randombytes": "2.0.3" + }, + "bin": { + "randomstring": "bin/randomstring" + }, + "engines": { + "node": "*" + } + }, "node_modules/range-parser": { "version": "1.2.1", "license": "MIT", @@ -7004,6 +7317,15 @@ "node": ">=10" } }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -7054,6 +7376,12 @@ "version": "2.1.2", "license": "MIT" }, + "node_modules/scmp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/scmp/-/scmp-2.1.0.tgz", + "integrity": "sha512-o/mRQGk9Rcer/jEEw/yw4mwo3EU/NvYvp577/Btqrym9Qy5/MdWGBqipbALgd2lrdWTJ5/gqDusxfnQBxOxT2Q==", + "license": "BSD-3-Clause" + }, "node_modules/semver": { "version": "5.7.2", "dev": true, @@ -7267,6 +7595,14 @@ "node": ">= 0.8" } }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -7639,6 +7975,20 @@ "node": ">=14.13.1" } }, + "node_modules/ts-essentials": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-10.0.0.tgz", + "integrity": "sha512-77FHNJEyysF9+1s4G6eejuA1lxw7uMchT3ZPy3CIbh7GIunffpshtM8pTe5G6N5dpOzNevqRHew859ceLWVBfw==", + "dev": true, + "peerDependencies": { + "typescript": ">=4.5.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/ts-jest": { "version": "29.1.3", "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.3.tgz", @@ -7809,6 +8159,24 @@ "node": ">= 6.0.0" } }, + "node_modules/twilio": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/twilio/-/twilio-5.2.2.tgz", + "integrity": "sha512-t2Nd8CvqAc0YxbJghKYQl1Vxc7e6SrWk4U28wwkarUohGcsUMLsGpYeGXKw1Va0KB9TGVZYCs8dcP4TdLJUN9Q==", + "license": "MIT", + "dependencies": { + "axios": "^1.6.8", + "dayjs": "^1.11.9", + "https-proxy-agent": "^5.0.0", + "jsonwebtoken": "^9.0.2", + "qs": "^6.9.4", + "scmp": "^2.1.0", + "xmlbuilder": "^13.0.2" + }, + "engines": { + "node": ">=14.0" + } + }, "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -7841,6 +8209,12 @@ "node": ">= 0.6" } }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "license": "MIT" + }, "node_modules/typescript": { "version": "5.4.5", "license": "Apache-2.0", @@ -7868,6 +8242,18 @@ "dev": true, "license": "MIT" }, + "node_modules/undici": { + "version": "5.28.4", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", + "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", + "license": "MIT", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, "node_modules/undici-types": { "version": "5.26.5", "license": "MIT" @@ -8126,6 +8512,24 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, + "node_modules/xmlbuilder": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-13.0.2.tgz", + "integrity": "sha512-Eux0i2QdDYKbdbA6AM6xE4m6ZTZr4G4xF9kahI2ukSEMCzwce2eX9WlTI5J3s+NU7hpasFsr8hWIONae7LluAQ==", + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, "node_modules/y18n": { "version": "5.0.8", "license": "ISC", diff --git a/package.json b/package.json index 607cc5a..1e176b3 100644 --- a/package.json +++ b/package.json @@ -4,13 +4,14 @@ "description": "backend app template with node, express, prisma, ts", "main": "dist/app.js", "scripts": { - "start": "tsc && node dist/app.js", - "test": "jest", + "start": "dotenv -e .env.prod -- node dist/app.js", + "dev": "dotenv -e .env.dev concurrently \"nodemon\" \"nodemon -x tsoa spec\"", + "test": "dotenv -e .env.dev jest", "predev": "npm run swagger", "prebuild": "npm run swagger", "build": "tsc", - "migrate:db": "npx prisma migrate dev", - "dev": "dotenv -e ./env/.env.dev concurrently \"nodemon\" \"nodemon -x tsoa spec\"", + "prisma:migrate:dev": "dotenv -e .env.dev -- npx prisma migrate dev", + "prisma:studio": "dotenv -e .env.dev -- npx prisma studio", "swagger": "tsoa spec" }, "nodemonConfig": { @@ -30,26 +31,33 @@ "concurrently": "^8.2.2", "express": "^4.19.2", "jest": "^29.7.0", + "jest-mock-extended": "^3.0.7", "nodemon": "^3.1.0", - "prisma": "^5.14.0", + "prisma": "^5.17.0", "supertest": "^7.0.0", "ts-jest": "^29.1.3", "tslint": "^5.20.1", "typescript": "^5.4.5" }, "dependencies": { - "@prisma/client": "^5.14.0", + "@prisma/client": "^5.17.0", "@types/node": "^20.12.12", + "@vercel/blob": "^0.23.4", "bcrypt": "^5.1.1", "dotenv": "^16.4.5", "dotenv-cli": "^7.4.2", + "joi": "^17.13.3", "jsonwebtoken": "^9.0.2", "morgan": "^1.10.0", + "multer": "^1.4.5-lts.1", + "nodemailer": "^6.9.14", + "randomstring": "^1.3.0", "reflect-metadata": "^0.2.2", "swagger-jsdoc": "^6.2.8", "swagger-ui-express": "^5.0.0", "ts-node": "^10.9.2", "tsoa": "^6.2.1", - "tsyringe": "^4.8.0" + "tsyringe": "^4.8.0", + "twilio": "^5.2.2" } } diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 7a73797..9c14607 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -14,8 +14,30 @@ datasource db { url = env("DATABASE_URL") } -model User { - id Int @id @default(autoincrement()) - email String @unique - name String? +enum Role { + ADMIN + USER +} + +model Otp { + id String @id @default(uuid()) + email String @unique + code String + createdAt DateTime @default(now()) + expiresAt DateTime +} + +model Admin { + id String @id @default(uuid()) + role Role @default(ADMIN) + firstName String + lastName String + email String @unique + emailVerified Boolean @default(false) + phoneNumber String? @unique + phoneNumberVerified Boolean? @default(false) + password String + + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt } diff --git a/public/swagger.json b/public/swagger.json index 37250aa..75a26d5 100644 --- a/public/swagger.json +++ b/public/swagger.json @@ -6,7 +6,98 @@ "parameters": {}, "requestBodies": {}, "responses": {}, - "schemas": {}, + "schemas": { + "Role": { + "enum": [ + "ADMIN", + "USER" + ], + "type": "string" + }, + "AdminModel": { + "properties": { + "id": { + "type": "string" + }, + "role": { + "$ref": "#/components/schemas/Role" + }, + "firstName": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "email": { + "type": "string" + }, + "emailVerified": { + "type": "boolean" + }, + "phoneNumber": { + "type": "string" + }, + "phoneNumberVerified": { + "type": "boolean" + }, + "password": { + "type": "string" + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "id", + "firstName", + "lastName", + "email", + "password" + ], + "type": "object", + "additionalProperties": false + }, + "UserInputModel": { + "properties": { + "firstName": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "phoneNumber": { + "type": "string" + }, + "email": { + "type": "string" + }, + "password": { + "type": "string" + } + }, + "required": [ + "firstName", + "lastName", + "phoneNumber", + "email", + "password" + ], + "type": "object", + "additionalProperties": false + }, + "_36_Enums.Role": { + "type": "string", + "enum": [ + "ADMIN", + "USER" + ] + } + }, "securitySchemes": {} }, "info": { @@ -21,9 +112,260 @@ } }, "paths": { - "/api/users": { + "/api/admin/all": { + "get": { + "operationId": "GetAllAdmins", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AdminModel" + } + } + } + } + }, + "security": [], + "parameters": [] + } + }, + "/api/admin/{id}": { "get": { - "operationId": "GetAllUsers", + "operationId": "GetAdminById", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AdminModel" + } + } + } + } + }, + "security": [], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ] + }, + "delete": { + "operationId": "DeleteAdmin", + "responses": { + "204": { + "description": "No content" + } + }, + "security": [], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/api/admin/login": { + "post": { + "operationId": "Login", + "responses": { + "201": { + "description": "The user is created", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "properties": { + "token": { + "type": "string" + }, + "message": { + "type": "string" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "password": { + "type": "string" + }, + "phoneNumberVerified": { + "type": "boolean" + }, + "phoneNumber": { + "type": "string" + }, + "emailVerified": { + "type": "boolean" + }, + "email": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "firstName": { + "type": "string" + }, + "role": { + "$ref": "#/components/schemas/Role" + }, + "id": { + "type": "string" + } + }, + "required": [ + "token", + "message", + "password", + "email", + "lastName", + "firstName", + "id" + ], + "type": "object" + }, + { + "type": "string", + "enum": [ + "Invalid phone number", + "Invalid password" + ] + } + ] + } + } + } + } + }, + "security": [], + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "properties": { + "password": { + "type": "string" + }, + "email": { + "type": "string" + } + }, + "required": [ + "password", + "email" + ], + "type": "object" + } + } + } + } + } + }, + "/api/admin/signup": { + "post": { + "operationId": "CreateAdmin", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "properties": { + "token": { + "type": "string" + }, + "message": { + "type": "string" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "password": { + "type": "string" + }, + "phoneNumberVerified": { + "type": "boolean" + }, + "phoneNumber": { + "type": "string" + }, + "emailVerified": { + "type": "boolean" + }, + "email": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "firstName": { + "type": "string" + }, + "role": { + "$ref": "#/components/schemas/Role" + }, + "id": { + "type": "string" + } + }, + "required": [ + "token", + "message", + "password", + "email", + "lastName", + "firstName", + "id" + ], + "type": "object" + } + } + } + } + }, + "security": [], + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserInputModel" + } + } + } + } + } + }, + "/api/admin/email/otp/send": { + "post": { + "operationId": "SendOtp", "responses": { "200": { "description": "Ok", @@ -45,10 +387,30 @@ } }, "security": [], - "parameters": [] - }, + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "properties": { + "email": { + "type": "string" + } + }, + "required": [ + "email" + ], + "type": "object" + } + } + } + } + } + }, + "/api/admin/email/otp/verify": { "post": { - "operationId": "CreateUser", + "operationId": "VerifyOtp", "responses": { "200": { "description": "Ok", @@ -70,7 +432,417 @@ } }, "security": [], - "parameters": [] + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "properties": { + "otp": { + "type": "string" + }, + "email": { + "type": "string" + } + }, + "required": [ + "otp", + "email" + ], + "type": "object" + } + } + } + } + } + }, + "/api/admin/{id}/password": { + "put": { + "operationId": "UpdatePassword", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "properties": { + "updatedAt": { + "type": "string", + "format": "date-time" + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "password": { + "type": "string" + }, + "phoneNumberVerified": { + "type": "boolean" + }, + "phoneNumber": { + "type": "string" + }, + "emailVerified": { + "type": "boolean" + }, + "email": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "firstName": { + "type": "string" + }, + "role": { + "$ref": "#/components/schemas/_36_Enums.Role" + }, + "id": { + "type": "string" + } + }, + "required": [ + "updatedAt", + "createdAt", + "password", + "phoneNumberVerified", + "phoneNumber", + "emailVerified", + "email", + "lastName", + "firstName", + "role", + "id" + ], + "type": "object" + } + } + } + } + }, + "security": [], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "properties": { + "password": { + "type": "string" + } + }, + "required": [ + "password" + ], + "type": "object" + } + } + } + } + } + }, + "/api/admin/{id}/email": { + "put": { + "operationId": "UpdateEmail", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "properties": { + "updatedAt": { + "type": "string", + "format": "date-time" + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "password": { + "type": "string" + }, + "phoneNumberVerified": { + "type": "boolean" + }, + "phoneNumber": { + "type": "string" + }, + "emailVerified": { + "type": "boolean" + }, + "email": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "firstName": { + "type": "string" + }, + "role": { + "$ref": "#/components/schemas/_36_Enums.Role" + }, + "id": { + "type": "string" + } + }, + "required": [ + "updatedAt", + "createdAt", + "password", + "phoneNumberVerified", + "phoneNumber", + "emailVerified", + "email", + "lastName", + "firstName", + "role", + "id" + ], + "type": "object" + } + } + } + } + }, + "security": [], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "properties": { + "email": { + "type": "string" + } + }, + "required": [ + "email" + ], + "type": "object" + } + } + } + } + } + }, + "/api/admin/{id}/phone-number": { + "put": { + "operationId": "UpdatePhoneNumber", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "properties": { + "updatedAt": { + "type": "string", + "format": "date-time" + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "password": { + "type": "string" + }, + "phoneNumberVerified": { + "type": "boolean" + }, + "phoneNumber": { + "type": "string" + }, + "emailVerified": { + "type": "boolean" + }, + "email": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "firstName": { + "type": "string" + }, + "role": { + "$ref": "#/components/schemas/_36_Enums.Role" + }, + "id": { + "type": "string" + } + }, + "required": [ + "updatedAt", + "createdAt", + "password", + "phoneNumberVerified", + "phoneNumber", + "emailVerified", + "email", + "lastName", + "firstName", + "role", + "id" + ], + "type": "object" + } + } + } + } + }, + "security": [], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "properties": { + "phoneNumber": { + "type": "string" + } + }, + "required": [ + "phoneNumber" + ], + "type": "object" + } + } + } + } + } + }, + "/api/admin/{id}/full-name": { + "put": { + "operationId": "UpdateFullName", + "responses": { + "200": { + "description": "Ok", + "content": { + "application/json": { + "schema": { + "properties": { + "updatedAt": { + "type": "string", + "format": "date-time" + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "password": { + "type": "string" + }, + "phoneNumberVerified": { + "type": "boolean" + }, + "phoneNumber": { + "type": "string" + }, + "emailVerified": { + "type": "boolean" + }, + "email": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "firstName": { + "type": "string" + }, + "role": { + "$ref": "#/components/schemas/_36_Enums.Role" + }, + "id": { + "type": "string" + } + }, + "required": [ + "updatedAt", + "createdAt", + "password", + "phoneNumberVerified", + "phoneNumber", + "emailVerified", + "email", + "lastName", + "firstName", + "role", + "id" + ], + "type": "object" + } + } + } + } + }, + "security": [], + "parameters": [ + { + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "properties": { + "lastName": { + "type": "string" + }, + "firstName": { + "type": "string" + } + }, + "required": [ + "lastName", + "firstName" + ], + "type": "object" + } + } + } + } } } }, diff --git a/readme-images/overview-server-running-browser.png b/readme-images/overview-server-running-browser.png index 1e22815c08f570b17905139520768eae0bd1500b..cc282a4b45219e809420baee2cdc57d72ff00ce6 100644 GIT binary patch literal 179536 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

U8N6lGYpD1!&4t?~u3zj(L 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 Q?14Y(Dmu#Lis!HVABqtcUjP6A literal 11225 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 HOyU0vm1;^% diff --git a/src/app.ts b/src/app.ts index 554f202..65faeb0 100644 --- a/src/app.ts +++ b/src/app.ts @@ -1,7 +1,7 @@ // src/app.ts import express from "express"; import dotenv from "dotenv"; -import userRoutes from "./routes/user.routes"; +import adminRoutes from "./routes/admin.routes"; import swaggerUi from "swagger-ui-express"; import morgan from "morgan"; @@ -24,12 +24,54 @@ app.use( }) ); -app.use("/api/users", userRoutes); +app.use("/api/admin", adminRoutes); const PORT = process.env.PORT || 3000; app.get("/", (req, res) => { - res.send({ message: "Welcome to the template server dude!" }); + res.send({ + message: "Welcome to the template server dude!", + swaggerDocs: "http://localhost:3000/docs", + commands: [ + { + exec: "npm install", + description: "Install dependencies", + }, + { + exec: "npm run dev", + description: "Start the development server", + }, + { + exec: "npm run build", + description: "Build the project", + }, + { + exec: "npm run start", + description: "Start the production server", + }, + { + exec: "npm run test", + description: "Run tests", + }, + { + exec: "npm run swagger", + description: "Generate swagger documentation", + }, + { + exec: "npm run prisma:studio", + description: "Launch Prisma Studio for database management", + }, + { + exec: "npm run prisma:migrate:dev", + description: "Migrate the database", + }, + ], + author: { + name: "Pape THIAM", + github: "https://github.com/mayel15", + }, + version: "1.0.0", + }); }); app.listen(PORT, () => { diff --git a/src/contexts/context.test.ts b/src/contexts/context.test.ts new file mode 100644 index 0000000..6fcb6ff --- /dev/null +++ b/src/contexts/context.test.ts @@ -0,0 +1,10 @@ +import { MockContext, Context, createMockContext } from "./context"; + +// before any tests +let mockCtx: MockContext; +let ctx: Context; + +beforeEach(() => { + mockCtx = createMockContext(); + ctx = mockCtx as unknown as Context; +}); diff --git a/src/contexts/context.ts b/src/contexts/context.ts new file mode 100644 index 0000000..7c80543 --- /dev/null +++ b/src/contexts/context.ts @@ -0,0 +1,22 @@ +import { PrismaClient } from "@prisma/client"; +import { mockDeep, DeepMockProxy } from "jest-mock-extended"; +import { injectable } from "tsyringe"; + +export type Context = { + prisma: PrismaClient; +}; + +// create the context +export const context: Context = { + prisma: new PrismaClient(), +}; + +export type MockContext = { + prisma: DeepMockProxy; +}; + +export const createMockContext = (): MockContext => { + return { + prisma: mockDeep(), + }; +}; diff --git a/src/controllers/admin.controller.ts b/src/controllers/admin.controller.ts new file mode 100644 index 0000000..021cfea --- /dev/null +++ b/src/controllers/admin.controller.ts @@ -0,0 +1,210 @@ +// src/users/user.ontroller.ts +import { PrismaClient } from "@prisma/client"; + +import { + Route, + Get, + Post, + Controller, + Body, + Path, + Delete, + Put, + SuccessResponse, +} from "tsoa"; +import jwt from "jsonwebtoken"; +import { AdminService } from "../services/admin.service"; +import * as dotenv from "dotenv"; +import bcrypt from "bcrypt"; +import { autoInjectable, inject, injectable } from "tsyringe"; +import { OtpService } from "../services/otp.service"; +import { AuthService } from "../services/auth.service"; +import { UserInputModel } from "../models/user-input.model"; +import { ACCESS_TOKEN_EXPIRATION_TIME_WEB } from "../utils/constants"; + +@Route("api/admin") +@injectable() +export default class AdminController { + constructor( + @inject(AdminService) private adminService: AdminService, + @inject(AuthService) private authService: AuthService, + @inject(OtpService) private otpService: OtpService + ) {} + + // GET + + @Get("/all") + public async getAllAdmins() { + try { + const admins = await this.adminService.getAllAdmins(); + return admins; + } catch (error) { + throw new Error("Admin not found"); + } + } + + @Get("{id}") + public async getAdminById(@Path() id: string) { + const admin = await this.adminService.getAdminById(id); + return admin; + } + + // POST + + @SuccessResponse(201, "The user is created") + @Post("/login") + public async login(@Body() body: { email: string; password: string }) { + const admin = await this.adminService.getAdminByEmail(body.email); + + if (!admin) { + return "Invalid phone number"; + } + + const passwordMatch = await bcrypt.compare(body.password, admin?.password); + + if (!passwordMatch) { + return "Invalid password"; + } + + const token = this.authService.generateToken( + admin, + ACCESS_TOKEN_EXPIRATION_TIME_WEB + ); + + return { + message: `The user ${admin?.firstName} is logged successfully`, + token: token, + ...admin, + }; + } + + @Post("/signup") + public async createAdmin( + @Body() + body: UserInputModel + ) { + const hashedPassword = await bcrypt.hash(body.password, 10); + const admin = await this.adminService.createAdmin({ + ...body, + password: hashedPassword, + }); + + const adminFrom = await this.adminService.getAdminById(admin.id); + + const token = this.authService.generateToken( + admin, + ACCESS_TOKEN_EXPIRATION_TIME_WEB + ); + return { + message: "The user is created successfully", + token: token, + ...adminFrom, + }; + } + + @Post("/email/otp/send") + public async sendOtp(@Body() body: { email: string }) { + const otpSent = await this.otpService.sendEmailOTP(body.email); + if (otpSent) { + return Promise.resolve({ + message: "OTP sent successfully", + }); + } + + return Promise.resolve({ + message: "OTP", + }); + } + + @Post("/email/otp/verify") + public async verifyOtp(@Body() body: { email: string; otp: string }) { + const existingOtp = await this.otpService.getExistingOtp( + body.email, + body.otp + ); + + if (!existingOtp) { + return { + message: "Invalid OTP", + }; + } + if (existingOtp.expiresAt < new Date()) { + await this.otpService.deleteOtpById(existingOtp.id); + return { + message: "OTP verified successfully", + }; + } + + const adminConcerned = await this.adminService.getAdminByEmail( + existingOtp.email + ); + + await this.adminService.updateEmailVerified(adminConcerned.id, true); + + await this.otpService.deleteOtpById(existingOtp.id); + + return { + message: "OTP verified successfully", + }; + } + + @Put("/{id}/password") + public async updatePassword( + @Path() id: string, + @Body() body: { password: string } + ) { + try { + const hashedPassword = await bcrypt.hash(body.password, 10); + return await this.adminService.updatePassword(id, hashedPassword); + } catch (error) { + throw new Error("Admin not found"); + } + } + + @Put("/{id}/email") + public async updateEmail( + @Path() id: string, + @Body() body: { email: string } + ) { + try { + return await this.adminService.updateEmail(id, body.email); + } catch (error) { + throw new Error("Admin not found"); + } + } + + @Put("/{id}/phone-number") + public async updatePhoneNumber( + @Path() id: string, + @Body() body: { phoneNumber: string } + ) { + try { + return await this.adminService.updatePhoneNumber(id, body.phoneNumber); + } catch (error) { + throw new Error("Admin not found"); + } + } + + @Put("/{id}/full-name") + public async updateFullName( + @Path() id: string, + @Body() body: { firstName: string; lastName: string } + ) { + try { + return await this.adminService.updateFullName(id, body); + } catch (error) { + throw new Error("Admin not found"); + } + } + + // DELETE + + @Delete("{id}") + public async deleteAdmin(@Path() id: string) { + try { + await this.adminService.deleteAdmin(id); + } catch (error) { + throw new Error("Admin not found"); + } + } +} diff --git a/src/controllers/user.controller.ts b/src/controllers/user.controller.ts deleted file mode 100644 index c40bf3b..0000000 --- a/src/controllers/user.controller.ts +++ /dev/null @@ -1,27 +0,0 @@ -// src/users/user.ontroller.ts -import { PrismaClient } from "@prisma/client"; -import { Request, Response } from "express"; -import { Route, Get, Post } from "tsoa"; - -@Route("api/users") -export default class UserController { - prisma = new PrismaClient(); - - @Get("/") - public async getAllUsers() { - return { message: "All the users are here dude" }; - } - - @Post("/") - public async createUser() { - /* - await this.prisma.user.create({ - data: { - name: "Alice", - email: "alice@prisma.io", - }, - }); - */ - return { message: "Hum hum, you wonna create a user dude?" }; - } -} diff --git a/src/dependency-injection.ts b/src/dependency-injection.ts new file mode 100644 index 0000000..df02b38 --- /dev/null +++ b/src/dependency-injection.ts @@ -0,0 +1,8 @@ +import { container } from "tsyringe"; +import { Context, context } from "./contexts/context"; +import EventEmitter from "events"; + +container.register("Context", { useValue: context }); +container.register("EventEmitter", { + useValue: new EventEmitter(), +}); diff --git a/src/enums/role.enum.ts b/src/enums/role.enum.ts index 5864c09..87ad44b 100644 --- a/src/enums/role.enum.ts +++ b/src/enums/role.enum.ts @@ -1,4 +1,4 @@ -enum Role { +export enum Role { ADMIN = "ADMIN", USER = "USER", } diff --git a/src/middlewares/auth.middleware.ts b/src/middlewares/auth.middleware.ts new file mode 100644 index 0000000..c56c958 --- /dev/null +++ b/src/middlewares/auth.middleware.ts @@ -0,0 +1,28 @@ +import { Request, Response, NextFunction } from "express"; +import jwt from "jsonwebtoken"; +import dotenv from "dotenv"; +dotenv.config(); +const ACCESS_SECRET_TOKEN = process.env.ACCESS_SECRET_TOKEN; + +export const authenticateToken = ( + req: Request, + res: Response, + next: NextFunction +): void => { + const token = req.header("Authorization")?.split(" ")[1]; + + if (!token) { + res.status(401).json({ error: "Unauthorized" }); + return; + } + + jwt.verify(token, ACCESS_SECRET_TOKEN, (err: any, user: any) => { + if (err) { + res.status(401).json({ error: "Invalid token" }); + return; + } + + //req.body = {...req.body, user}; + next(); + }); +}; diff --git a/src/middlewares/user.middleware.ts b/src/middlewares/user.middleware.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/models/admin.model.ts b/src/models/admin.model.ts new file mode 100644 index 0000000..4cf61da --- /dev/null +++ b/src/models/admin.model.ts @@ -0,0 +1,15 @@ +import { Role } from "../enums/role.enum"; + +export interface AdminModel { + id: string; + role?: Role; + firstName: string; + lastName: string; + email: string; + emailVerified?: boolean; + phoneNumber?: string; + phoneNumberVerified?: boolean; + password: string; + createdAt?: Date; + updatedAt?: Date; +} diff --git a/src/models/otp.model.ts b/src/models/otp.model.ts new file mode 100644 index 0000000..20f5af2 --- /dev/null +++ b/src/models/otp.model.ts @@ -0,0 +1,13 @@ +export interface OtpModel { + id?: string; + email: string; + code: string; + createdAt?: Date | undefined; + expiresAt?: Date; +} + +export interface OtpInputModel { + email: string; + code: string; + expiresAt: Date; +} diff --git a/src/models/user-input.model.ts b/src/models/user-input.model.ts new file mode 100644 index 0000000..b30dd4b --- /dev/null +++ b/src/models/user-input.model.ts @@ -0,0 +1,7 @@ +export interface UserInputModel { + firstName: string; + lastName: string; + phoneNumber: string; + email: string; + password: string; +} diff --git a/src/repositories/admin.repository.ts b/src/repositories/admin.repository.ts new file mode 100644 index 0000000..a1d7795 --- /dev/null +++ b/src/repositories/admin.repository.ts @@ -0,0 +1,149 @@ +import { AdminModel } from "../models/admin.model"; +import { mapAdmin } from "../utils/mapping"; +import { Context } from "../contexts/context"; +import { inject, injectable } from "tsyringe"; +import { PrismaClient } from "@prisma/client"; +import "reflect-metadata"; +import { UserInputModel } from "../models/user-input.model"; + +@injectable() +export class AdminRepository { + constructor(@inject("Context") private ctx: Context) {} + + async getAllAdmins() { + const admins = await this.ctx.prisma.admin.findMany(); + return mapAdmin(admins); + } + + async createAdmin(admin: UserInputModel) { + return await this.ctx.prisma.admin.create({ + data: { + firstName: admin.firstName, + lastName: admin.lastName, + email: admin.email, + phoneNumber: admin.phoneNumber, + password: admin.password, + }, + }); + } + + async deleteAdmin(id: string) { + return await this.ctx.prisma.admin.delete({ + where: { + id: id, + }, + }); + } + + async getAdminById(id: string) { + const admin = await this.ctx.prisma.admin.findUnique({ + where: { + id: id, + }, + }); + return mapAdmin(admin); + } + + async getAdminByEmail(email: string) { + const admin = await this.ctx.prisma.admin.findUnique({ + where: { + email: email, + }, + }); + return mapAdmin(admin); + } + + async getAdminByPhoneNumber(phoneNumber: string) { + const admin = await this.ctx.prisma.admin.findUnique({ + where: { + phoneNumber: phoneNumber, + }, + }); + return mapAdmin(admin); + } + + async getAdminByPhoneNumberOrEmail(emailOrPhoneNumber: string) { + const admin = await this.ctx.prisma.admin.findUnique({ + where: { + email: emailOrPhoneNumber, + phoneNumber: emailOrPhoneNumber, + }, + }); + return mapAdmin(admin); + } + + async updateEmail(id: string, email: string) { + return await this.ctx.prisma.admin.update({ + where: { + id: id, + }, + data: { + email: email, + emailVerified: false, + }, + }); + } + + async updateEmailVerified(id: string, emailVerified: boolean) { + return await this.ctx.prisma.admin.update({ + where: { + id: id, + }, + data: { + emailVerified: emailVerified, + }, + }); + } + + async updatePhoneNumber(id: string, phoneNumber: string) { + return await this.ctx.prisma.admin.update({ + where: { + id: id, + }, + data: { + phoneNumber: phoneNumber, + phoneNumberVerified: false, + }, + }); + } + + async updatePhoneNumberVerified(id: string, phoneNumberVerified: boolean) { + return await this.ctx.prisma.admin.update({ + where: { + id: id, + }, + data: { + phoneNumberVerified: phoneNumberVerified, + }, + }); + } + + async updatePassword(id: string, password: string) { + return await this.ctx.prisma.admin.update({ + where: { + id: id, + }, + data: { + password: password, + }, + }); + } + + async updateFullName( + id: string, + fullName: { + firstName: string; + lastName: string; + } + ) { + return await this.ctx.prisma.admin.update({ + where: { + id: id, + }, + data: { + firstName: fullName.firstName, + lastName: fullName.lastName, + }, + }); + } +} diff --git a/src/repositories/otp.repository.test.ts b/src/repositories/otp.repository.test.ts new file mode 100644 index 0000000..0d7535f --- /dev/null +++ b/src/repositories/otp.repository.test.ts @@ -0,0 +1,122 @@ +import "reflect-metadata"; +import { OtpRepository } from "./otp.repository"; +import { Context, MockContext, createMockContext } from "../contexts/context"; + +describe("OtpRepository", () => { + let otpRepository: OtpRepository; + let mockCtx: MockContext; + let ctx: Context; + + const otp = { + id: "1", + email: "you@are.dude", + code: "123456", + createdAt: new Date(), + expiresAt: new Date(), + }; + + beforeEach(() => { + mockCtx = createMockContext(); + ctx = mockCtx as unknown as Context; + otpRepository = new OtpRepository(ctx); + }); + + describe("createOtp", () => { + it("should create a new otp", async () => { + // Given + mockCtx.prisma.otp.create.mockResolvedValue(otp); + // When + const result = await otpRepository.createOtp(otp); + // Then + expect(result).toEqual(otp); + }); + }); + + describe("getOtpByEmail", () => { + it("should get an otp by email", async () => { + // Given + mockCtx.prisma.otp.findUnique.mockResolvedValue(otp); + // When + const result = await otpRepository.getOtpByEmail(otp.email); + // Then + expect(result).toEqual(otp); + }); + }); + + describe("deleteOtp", () => { + it("should delete an otp", async () => { + // Given + mockCtx.prisma.otp.delete.mockResolvedValue(otp); + // When + const result = await otpRepository.deleteOtpById(otp.email); + // Then + expect(result).toEqual(otp); + }); + }); + + describe("getOtpById", () => { + it("should get an otp by id", async () => { + // Given + mockCtx.prisma.otp.findUnique.mockResolvedValue(otp); + // When + const result = await otpRepository.getOtpById(otp.id); + // Then + expect(result).toEqual(otp); + }); + }); + + describe("deleteOtpById", () => { + it("should delete an otp by id", async () => { + // Given + mockCtx.prisma.otp.delete.mockResolvedValue(otp); + // When + const result = await otpRepository.deleteOtpById(otp.id); + // Then + expect(result).toEqual(otp); + }); + }); + + describe("updateOtp", () => { + it("should update an otp", async () => { + // Given + mockCtx.prisma.otp.update.mockResolvedValue(otp); + // When + const result = await otpRepository.updateOtp(otp.email, otp); + // Then + expect(result).toEqual(otp); + }); + }); + + describe("getAllOtps", () => { + it("should get all otps", async () => { + // Given + mockCtx.prisma.otp.findMany.mockResolvedValue([otp]); + // When + const result = await otpRepository.getAllOtps(); + // Then + expect(result).toEqual([otp]); + }); + }); + + describe("getExistingOtp", () => { + it("should get an otp by email and otp", async () => { + // Given + mockCtx.prisma.otp.findUnique.mockResolvedValue(otp); + // When + const result = await otpRepository.getExistingOtp(otp.email, otp.code); + // Then + expect(result).toEqual(otp); + }); + }); + + describe("deleteExpiredOtp", () => { + it("should delete expired otps", async () => { + // Given + //mockCtx.prisma.otp.deleteMany.mockResolvedValue(otp); + // When + const result = await otpRepository.deleteExpiredOtp(); + // Then + expect(result).toEqual(undefined); + }); + }); +}); diff --git a/src/repositories/otp.repository.ts b/src/repositories/otp.repository.ts new file mode 100644 index 0000000..dab9175 --- /dev/null +++ b/src/repositories/otp.repository.ts @@ -0,0 +1,87 @@ +import { inject, injectable } from "tsyringe"; +import { Context } from "../contexts/context"; +import { OtpInputModel, OtpModel } from "../models/otp.model"; + +@injectable() +export class OtpRepository { + constructor(@inject("Context") private ctx: Context) {} + + async createOtp(otp: OtpInputModel) { + return this.ctx.prisma.otp.create({ + data: { + email: otp.email, + code: otp.code, + expiresAt: otp.expiresAt, + }, + }); + } + + async getOtpByEmail(email: string) { + return this.ctx.prisma.otp.findUnique({ + where: { + email: email, + }, + }); + } + + async deleteOtpByEmail(email: string) { + return this.ctx.prisma.otp.delete({ + where: { + email: email, + }, + }); + } + + async getOtpById(id: string) { + return this.ctx.prisma.otp.findUnique({ + where: { + id: id, + }, + }); + } + + async deleteOtpById(id: string) { + return this.ctx.prisma.otp.delete({ + where: { + id: id, + }, + }); + } + + async updateOtp(email: string, otp: OtpModel) { + return this.ctx.prisma.otp.update({ + where: { + email: email, + }, + data: { + id: otp.id, + email: otp.email, + code: otp.code, + expiresAt: otp.expiresAt, + }, + }); + } + + async getAllOtps() { + return this.ctx.prisma.otp.findMany(); + } + + async getExistingOtp(email: string, otpCode: string) { + return this.ctx.prisma.otp.findUnique({ + where: { + email: email, + code: otpCode, + }, + }); + } + + async deleteExpiredOtp() { + return this.ctx.prisma.otp.deleteMany({ + where: { + expiresAt: { + lt: new Date(), + }, + }, + }); + } +} diff --git a/src/repositories/user.repositories.ts b/src/repositories/user.repositories.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/routes/user.routes.test.ts b/src/routes/admin.routes.test.ts similarity index 100% rename from src/routes/user.routes.test.ts rename to src/routes/admin.routes.test.ts diff --git a/src/routes/admin.routes.ts b/src/routes/admin.routes.ts new file mode 100644 index 0000000..4abf697 --- /dev/null +++ b/src/routes/admin.routes.ts @@ -0,0 +1,87 @@ +import "reflect-metadata"; +import "../dependency-injection"; +import { Router } from "express"; +import AdminController from "../controllers/admin.controller"; +import { container } from "tsyringe"; +import { authenticateToken } from "../middlewares/auth.middleware"; + +/** + * Note: You can use multer for uploading media like files, images, videos, etc. + * For more information about it, visit: https://www.npmjs.com/package/multer + */ + +// const multer = require("multer"); +// const storage = multer.memoryStorage(); +// const upload = multer({ +// storage: storage, +// limits: { fieldSize: 25 * 1024 * 1024 }, +// }); + +// const adminController = new AdminController( +// new AdminService(new AdminRepository(ctx)) +// ); + +const adminController = container.resolve(AdminController); +const router = Router(); + +// GET + +router.get("/all", (req, res) => { + adminController.getAllAdmins().then((data) => res.json(data)); +}); + +router.get("/:id", (req, res) => { + adminController.getAdminById(req.params.id).then((data) => res.json(data)); +}); + +// POST + +router.post("/signup", (req, res) => { + adminController.createAdmin(req.body).then((data) => res.json(data)); +}); + +router.post("/login", (req, res) => { + adminController.login(req.body).then((data) => res.json(data)); +}); + +router.post("/email/otp/send", (req, res) => { + adminController.sendOtp(req.body).then((data) => res.json(data)); +}); + +router.post("/email/otp/verify", (req, res) => { + adminController.verifyOtp(req.body).then((data) => res.json(data)); +}); + +// PUT + +router.put("/:id/full-name", (req, res) => { + adminController + .updateFullName(req.params.id, req.body) + .then((data) => res.json(data)); +}); + +router.put("/:id/phone-number", (req, res) => { + adminController + .updatePhoneNumber(req.params.id, req.body) + .then((data) => res.json(data)); +}); + +router.put("/:id/email", (req, res) => { + adminController + .updateEmail(req.params.id, req.body) + .then((data) => res.json(data)); +}); + +router.put("/:id/password", (req, res) => { + adminController + .updatePassword(req.params.id, req.body) + .then((data) => res.json(data)); +}); + +// DELETE + +router.delete("/:id", (req, res) => { + adminController.deleteAdmin(req.params.id).then((data) => res.json(data)); +}); + +export default router; diff --git a/src/routes/user.routes.ts b/src/routes/user.routes.ts deleted file mode 100644 index 6c6752c..0000000 --- a/src/routes/user.routes.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Router } from "express"; -import UserController from "../controllers/user.controller"; - -const userController = new UserController(); - -const router = Router(); - -router.get("/", async (req, res) => { - const controller = new UserController(); - const response = await controller.getAllUsers(); - return res.send(response); -}); - -export default router; diff --git a/src/services/admin.service.ts b/src/services/admin.service.ts new file mode 100644 index 0000000..d982a7a --- /dev/null +++ b/src/services/admin.service.ts @@ -0,0 +1,78 @@ +import { inject, injectable } from "tsyringe"; +import { AdminRepository } from "../repositories/admin.repository"; +import { UserInputModel } from "../models/user-input.model"; +import { BlobService } from "./blob.service"; +@injectable() +export class AdminService { + constructor( + @inject(AdminRepository) private adminRepository: AdminRepository, + @inject(BlobService) private blobService: BlobService + ) {} + + async getAllAdmins() { + return await this.adminRepository.getAllAdmins(); + } + + async createAdmin(admin: UserInputModel) { + return await this.adminRepository.createAdmin(admin); + } + + async deleteAdmin(id: string) { + return await this.adminRepository.deleteAdmin(id); + } + + // async updateAdmin(id: string, admin: any) { + // return await this.adminRepository.updateAdmin(id, admin); + // } + + async updateEmail(id: string, email: string) { + return await this.adminRepository.updateEmail(id, email); + } + + async updateEmailVerified(id: string, emailVerified: boolean) { + return await this.adminRepository.updateEmailVerified(id, emailVerified); + } + + async updatePhoneNumber(id: string, phoneNumber: string) { + return await this.adminRepository.updatePhoneNumber(id, phoneNumber); + } + + async updatePhoneNumberVerified(id: string, phoneNumberVerified: boolean) { + return await this.adminRepository.updatePhoneNumberVerified( + id, + phoneNumberVerified + ); + } + + async updatePassword(id: string, password: string) { + return await this.adminRepository.updatePassword(id, password); + } + + async updateFullName( + id: string, + fullName: { + firstName: string; + lastName: string; + } + ) { + return await this.adminRepository.updateFullName(id, fullName); + } + + async getAdminById(id: string) { + return await this.adminRepository.getAdminById(id); + } + + async getAdminByEmail(email: string) { + return await this.adminRepository.getAdminByEmail(email); + } + + async getAdminByPhoneNumber(phoneNumber: string) { + return await this.adminRepository.getAdminByPhoneNumber(phoneNumber); + } + + async getAdminByPhoneNumberOrEmail(emailOrPhoneNumber: string) { + return await this.adminRepository.getAdminByPhoneNumberOrEmail( + emailOrPhoneNumber + ); + } +} diff --git a/src/services/auth.service.ts b/src/services/auth.service.ts new file mode 100644 index 0000000..5e23353 --- /dev/null +++ b/src/services/auth.service.ts @@ -0,0 +1,27 @@ +import jwt from "jsonwebtoken"; +import dotenv from "dotenv"; +dotenv.config(); + +export class AuthService { + ACCESS_SECRET_TOKEN = process.env.ACCESS_SECRET_TOKEN; + REFRESH_SECRET_TOKEN = process.env.REFRESH_SECRET_TOKEN; + + constructor() {} + + generateToken = (user: any, expiresIn: string): string => { + const token = jwt.sign( + // { + // id: user.id, + // email: user.email, + // }, + user, + this.ACCESS_SECRET_TOKEN, // Replace with your own secret key + { expiresIn: expiresIn } // Token expiration time + ); + return token; + }; + + generateRefreshToken = (user: any, expiresIn: string) => { + return jwt.sign(user, this.REFRESH_SECRET_TOKEN, { expiresIn: expiresIn }); + }; +} diff --git a/src/services/blob.service.ts b/src/services/blob.service.ts new file mode 100644 index 0000000..6da7ca8 --- /dev/null +++ b/src/services/blob.service.ts @@ -0,0 +1,47 @@ +// For more docs about blob store in vercel: https://vercel.com/docs/storage/vercel-blob/using-blob-sdk + +import { put, del, head, list } from "@vercel/blob"; + +export const config = { + runtime: "edge", +}; + +export class BlobService { + async uploadBlob(file: File, filename: string) { + // const { searchParams } = new URL(request.url); + // const filename = searchParams.get("filename"); + + // example of use : put(pathname, body, options); + + const blob = await put(filename, file, { + access: "public", + }); + + // bolob.url to store + return blob; + } + + async deleteBlob(url: string) { + // exemple of use : del(url, options); + + //const { searchParams } = new URL(request.url); + //const urlToDelete = searchParams.get("url") as string; + await del(url); + } + + async getBlob(url: string) { + //const { searchParams } = new URL(request.url); + //const blobUrl = searchParams.get('url'); + + // example of use : head(url, options); + const blobDetails = await head(url); + + return blobDetails; + } + + async getAllBlobs() { + // example of use : list(options); + const { blobs } = await list(); + return blobs; + } +} diff --git a/src/services/email.service.ts b/src/services/email.service.ts new file mode 100644 index 0000000..b643ef8 --- /dev/null +++ b/src/services/email.service.ts @@ -0,0 +1,51 @@ +import { BOT_MAIL_ADDRESS, BOT_MAIL_PASSWORD } from "../utils/constants"; + +const nodemailer = require("nodemailer"); + +export class EmailService { + constructor() {} + + sendEmail(email: string, subject: string, message: string): boolean { + //send email here + //handle emails + const emailsHandling = { + botMail: BOT_MAIL_ADDRESS, + destinator: email, + }; + + let transporter = nodemailer.createTransport({ + // gmail is used here + host: "smtp.gmail.com", + port: 587, // 587 -> TLS & 465 -> SSL + auth: { + // email adress of your google account + user: emailsHandling.botMail, + // password of your google account generated by google + pass: BOT_MAIL_PASSWORD, + }, + }); + + const mail = { + from: emailsHandling.botMail, + to: emailsHandling.destinator, + subject: subject, + // we can replace the attribute `text` by `html` if we want that the body of the mail support html syntax + // html: '

This email use html

' + html: message, + }; + + let sendStatus = false; + + transporter.sendMail(mail, (error, info) => { + if (error) { + console.log("Error occurred: " + error.message); + sendStatus = false; + } else { + console.log("OTP email sent successfully: " + info.response); + sendStatus = true; + } + }); + + return sendStatus; + } +} diff --git a/src/services/otp.service.ts b/src/services/otp.service.ts new file mode 100644 index 0000000..15e3c87 --- /dev/null +++ b/src/services/otp.service.ts @@ -0,0 +1,91 @@ +import { inject, injectable } from "tsyringe"; +import { OtpRepository } from "../repositories/otp.repository"; +import { OtpInputModel } from "../models/otp.model"; +import { EmailService } from "./email.service"; +import { + TWILIO_ACCOUNT_SID, + TWILIO_AUTH_TOKEN, + TWILIO_SERVICE_SID, +} from "../utils/constants"; +const randomstring = require("randomstring"); + +@injectable() +export class OtpService { + // Download the helper library from https://www.twilio.com/docs/node/install + // Find your Account SID and Auth Token at twilio.com/console + // and set the environment variables. See http://twil.io/secure + + client = require("twilio")(TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN); + + constructor( + @inject(OtpRepository) private otpRepository: OtpRepository, + @inject(EmailService) private emailService: EmailService + ) {} + + async createOtp(otp: OtpInputModel) { + return this.otpRepository.createOtp(otp); + } + + async getOtpByEmail(email: string) { + return this.otpRepository.getOtpByEmail(email); + } + + async deleteOtpByEmail(email: string) { + return this.otpRepository.deleteOtpByEmail(email); + } + + async getOtpById(id: string) { + return this.otpRepository.getOtpById(id); + } + + async deleteOtpById(id: string) { + return this.otpRepository.deleteOtpById(id); + } + + async updateOtp(email: string, otp: OtpInputModel) { + return this.otpRepository.updateOtp(email, otp); + } + + async getAllOtps() { + return this.otpRepository.getAllOtps(); + } + + async getExistingOtp(email: string, otp: string) { + return this.otpRepository.getExistingOtp(email, otp); + } + + async deleteExpiredOtp() { + return this.otpRepository.deleteExpiredOtp(); + } + + private generateOTP() { + return randomstring.generate({ length: 6, charset: "numeric" }); + } + + sendEmailOTP(email: string): boolean { + const otp = { + email: email, + code: this.generateOTP(), + expiresAt: new Date(Date.now() + 10 * 60 * 1000), // 10 minutes + }; + this.otpRepository.createOtp(otp); + const subject = "OTP Verification Code"; + const message = `

Your verification code is: ${otp.code}

`; + const otpSent = this.emailService.sendEmail(email, subject, message); + return otpSent; + } + + sendPhoneNumberOTP(phoneNumber: string) { + this.client.verify.v2 + .services(TWILIO_SERVICE_SID) + .verifications.create({ to: phoneNumber, channel: "sms" }) + .then((verification) => console.log(verification.sid)); + } + + async verifyPhoneNumberOTP(phoneNumber: string, code: string) { + return this.client.verify.v2 + .services(TWILIO_SERVICE_SID) + .verificationChecks.create({ to: phoneNumber, code: code }) + .then((verification_check) => console.log(verification_check.status)); + } +} diff --git a/src/utils/constants.ts b/src/utils/constants.ts new file mode 100644 index 0000000..048fed0 --- /dev/null +++ b/src/utils/constants.ts @@ -0,0 +1,23 @@ +import dotenv from "dotenv"; +dotenv.config(); + +// for bot mail for sending OTP +export const BOT_MAIL_ADDRESS = process.env.BOT_MAIL_ADDRESS; +export const BOT_MAIL_PASSWORD = process.env.BOT_MAIL_PASSWORD; + +// auth +export const ACCESS_SECRET_TOKEN = process.env.ACCESS_SECRET_TOKEN; +export const REFRESH_SECRET_TOKEN = process.env.REFRESH_SECRET_TOKEN; + +// token expirition time +export const ACCESS_TOKEN_EXPIRATION_TIME_WEB = "1h"; +export const ACCESS_TOKEN_EXPIRATION_TIME_MOBILE = "1y"; + +// for Twilio +export const TWILIO_ACCOUNT_SID = process.env.TWILIO_ACCOUNT_SID; +export const TWILIO_AUTH_TOKEN = process.env.TWILIO_AUTH_TOKEN; +export const TWILIO_SERVICE_SID = process.env.TWILIO_SERVICE_SID; + +// for Paytech +export const PAYTECH_API_KEY = process.env.PAYTECH_API_KEY; +export const PAYTECH_API_SECRET = process.env.PAYTECH_API_SECRET; diff --git a/src/utils/mapping.ts b/src/utils/mapping.ts new file mode 100644 index 0000000..ff6881e --- /dev/null +++ b/src/utils/mapping.ts @@ -0,0 +1,15 @@ +import { AdminModel } from "../models/admin.model"; + +export const mapAdmin = (admin: any): AdminModel => ({ + id: admin.id, + role: admin.role, + firstName: admin.firstName, + lastName: admin.lastName, + email: admin.email, + emailVerified: admin.emailVerified, + phoneNumber: admin.phoneNumber ?? undefined, + phoneNumberVerified: admin.phoneNumberVerified ?? undefined, + password: admin.password, + createdAt: admin.createdAt, + updatedAt: admin.updatedAt, +}); diff --git a/tsconfig.json b/tsconfig.json index 71c41c9..4e9cf7b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,10 +6,12 @@ "moduleResolution": "node", "sourceMap": true, "outDir": "dist", + "rootDir": "src", "experimentalDecorators": true, - "emitDecoratorMetadata": true + "emitDecoratorMetadata": true, + "strictNullChecks": true }, "lib": ["es2022"], - //"include": ["./src/**/*"], - //"exclude": ["node_modules", "**/*.spec.ts"] + "include": ["./src/**/*"], + "exclude": ["node_modules", "**/*.spec.ts"] } \ No newline at end of file