diff --git a/package-lock.json b/package-lock.json index 0d7a111..faf1ec7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "hasInstallScript": true, "license": "ISC", "dependencies": { - "@prisma/client": "^5.15.1", + "@prisma/client": "^6.3.0", "@types/body-parser": "^1.19.5", "@types/cors": "^2.8.17", "@types/express": "^4.17.21", @@ -54,7 +54,7 @@ "@types/swagger-ui-express": "^4.1.6", "@types/uuid": "^10.0.0", "nodemon": "^3.1.4", - "prisma": "^5.15.1" + "prisma": "^6.3.0" } }, "node_modules/@apidevtools/json-schema-ref-parser": { @@ -114,9 +114,9 @@ } }, "node_modules/@cypress/request": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.6.tgz", - "integrity": "sha512-fi0eVdCOtKu5Ed6+E8mYxUF6ZTFJDZvHogCBelM0xVXmrDEkyM22gRArQzq1YcHPm1V47Vf/iAD+WgVdUlJCGg==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.7.tgz", + "integrity": "sha512-LzxlLEMbBOPYB85uXrDqvD4MgcenjRBLIns3zyhx7vTPj/0u2eQhzXvPiGcaJrV38Q9dbkExWp6cOHPJ+EtFYg==", "license": "Apache-2.0", "dependencies": { "aws-sign2": "~0.7.0", @@ -132,7 +132,7 @@ "json-stringify-safe": "~5.0.1", "mime-types": "~2.1.19", "performance-now": "^2.1.0", - "qs": "6.13.0", + "qs": "6.13.1", "safe-buffer": "^5.1.2", "tough-cookie": "^5.0.0", "tunnel-agent": "^0.6.0", @@ -175,6 +175,21 @@ "node": ">=6" } }, + "node_modules/@cypress/request/node_modules/qs": { + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.1.tgz", + "integrity": "sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/@cypress/request/node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -263,71 +278,75 @@ } }, "node_modules/@prisma/client": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.22.0.tgz", - "integrity": "sha512-M0SVXfyHnQREBKxCgyo7sffrKttwE6R8PMq330MIUF0pTwjUhLbW84pFDlf06B27XyCR++VtjugEnIHdr07SVA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.3.0.tgz", + "integrity": "sha512-BY3Fi28PUSk447Bpv22LhZp4HgNPo7NsEN+EteM1CLDnLjig5863jpW+3c3HHLFmml+nB/eJv1CjSriFZ8z7Cg==", "hasInstallScript": true, "license": "Apache-2.0", "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "peerDependencies": { - "prisma": "*" + "prisma": "*", + "typescript": ">=5.1.0" }, "peerDependenciesMeta": { "prisma": { "optional": true + }, + "typescript": { + "optional": true } } }, "node_modules/@prisma/debug": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.22.0.tgz", - "integrity": "sha512-AUt44v3YJeggO2ZU5BkXI7M4hu9BF2zzH2iF2V5pyXT/lRTyWiElZ7It+bRH1EshoMRxHgpYg4VB6rCM+mG5jQ==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.3.0.tgz", + "integrity": "sha512-m1lQv//0Rc5RG8TBpNUuLCxC35Ghi5XfpPmL83Gh04/GICHD2J5H2ndMlaljrUNaQDF9dOxIuFAYP1rE9wkXkg==", "devOptional": true, "license": "Apache-2.0" }, "node_modules/@prisma/engines": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.22.0.tgz", - "integrity": "sha512-UNjfslWhAt06kVL3CjkuYpHAWSO6L4kDCVPegV6itt7nD1kSJavd3vhgAEhjglLJJKEdJ7oIqDJ+yHk6qO8gPA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.3.0.tgz", + "integrity": "sha512-RXqYhlZb9sx/xkUfYIZuEPn7sT0WgTxNOuEYQ7AGw3IMpP9QGVEDVsluc/GcNkM8NTJszeqk8AplJzI9lm7Jxw==", "devOptional": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "5.22.0", - "@prisma/engines-version": "5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2", - "@prisma/fetch-engine": "5.22.0", - "@prisma/get-platform": "5.22.0" + "@prisma/debug": "6.3.0", + "@prisma/engines-version": "6.3.0-17.acc0b9dd43eb689cbd20c9470515d719db10d0b0", + "@prisma/fetch-engine": "6.3.0", + "@prisma/get-platform": "6.3.0" } }, "node_modules/@prisma/engines-version": { - "version": "5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2.tgz", - "integrity": "sha512-2PTmxFR2yHW/eB3uqWtcgRcgAbG1rwG9ZriSvQw+nnb7c4uCr3RAcGMb6/zfE88SKlC1Nj2ziUvc96Z379mHgQ==", + "version": "6.3.0-17.acc0b9dd43eb689cbd20c9470515d719db10d0b0", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.3.0-17.acc0b9dd43eb689cbd20c9470515d719db10d0b0.tgz", + "integrity": "sha512-R/ZcMuaWZT2UBmgX3Ko6PAV3f8//ZzsjRIG1eKqp3f2rqEqVtCv+mtzuH2rBPUC9ujJ5kCb9wwpxeyCkLcHVyA==", "devOptional": true, "license": "Apache-2.0" }, "node_modules/@prisma/fetch-engine": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-5.22.0.tgz", - "integrity": "sha512-bkrD/Mc2fSvkQBV5EpoFcZ87AvOgDxbG99488a5cexp5Ccny+UM6MAe/UFkUC0wLYD9+9befNOqGiIJhhq+HbA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.3.0.tgz", + "integrity": "sha512-GBy0iT4f1mH31ePzfcpVSUa7JLRTeq4914FG2vR3LqDwRweSm4ja1o5flGDz+eVIa/BNYfkBvRRxv4D6ve6Eew==", "devOptional": true, "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "5.22.0", - "@prisma/engines-version": "5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2", - "@prisma/get-platform": "5.22.0" + "@prisma/debug": "6.3.0", + "@prisma/engines-version": "6.3.0-17.acc0b9dd43eb689cbd20c9470515d719db10d0b0", + "@prisma/get-platform": "6.3.0" } }, "node_modules/@prisma/get-platform": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-5.22.0.tgz", - "integrity": "sha512-pHhpQdr1UPFpt+zFfnPazhulaZYCUqeIcPpJViYoq9R+D/yw4fjE+CtnsnKzPYm0ddUbeXUzjGVGIRVgPDCk4Q==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.3.0.tgz", + "integrity": "sha512-V8zZ1d0xfyi6FjpNP4AcYuwSpGcdmu35OXWnTPm8IW594PYALzKXHwIa9+o0f+Lo9AecFWrwrwaoYe56UNfTtQ==", "devOptional": true, "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "5.22.0" + "@prisma/debug": "6.3.0" } }, "node_modules/@scarf/scarf": { @@ -1691,9 +1710,9 @@ "license": "MIT" }, "node_modules/express": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", - "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "license": "MIT", "dependencies": { "accepts": "~1.3.8", @@ -1715,7 +1734,7 @@ "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.10", + "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", "qs": "6.13.0", "range-parser": "~1.2.1", @@ -1730,6 +1749,10 @@ }, "engines": { "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/extend": { @@ -3516,9 +3539,9 @@ } }, "node_modules/path-to-regexp": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", - "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", "license": "MIT" }, "node_modules/performance-now": { @@ -3678,23 +3701,31 @@ } }, "node_modules/prisma": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.22.0.tgz", - "integrity": "sha512-vtpjW3XuYCSnMsNVBjLMNkTj6OZbudcPPTPYHqX0CJfpcdWciI1dM8uHETwmDxxiqEwCIE6WvXucWUetJgfu/A==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.3.0.tgz", + "integrity": "sha512-y+Zh3Qg+xGCWyyrNUUNaFW/OltaV/yXYuTa0WRgYkz5LGyifmAsgpv94I47+qGRocZrMGcbF2A/78/oO2zgifA==", "devOptional": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@prisma/engines": "5.22.0" + "@prisma/engines": "6.3.0" }, "bin": { "prisma": "build/index.js" }, "engines": { - "node": ">=16.13" + "node": ">=18.18" }, "optionalDependencies": { "fsevents": "2.3.3" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/process-nextick-args": { @@ -4510,21 +4541,21 @@ } }, "node_modules/tldts": { - "version": "6.1.65", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.65.tgz", - "integrity": "sha512-xU9gLTfAGsADQ2PcWee6Hg8RFAv0DnjMGVJmDnUmI8a9+nYmapMQix4afwrdaCtT+AqP4MaxEzu7cCrYmBPbzQ==", + "version": "6.1.76", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.76.tgz", + "integrity": "sha512-6U2ti64/nppsDxQs9hw8ephA3nO6nSQvVVfxwRw8wLQPFtLI1cFI1a1eP22g+LUP+1TA2pKKjUTwWB+K2coqmQ==", "license": "MIT", "dependencies": { - "tldts-core": "^6.1.65" + "tldts-core": "^6.1.76" }, "bin": { "tldts": "bin/cli.js" } }, "node_modules/tldts-core": { - "version": "6.1.65", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.65.tgz", - "integrity": "sha512-Uq5t0N0Oj4nQSbU8wFN1YYENvMthvwU13MQrMJRspYCGLSAZjAfoBOJki5IQpnBM/WFskxxC/gIOTwaedmHaSg==", + "version": "6.1.76", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.76.tgz", + "integrity": "sha512-uzhJ02RaMzgQR3yPoeE65DrcHI6LoM4saUqXOt/b5hmb3+mc4YWpdSeAQqVqRUlQ14q8ZuLRWyBR1ictK1dzzg==", "license": "MIT" }, "node_modules/to-regex-range": { @@ -4560,9 +4591,9 @@ } }, "node_modules/tough-cookie": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.0.0.tgz", - "integrity": "sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.0.tgz", + "integrity": "sha512-rvZUv+7MoBYTiDmFPBrhL7Ujx9Sk+q9wwm22x8c8T5IJaR+Wsyc7TNxbVxo84kZoRJZZMazowFLqpankBEQrGg==", "license": "BSD-3-Clause", "dependencies": { "tldts": "^6.1.32" diff --git a/package.json b/package.json index bafe76b..2571b1d 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "license": "ISC", "description": "", "dependencies": { - "@prisma/client": "^5.15.1", + "@prisma/client": "^6.3.0", "@types/body-parser": "^1.19.5", "@types/cors": "^2.8.17", "@types/express": "^4.17.21", @@ -62,6 +62,6 @@ "@types/swagger-ui-express": "^4.1.6", "@types/uuid": "^10.0.0", "nodemon": "^3.1.4", - "prisma": "^5.15.1" + "prisma": "^6.3.0" } } diff --git a/src/Interface/IBelonging.ts b/src/Interface/IBelonging.ts new file mode 100644 index 0000000..2cb4704 --- /dev/null +++ b/src/Interface/IBelonging.ts @@ -0,0 +1,14 @@ +import { IUser } from "./IUser"; + +export interface Ibelonging { + id: string; + telegramId: string; + itemName: string; + itemPhoto: string; + itemDescription: string; + serialNumber: string; + student: IUser; + studentId: string; + createdAt: string; + updatedAt: string; +} diff --git a/src/Interface/ICurfew.ts b/src/Interface/ICurfew.ts new file mode 100644 index 0000000..8cc1fb4 --- /dev/null +++ b/src/Interface/ICurfew.ts @@ -0,0 +1,8 @@ +export interface ICurfew { + id: string; + startTime: Date; + endTime: Date; + length: string; + days: string; + createdAt: Date; +} diff --git a/src/Interface/IQrcode.ts b/src/Interface/IQrcode.ts new file mode 100644 index 0000000..9a59fd9 --- /dev/null +++ b/src/Interface/IQrcode.ts @@ -0,0 +1,10 @@ +import { User } from "@prisma/client"; + +export interface Iqrcode { + id: string; + telegramId: string; + student: User; + studentId: string; + qrData: string; + createdAt: Date; +} diff --git a/src/Interface/IUser.ts b/src/Interface/IUser.ts new file mode 100644 index 0000000..97a6287 --- /dev/null +++ b/src/Interface/IUser.ts @@ -0,0 +1,15 @@ +import { Ibelonging } from "./Ibelonging"; +import { Iqrcode } from "./IQrcode"; + +export interface IUser { + id: string; + telegramId: string; + photoUrl?: string; + PictureUrl?: string; + name: string; + studentId: string; + createdAt: string; + updatedAt: string; + Belonging: Ibelonging; + QRCode: Iqrcode; +} diff --git a/src/config/database.ts b/src/config/database.ts index 23e3c9c..63f8bbd 100644 --- a/src/config/database.ts +++ b/src/config/database.ts @@ -1,6 +1,4 @@ -import { PrismaClient } from '@prisma/client'; +import { PrismaClient } from "@prisma/client"; -// Create an instance of PrismaClient const prisma = new PrismaClient(); - export default prisma; diff --git a/src/controllers/belonging.controller.ts b/src/controllers/belonging.controller.ts index 118add1..3c6fe8a 100644 --- a/src/controllers/belonging.controller.ts +++ b/src/controllers/belonging.controller.ts @@ -1,12 +1,17 @@ import { Request, Response } from "express"; import * as belongingService from "../services/belonging.service"; +import { AppError } from "../utils/appError"; +import { ResponseMessage } from "../utils/responseMessage"; +import { Belonging, User } from "@prisma/client"; +import { Ibelonging } from "../Interface/Ibelonging"; export const getAllBelongings = async ( req: Request, res: Response ): Promise => { const belongings = await belongingService.getAllBelongings(); - res.json(belongings); + if (!belongings) throw new AppError(404, "Belonging not found"); + ResponseMessage.responedWithSuccess(res, belongings, 200); }; export const getBelongingByTelegramId = async ( @@ -16,11 +21,8 @@ export const getBelongingByTelegramId = async ( const belonging = await belongingService.getBelongingByTelegramId( req.params.telegramId ); - if (belonging) { - res.json(belonging); - } else { - res.status(404).json({ message: "Belonging not found" }); - } + if (!belonging) throw new AppError(404, "Belonging not found in this id"); + ResponseMessage.responedWithSuccess(res, belonging, 200); }; export const createBelonging = async ( @@ -28,7 +30,9 @@ export const createBelonging = async ( res: Response ): Promise => { const belonging = await belongingService.createBelonging(req.body); - res.status(201).json(belonging); + if (!belonging) + throw new AppError(400, "The request could not be understood"); + ResponseMessage.responedWithSuccess(res, belonging, 201); }; export const updateBelonging = async ( @@ -39,7 +43,9 @@ export const updateBelonging = async ( req.params.telegramId, req.body ); - res.json(belonging); + if (!belonging) + throw new AppError(400, "The request could not be understood"); + ResponseMessage.responedWithSuccess(res, belonging, 200); }; export const deleteBelonging = async ( @@ -47,5 +53,5 @@ export const deleteBelonging = async ( res: Response ): Promise => { await belongingService.deleteBelonging(req.params.telegramId); - res.status(204).send(); + ResponseMessage.responedWithSuccess(res, "deleted", 200); }; diff --git a/src/controllers/curfew.controller.ts b/src/controllers/curfew.controller.ts index f1d5a58..087fd5a 100644 --- a/src/controllers/curfew.controller.ts +++ b/src/controllers/curfew.controller.ts @@ -1,12 +1,16 @@ import { Request, Response } from "express"; import * as curfewRuleService from "../services/curfew.service"; +import { AppError } from "../utils/appError"; +import { ResponseMessage } from "../utils/responseMessage"; +import { CurfewRule } from "@prisma/client"; export const getAllCurfewRules = async ( req: Request, res: Response ): Promise => { const curfewRules = await curfewRuleService.getAllCurfewRules(); - res.json(curfewRules); + if (!curfewRules) throw new AppError(400, "something went wrong"); + ResponseMessage.responedWithSuccess(res, curfewRules, 200); }; export const getCurfewRuleById = async ( @@ -14,11 +18,8 @@ export const getCurfewRuleById = async ( res: Response ): Promise => { const curfewRule = await curfewRuleService.getCurfewRuleById(req.params.id); - if (curfewRule) { - res.json(curfewRule); - } else { - res.status(404).json({ message: "Curfew Rule not found" }); - } + if (!curfewRule) throw new AppError(404, "the role not found"); + ResponseMessage.responedWithSuccess(res, curfewRule, 200); }; export const createCurfewRule = async ( @@ -26,7 +27,8 @@ export const createCurfewRule = async ( res: Response ): Promise => { const curfewRule = await curfewRuleService.createCurfewRule(req.body); - res.status(201).json(curfewRule); + if (!curfewRule) throw new AppError(404, "something went wrong"); + ResponseMessage.responedWithSuccess(res, curfewRule, 200); }; export const updateCurfewRule = async ( @@ -37,13 +39,15 @@ export const updateCurfewRule = async ( req.params.id, req.body ); - res.json(curfewRule); + if (!curfewRule) throw new AppError(400, "something wents wrong"); + ResponseMessage.responedWithSuccess(res, curfewRule, 200); }; export const deleteCurfewRule = async ( req: Request, res: Response ): Promise => { - await curfewRuleService.deleteCurfewRule(req.params.id); - res.status(204).send(); + const curfewId = await curfewRuleService.deleteCurfewRule(req.params.id); + if (!curfewId) throw new AppError(400, "something went wrong"); + ResponseMessage.responedWithSuccess(res, "deleted", 200); }; diff --git a/src/controllers/qrcode.controller.ts b/src/controllers/qrcode.controller.ts index 4836c06..09ad452 100644 --- a/src/controllers/qrcode.controller.ts +++ b/src/controllers/qrcode.controller.ts @@ -1,12 +1,16 @@ import { Request, Response } from "express"; import * as qrCodeService from "../services/qrcode.service"; +import { AppError } from "../utils/appError"; +import { ResponseMessage } from "../utils/responseMessage"; +import { QRCode } from "@prisma/client"; export const getAllQRCodes = async ( req: Request, res: Response ): Promise => { const qrCodes = await qrCodeService.getAllQRCodes(); - res.json(qrCodes); + if (!qrCodes) throw new AppError(400, "something wents wrong"); + ResponseMessage.responedWithSuccess(res, qrCodes, 200); }; export const getQRCodeByTelegramId = async ( @@ -16,11 +20,8 @@ export const getQRCodeByTelegramId = async ( const qrCode = await qrCodeService.getQRCodeByTelegramId( req.params.telegramId ); - if (qrCode) { - res.json(qrCode); - } else { - res.status(404).json({ message: "QR Code not found" }); - } + if (!qrCode) throw new AppError(404, "there is no qrcode in this id"); + ResponseMessage.responedWithSuccess(res, qrCode, 200); }; export const createQRCode = async ( @@ -28,7 +29,8 @@ export const createQRCode = async ( res: Response ): Promise => { const qrCode = await qrCodeService.createQRCode(req.body); - res.status(201).json(qrCode); + if (!qrCode) throw new AppError(400, "something went wrong"); + ResponseMessage.responedWithSuccess(res, qrCode, 200); }; export const updateQRCode = async ( @@ -39,13 +41,15 @@ export const updateQRCode = async ( req.params.telegramId, req.body ); - res.json(qrCode); + if (!qrCode) throw new AppError(404, "someting wents wrong"); + ResponseMessage.responedWithSuccess(res, qrCode, 200); }; export const deleteQRCode = async ( req: Request, res: Response ): Promise => { - await qrCodeService.deleteQRCode(req.params.telegramId); - res.status(204).send(); + const qrcodeId = await qrCodeService.deleteQRCode(req.params.telegramId); + if (qrcodeId) throw new AppError(400, "something wents wrong"); + ResponseMessage.responedWithSuccess(res, "deleted", 200); }; diff --git a/src/controllers/users.controller.ts b/src/controllers/users.controller.ts index 6a034ad..c097081 100644 --- a/src/controllers/users.controller.ts +++ b/src/controllers/users.controller.ts @@ -1,12 +1,16 @@ import { Request, Response } from "express"; import * as userService from "../services/users.service"; +import { AppError } from "../utils/appError"; +import { ResponseMessage } from "../utils/responseMessage"; +import { User } from "@prisma/client"; export const getAllUsers = async ( req: Request, res: Response ): Promise => { const users = await userService.getAllUsers(); - res.json(users); + if (!users) throw new AppError(404, "Something went wrong."); + ResponseMessage.responedWithSuccess(res, users, 200); }; export const getUserById = async ( @@ -14,11 +18,8 @@ export const getUserById = async ( res: Response ): Promise => { const user = await userService.getUserByTelegramId(req.params.id); - if (user) { - res.json(user); - } else { - res.status(404).json({ message: "User not found" }); - } + if (!user) throw new AppError(404, "user not fund"); + ResponseMessage.responedWithSuccess(res, user, 200); }; export const createUser = async ( @@ -26,7 +27,8 @@ export const createUser = async ( res: Response ): Promise => { const user = await userService.upsertUser(req.body); - res.status(201).json(user); + if (!user) throw new AppError(404, "something went wrong"); + ResponseMessage.responedWithSuccess(res, user, 200); }; export const updateUser = async ( @@ -34,7 +36,8 @@ export const updateUser = async ( res: Response ): Promise => { const user = await userService.updateUser(req.params.id, req.body); - res.json(user); + if (!user) throw new AppError(400, "something went wrong"); + ResponseMessage.responedWithSuccess(res, user, 200); }; export const deleteUser = async ( @@ -42,5 +45,5 @@ export const deleteUser = async ( res: Response ): Promise => { await userService.deleteUser(req.params.id); - res.status(204).send(); + ResponseMessage.responedWithSuccess(res, "user deleted", 200); }; diff --git a/src/routes/belonging.routes.ts b/src/routes/belonging.routes.ts index 315b354..09a90a4 100644 --- a/src/routes/belonging.routes.ts +++ b/src/routes/belonging.routes.ts @@ -1,15 +1,22 @@ import { Router } from "express"; -import * as belongingController from "../controllers/belonging.controller"; - +import { + getAllBelongings, + getBelongingByTelegramId, + createBelonging, + updateBelonging, + deleteBelonging, +} from "../services/belonging.service"; +import { catchAsync } from "../utils/catchAsync"; const router = Router(); -router.get("/belongings", belongingController.getAllBelongings); -router.get( - "/belongings/:telegramId", - belongingController.getBelongingByTelegramId -); -router.post("/belongings", belongingController.createBelonging); -router.put("/belongings/:telegramId", belongingController.updateBelonging); -router.delete("/belongings/:telegramId", belongingController.deleteBelonging); +router + .route("/belongings") + .get(catchAsync(getAllBelongings)) + .post(catchAsync(createBelonging)); +router + .route("/belongings/:telegramId") + .get(catchAsync(getBelongingByTelegramId)) + .put(catchAsync(updateBelonging)) + .delete(catchAsync(deleteBelonging)); export default router; diff --git a/src/routes/curfew.routes.ts b/src/routes/curfew.routes.ts index 8d29022..390d6ec 100644 --- a/src/routes/curfew.routes.ts +++ b/src/routes/curfew.routes.ts @@ -1,12 +1,23 @@ import { Router } from "express"; -import * as curfewRuleController from "../controllers/curfew.controller"; +import { + getCurfewRuleById, + getAllCurfewRules, + createCurfewRule, + updateCurfewRule, + deleteCurfewRule, +} from "../services/curfew.service"; +import { catchAsync } from "../utils/catchAsync"; const router = Router(); -router.get("/curfew-rules", curfewRuleController.getAllCurfewRules); -router.get("/curfew-rules/:id", curfewRuleController.getCurfewRuleById); -router.post("/curfew-rules", curfewRuleController.createCurfewRule); -router.put("/curfew-rules/:id", curfewRuleController.updateCurfewRule); -router.delete("/curfew-rules/:id", curfewRuleController.deleteCurfewRule); +router + .route("/curfew-rules") + .get(catchAsync(getAllCurfewRules)) + .post(catchAsync(createCurfewRule)); +router + .route("/curfew-rules/:id") + .get(catchAsync(getCurfewRuleById)) + .put(catchAsync(updateCurfewRule)) + .delete(deleteCurfewRule); export default router; diff --git a/src/routes/qrcode.routes.ts b/src/routes/qrcode.routes.ts index 4c74692..247ce82 100644 --- a/src/routes/qrcode.routes.ts +++ b/src/routes/qrcode.routes.ts @@ -1,12 +1,23 @@ import { Router } from "express"; -import * as qrCodeController from "../controllers/qrcode.controller"; +import { + getAllQRCodes, + getQRCodeByTelegramId, + createQRCode, + updateQRCode, + deleteQRCode, +} from "../controllers/qrcode.controller"; +import { catchAsync } from "../utils/catchAsync"; const router = Router(); -router.get("/qr-codes", qrCodeController.getAllQRCodes); -router.get("/qr-codes/:telegramId", qrCodeController.getQRCodeByTelegramId); -router.post("/qr-codes", qrCodeController.createQRCode); -router.put("/qr-codes/:telegramId", qrCodeController.updateQRCode); -router.delete("/qr-codes/:telegramId", qrCodeController.deleteQRCode); +router + .route("/qr-codes") + .get(catchAsync(getAllQRCodes)) + .post(catchAsync(createQRCode)); +router + .route("/qr-codes/:telegramId") + .get(catchAsync(getQRCodeByTelegramId)) + .put(catchAsync(updateQRCode)) + .delete(catchAsync(deleteQRCode)); export default router; diff --git a/src/routes/users.routes.ts b/src/routes/users.routes.ts index 4de6537..0dfe3f6 100644 --- a/src/routes/users.routes.ts +++ b/src/routes/users.routes.ts @@ -1,12 +1,23 @@ import { Router } from "express"; -import * as userController from "../controllers/users.controller"; +import { + getAllUsers, + getUserById, + createUser, + updateUser, + deleteUser, +} from "../controllers/users.controller"; +import { catchAsync } from "../utils/catchAsync"; const router = Router(); -router.get("/users", userController.getAllUsers); -router.get("/users/:id", userController.getUserById); -router.post("/users", userController.createUser); -router.put("/users/:id", userController.updateUser); -router.delete("/users/:id", userController.deleteUser); +router + .route("/users") + .get(catchAsync(getAllUsers)) + .post(catchAsync(createUser)); +router + .route("/users/:id") + .get(catchAsync(getUserById)) + .put(catchAsync(updateUser)) + .delete(catchAsync(deleteUser)); export default router; diff --git a/src/types/IRespondError.ts b/src/types/IRespondError.ts new file mode 100644 index 0000000..7891720 --- /dev/null +++ b/src/types/IRespondError.ts @@ -0,0 +1,6 @@ +import { ServerResponseData } from "./ServerResponseData"; + +export interface IRespondError { + status: "error" | "fail"; + error: ServerResponseData; +} diff --git a/src/types/IRespondSuccess.ts b/src/types/IRespondSuccess.ts new file mode 100644 index 0000000..dd1d1c7 --- /dev/null +++ b/src/types/IRespondSuccess.ts @@ -0,0 +1,4 @@ +export interface IRespondSuccess { + status: "success"; + data: T; +} diff --git a/src/types/ServerResponseData.ts b/src/types/ServerResponseData.ts new file mode 100644 index 0000000..1052e2f --- /dev/null +++ b/src/types/ServerResponseData.ts @@ -0,0 +1,16 @@ +export interface ServerResponseData { + errorCode: AppErrorCodes; + message: string; + errors?: UnitError[]; +} + +export interface UnitError { + location: string; + message: string; +} + +export type AppErrorCodes = + | "INTERNAL_ERROR" + | "INPUT_ERROR" + | "UNAUTHORIZED" + | "UNKNOWN_USER"; diff --git a/src/utils/appError.ts b/src/utils/appError.ts new file mode 100644 index 0000000..f0af45b --- /dev/null +++ b/src/utils/appError.ts @@ -0,0 +1,11 @@ +import { UnitError } from "../types/ServerResponseData"; + +export class AppError extends Error { + constructor( + public statusCode: number, + public message: string, + public errors?: UnitError[] + ) { + super(message); + } +} diff --git a/src/utils/catchAsync.ts b/src/utils/catchAsync.ts new file mode 100644 index 0000000..e68c278 --- /dev/null +++ b/src/utils/catchAsync.ts @@ -0,0 +1,17 @@ +import { NextFunction, Request, Response } from "express"; +import { ResponseMessage } from "./responseMessage"; + +export const catchAsync = (fn: Function) => { + return async (req: Request, res: Response, next: NextFunction) => { + try { + await fn(req, res, next); + } catch (err: any) { + ResponseMessage.responedWithError( + res, + err.statusCode ? (err.statusCode < 500 ? "error" : "fail") : "fail", + err, + err.statusCode ?? 500 + ); + } + }; +}; diff --git a/src/utils/responseMessage.ts b/src/utils/responseMessage.ts new file mode 100644 index 0000000..9032de6 --- /dev/null +++ b/src/utils/responseMessage.ts @@ -0,0 +1,37 @@ +import { Response } from "express"; +import { IRespondSuccess } from "../types/IRespondSuccess"; +import { AppError } from "./appError"; +import { AppErrorCodes, UnitError } from "../types/ServerResponseData"; +import { IRespondError } from "../types/IRespondError"; + +export class ResponseMessage { + public static responedWithSuccess( + res: Response, + data: T, + statusCode: number + ) { + const response: IRespondSuccess = { + status: "success", + data: data, + }; + res.status(statusCode).json(response); + } + + public static responedWithError( + res: Response, + status: "error" | "fail", + statusCode: number, + error: AppError, + errorCode?: AppErrorCodes + ) { + const response: IRespondError = { + status: status, + error: { + errorCode: errorCode ? errorCode : "INTERNAL_ERROR", + message: error.message, + errors: error.errors ? error.errors : undefined, + }, + }; + res.status(statusCode).json(response); + } +}