docta-package 1.0.2 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (164) hide show
  1. package/README.md +1 -0
  2. package/build/config.d.ts +14 -0
  3. package/build/config.js +15 -0
  4. package/build/dto/input/doctor.d.ts +28 -0
  5. package/build/dto/input/doctor.js +131 -0
  6. package/build/dto/input/education.d.ts +4 -0
  7. package/build/dto/input/education.js +26 -0
  8. package/build/dto/input/faq.d.ts +4 -0
  9. package/build/dto/input/faq.js +26 -0
  10. package/build/dto/input/index.js +25 -0
  11. package/build/dto/input/language.d.ts +5 -0
  12. package/build/dto/input/language.js +28 -0
  13. package/build/dto/input/location.d.ts +9 -0
  14. package/build/dto/input/location.js +51 -0
  15. package/build/dto/input/patient.d.ts +6 -0
  16. package/build/dto/input/patient.js +33 -0
  17. package/build/dto/input/position.d.ts +6 -0
  18. package/build/dto/input/position.js +37 -0
  19. package/build/dto/input/specialty.d.ts +12 -0
  20. package/build/dto/input/specialty.js +56 -0
  21. package/build/dto/input/user.d.ts +29 -0
  22. package/build/dto/input/user.js +112 -0
  23. package/build/dto/output/doctor.d.ts +38 -0
  24. package/build/dto/output/doctor.js +61 -0
  25. package/build/dto/output/education.d.ts +6 -0
  26. package/build/dto/output/education.js +10 -0
  27. package/build/dto/output/faq.d.ts +6 -0
  28. package/build/dto/output/faq.js +10 -0
  29. package/build/dto/output/index.js +25 -0
  30. package/build/dto/output/language.d.ts +6 -0
  31. package/build/dto/output/language.js +10 -0
  32. package/build/dto/output/location.d.ts +11 -0
  33. package/build/dto/output/location.js +16 -0
  34. package/build/dto/output/patient.d.ts +20 -0
  35. package/build/dto/output/patient.js +34 -0
  36. package/build/dto/output/position.d.ts +8 -0
  37. package/build/dto/output/position.js +13 -0
  38. package/build/dto/output/specialty.d.ts +23 -0
  39. package/build/dto/output/specialty.js +40 -0
  40. package/build/dto/output/user.d.ts +24 -0
  41. package/build/dto/output/user.js +36 -0
  42. package/build/enums/gender.d.ts +4 -0
  43. package/build/enums/gender.js +8 -0
  44. package/build/enums/index.js +20 -0
  45. package/build/enums/language-levels.d.ts +8 -0
  46. package/build/enums/language-levels.js +12 -0
  47. package/build/enums/status-codes.d.ts +24 -0
  48. package/build/enums/status-codes.js +28 -0
  49. package/build/enums/user-role.d.ts +5 -0
  50. package/build/enums/user-role.js +9 -0
  51. package/build/errors/BadRequestError.d.ts +8 -0
  52. package/build/errors/BadRequestError.js +15 -0
  53. package/build/errors/CustomError.d.ts +8 -0
  54. package/build/errors/CustomError.js +13 -0
  55. package/build/errors/NotFoundError.d.ts +8 -0
  56. package/build/errors/NotFoundError.js +15 -0
  57. package/build/errors/UnAuthorizedError.d.ts +8 -0
  58. package/build/errors/UnAuthorizedError.js +15 -0
  59. package/build/errors/index.js +20 -0
  60. package/{src/index.ts → build/index.d.ts} +4 -6
  61. package/build/index.js +25 -0
  62. package/build/interfaces/LoggedInUserToken.d.ts +6 -0
  63. package/build/interfaces/LoggedInUserToken.js +2 -0
  64. package/build/interfaces/index.js +17 -0
  65. package/build/middleware/errorHandler.d.ts +2 -0
  66. package/build/middleware/errorHandler.js +26 -0
  67. package/build/middleware/index.js +21 -0
  68. package/build/middleware/multer.d.ts +6 -0
  69. package/build/middleware/multer.js +58 -0
  70. package/build/middleware/require-auth.d.ts +2 -0
  71. package/build/middleware/require-auth.js +39 -0
  72. package/build/middleware/validate-request.d.ts +2 -0
  73. package/build/middleware/validate-request.js +41 -0
  74. package/build/middleware/verify-roles.d.ts +3 -0
  75. package/build/middleware/verify-roles.js +17 -0
  76. package/build/models/base.d.ts +13 -0
  77. package/build/models/base.js +41 -0
  78. package/build/models/doctor.d.ts +33 -0
  79. package/build/models/doctor.js +55 -0
  80. package/build/models/education.d.ts +14 -0
  81. package/build/models/education.js +8 -0
  82. package/build/models/faq.d.ts +14 -0
  83. package/build/models/faq.js +8 -0
  84. package/build/models/index.js +26 -0
  85. package/build/models/language.d.ts +15 -0
  86. package/build/models/language.js +14 -0
  87. package/build/models/location.d.ts +19 -0
  88. package/{src/models/location.ts → build/models/location.js} +6 -17
  89. package/build/models/patient.d.ts +15 -0
  90. package/build/models/patient.js +15 -0
  91. package/build/models/position.d.ts +16 -0
  92. package/build/models/position.js +10 -0
  93. package/build/models/specialty.d.ts +15 -0
  94. package/build/models/specialty.js +12 -0
  95. package/build/models/user.d.ts +19 -0
  96. package/build/models/user.js +47 -0
  97. package/build/utils/index.js +21 -0
  98. package/build/utils/orchestration-result.d.ts +38 -0
  99. package/build/utils/orchestration-result.js +26 -0
  100. package/build/utils/s3-helper.d.ts +13 -0
  101. package/build/utils/s3-helper.js +67 -0
  102. package/build/utils/token-utils.d.ts +11 -0
  103. package/build/utils/token-utils.js +77 -0
  104. package/build/utils/validate-info.d.ts +4 -0
  105. package/build/utils/validate-info.js +20 -0
  106. package/build/utils/winston.d.ts +3 -0
  107. package/build/utils/winston.js +32 -0
  108. package/package.json +7 -2
  109. package/src/config.ts +0 -25
  110. package/src/dto/input/doctor.ts +0 -120
  111. package/src/dto/input/education.ts +0 -11
  112. package/src/dto/input/faq.ts +0 -11
  113. package/src/dto/input/language.ts +0 -13
  114. package/src/dto/input/location.ts +0 -31
  115. package/src/dto/input/patient.ts +0 -17
  116. package/src/dto/input/position.ts +0 -21
  117. package/src/dto/input/specialty.ts +0 -40
  118. package/src/dto/input/user.ts +0 -87
  119. package/src/dto/output/doctor.ts +0 -90
  120. package/src/dto/output/education.ts +0 -11
  121. package/src/dto/output/faq.ts +0 -11
  122. package/src/dto/output/language.ts +0 -11
  123. package/src/dto/output/location.ts +0 -21
  124. package/src/dto/output/patient.ts +0 -49
  125. package/src/dto/output/position.ts +0 -15
  126. package/src/dto/output/specialty.ts +0 -53
  127. package/src/dto/output/user.ts +0 -57
  128. package/src/enums/gender.ts +0 -4
  129. package/src/enums/language-levels.ts +0 -9
  130. package/src/enums/status-codes.ts +0 -28
  131. package/src/enums/user-role.ts +0 -5
  132. package/src/errors/BadRequestError.ts +0 -18
  133. package/src/errors/CustomError.ts +0 -18
  134. package/src/errors/NotFoundError.ts +0 -18
  135. package/src/errors/UnAuthorizedError.ts +0 -18
  136. package/src/interfaces/LoggedInUserToken.ts +0 -9
  137. package/src/middleware/errorHandler.ts +0 -31
  138. package/src/middleware/multer.ts +0 -74
  139. package/src/middleware/require-auth.ts +0 -46
  140. package/src/middleware/validate-request.ts +0 -40
  141. package/src/middleware/verify-roles.ts +0 -17
  142. package/src/models/base.ts +0 -52
  143. package/src/models/doctor.ts +0 -96
  144. package/src/models/education.ts +0 -14
  145. package/src/models/faq.ts +0 -14
  146. package/src/models/language.ts +0 -20
  147. package/src/models/patient.ts +0 -35
  148. package/src/models/position.ts +0 -19
  149. package/src/models/specialty.ts +0 -37
  150. package/src/models/user.ts +0 -67
  151. package/src/utils/orchestration-result.ts +0 -74
  152. package/src/utils/s3-helper.ts +0 -72
  153. package/src/utils/token-utils.ts +0 -86
  154. package/src/utils/validate-info.ts +0 -26
  155. package/src/utils/winston.ts +0 -33
  156. package/tsconfig.json +0 -120
  157. /package/{src/dto/input/index.ts → build/dto/input/index.d.ts} +0 -0
  158. /package/{src/dto/output/index.ts → build/dto/output/index.d.ts} +0 -0
  159. /package/{src/enums/index.ts → build/enums/index.d.ts} +0 -0
  160. /package/{src/errors/index.ts → build/errors/index.d.ts} +0 -0
  161. /package/{src/interfaces/index.ts → build/interfaces/index.d.ts} +0 -0
  162. /package/{src/middleware/index.ts → build/middleware/index.d.ts} +0 -0
  163. /package/{src/models/index.ts → build/models/index.d.ts} +0 -0
  164. /package/{src/utils/index.ts → build/utils/index.d.ts} +0 -0
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EnumUserRole = void 0;
4
+ var EnumUserRole;
5
+ (function (EnumUserRole) {
6
+ EnumUserRole["PATIENT"] = "patient";
7
+ EnumUserRole["DOCTOR"] = "doctor";
8
+ EnumUserRole["ADMIN"] = "admin";
9
+ })(EnumUserRole || (exports.EnumUserRole = EnumUserRole = {}));
@@ -0,0 +1,8 @@
1
+ import { CustomError } from ".";
2
+ import { EnumStatusCode } from "../enums";
3
+ import { ErrorResult } from "../utils";
4
+ export declare class BadRequestError extends CustomError {
5
+ statusCode: number;
6
+ constructor(code?: EnumStatusCode, message?: string);
7
+ serializeErrors(): ErrorResult;
8
+ }
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BadRequestError = void 0;
4
+ const _1 = require(".");
5
+ const enums_1 = require("../enums");
6
+ class BadRequestError extends _1.CustomError {
7
+ constructor(code = enums_1.EnumStatusCode.BAD_REQUEST, message = "Bad Request") {
8
+ super(message, code, 400);
9
+ this.statusCode = 400;
10
+ }
11
+ serializeErrors() {
12
+ return { code: this.code, message: this.message };
13
+ }
14
+ }
15
+ exports.BadRequestError = BadRequestError;
@@ -0,0 +1,8 @@
1
+ import { EnumStatusCode } from "../enums";
2
+ import { ErrorResult } from "../utils";
3
+ export declare abstract class CustomError extends Error {
4
+ readonly code: EnumStatusCode;
5
+ readonly statusCode: number;
6
+ constructor(message: string, code: EnumStatusCode, statusCode: number);
7
+ abstract serializeErrors(): ErrorResult;
8
+ }
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CustomError = void 0;
4
+ class CustomError extends Error {
5
+ constructor(message, code, statusCode) {
6
+ super(message);
7
+ this.code = code;
8
+ this.statusCode = statusCode;
9
+ // Maintains proper prototype chain for built-in Error
10
+ Object.setPrototypeOf(this, new.target.prototype);
11
+ }
12
+ }
13
+ exports.CustomError = CustomError;
@@ -0,0 +1,8 @@
1
+ import { CustomError } from ".";
2
+ import { EnumStatusCode } from "../enums";
3
+ import { ErrorResult } from "../utils";
4
+ export declare class NotFoundError extends CustomError {
5
+ statusCode: number;
6
+ constructor(code?: EnumStatusCode, message?: string);
7
+ serializeErrors(): ErrorResult;
8
+ }
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NotFoundError = void 0;
4
+ const _1 = require(".");
5
+ const enums_1 = require("../enums");
6
+ class NotFoundError extends _1.CustomError {
7
+ constructor(code = enums_1.EnumStatusCode.NOT_FOUND, message = "Not Found") {
8
+ super(message, code, 404);
9
+ this.statusCode = 404;
10
+ }
11
+ serializeErrors() {
12
+ return { code: this.code, message: this.message };
13
+ }
14
+ }
15
+ exports.NotFoundError = NotFoundError;
@@ -0,0 +1,8 @@
1
+ import { CustomError } from ".";
2
+ import { EnumStatusCode } from "../enums";
3
+ import { ErrorResult } from "../utils";
4
+ export declare class UnAuthorizedError extends CustomError {
5
+ statusCode: number;
6
+ constructor(code?: EnumStatusCode, message?: string);
7
+ serializeErrors(): ErrorResult;
8
+ }
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UnAuthorizedError = void 0;
4
+ const _1 = require(".");
5
+ const enums_1 = require("../enums");
6
+ class UnAuthorizedError extends _1.CustomError {
7
+ constructor(code = enums_1.EnumStatusCode.UNAUTHORIZED, message = "Unauthorized") {
8
+ super(message, code, 401);
9
+ this.statusCode = 401;
10
+ }
11
+ serializeErrors() {
12
+ return { code: this.code, message: this.message };
13
+ }
14
+ }
15
+ exports.UnAuthorizedError = UnAuthorizedError;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./BadRequestError"), exports);
18
+ __exportStar(require("./CustomError"), exports);
19
+ __exportStar(require("./NotFoundError"), exports);
20
+ __exportStar(require("./UnAuthorizedError"), exports);
@@ -1,6 +1,5 @@
1
1
  import "reflect-metadata";
2
2
  import { LoggedInUserTokenData } from "./interfaces";
3
-
4
3
  export * from "./errors";
5
4
  export * from "./middleware";
6
5
  export * from "./models";
@@ -9,11 +8,10 @@ export * from "./dto/output";
9
8
  export * from "./utils";
10
9
  export * from "./config";
11
10
  export * from "./interfaces";
12
-
13
11
  declare global {
14
- namespace Express {
15
- interface Request {
16
- currentUser?: LoggedInUserTokenData;
12
+ namespace Express {
13
+ interface Request {
14
+ currentUser?: LoggedInUserTokenData;
15
+ }
17
16
  }
18
- }
19
17
  }
package/build/index.js ADDED
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ require("reflect-metadata");
18
+ __exportStar(require("./errors"), exports);
19
+ __exportStar(require("./middleware"), exports);
20
+ __exportStar(require("./models"), exports);
21
+ __exportStar(require("./dto/input"), exports);
22
+ __exportStar(require("./dto/output"), exports);
23
+ __exportStar(require("./utils"), exports);
24
+ __exportStar(require("./config"), exports);
25
+ __exportStar(require("./interfaces"), exports);
@@ -0,0 +1,6 @@
1
+ import { EnumUserRole } from "../enums";
2
+ export interface LoggedInUserTokenData {
3
+ id: string;
4
+ email: string;
5
+ role: EnumUserRole;
6
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./LoggedInUserToken"), exports);
@@ -0,0 +1,2 @@
1
+ import { NextFunction, Request, Response } from "express";
2
+ export declare const errorHandler: (err: Error, req: Request, res: Response, next: NextFunction) => void;
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.errorHandler = void 0;
4
+ const errors_1 = require("../errors");
5
+ const enums_1 = require("../enums");
6
+ const utils_1 = require("../utils");
7
+ const errorHandler = (err, req, res, next) => {
8
+ if (err instanceof errors_1.CustomError) {
9
+ res.status(err.statusCode).json(err.serializeErrors());
10
+ return;
11
+ }
12
+ // Log the error with stack trace and request info
13
+ utils_1.logger.error("Unhandled error", {
14
+ message: err.message,
15
+ stack: err.stack,
16
+ path: req.originalUrl,
17
+ method: req.method,
18
+ body: req.body,
19
+ });
20
+ console.error(err);
21
+ res.status(500).json({
22
+ code: enums_1.EnumStatusCode.SOMETHING_WENT_WRONG,
23
+ message: "Internal Server Error",
24
+ });
25
+ };
26
+ exports.errorHandler = errorHandler;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./errorHandler"), exports);
18
+ __exportStar(require("./multer"), exports);
19
+ __exportStar(require("./require-auth"), exports);
20
+ __exportStar(require("./validate-request"), exports);
21
+ __exportStar(require("./verify-roles"), exports);
@@ -0,0 +1,6 @@
1
+ import multer from "multer";
2
+ import { ErrorRequestHandler } from "express";
3
+ export declare const imageUpload: multer.Multer;
4
+ export declare const transformMulterError: ErrorRequestHandler;
5
+ export declare const uploadSingleImage: (fieldName: string) => (ErrorRequestHandler<import("express-serve-static-core").ParamsDictionary, any, any, import("qs").ParsedQs, Record<string, any>> | import("express").RequestHandler<import("express-serve-static-core").ParamsDictionary, any, any, import("qs").ParsedQs, Record<string, any>>)[];
6
+ export declare const uploadArrayImages: (fieldName: string, maxCount: number) => (ErrorRequestHandler<import("express-serve-static-core").ParamsDictionary, any, any, import("qs").ParsedQs, Record<string, any>> | import("express").RequestHandler<import("express-serve-static-core").ParamsDictionary, any, any, import("qs").ParsedQs, Record<string, any>>)[];
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.uploadArrayImages = exports.uploadSingleImage = exports.transformMulterError = exports.imageUpload = void 0;
7
+ const multer_1 = __importDefault(require("multer"));
8
+ const errors_1 = require("../errors");
9
+ const enums_1 = require("../enums");
10
+ // 5 MB file size limit
11
+ const fileSize = 5 * 1024 * 1024;
12
+ // Use memory storage since files are likely forwarded to S3
13
+ const storage = multer_1.default.memoryStorage();
14
+ const allowedTypes = [
15
+ "image/jpeg",
16
+ "image/png",
17
+ "image/gif",
18
+ "image/bmp",
19
+ "image/webp",
20
+ "image/tiff",
21
+ "image/svg+xml",
22
+ ];
23
+ // Base multer instance configured for images
24
+ exports.imageUpload = (0, multer_1.default)({
25
+ storage,
26
+ limits: { fileSize },
27
+ fileFilter(req, file, cb) {
28
+ if (!allowedTypes.includes(file.mimetype)) {
29
+ return cb(new errors_1.BadRequestError(enums_1.EnumStatusCode.FILE_TYPE_MISMATCH, "Only image files are allowed!"));
30
+ }
31
+ cb(null, true);
32
+ },
33
+ });
34
+ // Error transformer to convert Multer errors into our CustomError format
35
+ const transformMulterError = (err, _req, _res, next) => {
36
+ // Multer throws MulterError for limits and other internal validations
37
+ if (err && err.name === "MulterError") {
38
+ const multerErr = err;
39
+ if (multerErr.code === "LIMIT_FILE_SIZE") {
40
+ return next(new errors_1.BadRequestError(enums_1.EnumStatusCode.FILE_TOO_LARGE, `File too large. Max ${Math.floor(fileSize / (1024 * 1024))}MB`));
41
+ }
42
+ return next(new errors_1.BadRequestError(enums_1.EnumStatusCode.BAD_REQUEST, multerErr.message));
43
+ }
44
+ // If it's already a CustomError or another error, pass it along
45
+ return next(err);
46
+ };
47
+ exports.transformMulterError = transformMulterError;
48
+ // Convenience helpers to use directly in routers
49
+ const uploadSingleImage = (fieldName) => [
50
+ exports.imageUpload.single(fieldName),
51
+ exports.transformMulterError,
52
+ ];
53
+ exports.uploadSingleImage = uploadSingleImage;
54
+ const uploadArrayImages = (fieldName, maxCount) => [
55
+ exports.imageUpload.array(fieldName, maxCount),
56
+ exports.transformMulterError,
57
+ ];
58
+ exports.uploadArrayImages = uploadArrayImages;
@@ -0,0 +1,2 @@
1
+ import { Request, Response, NextFunction } from "express";
2
+ export declare const requireAuth: (req: Request, res: Response, next: NextFunction) => Promise<void>;
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.requireAuth = void 0;
13
+ const enums_1 = require("../enums");
14
+ const errors_1 = require("../errors");
15
+ const utils_1 = require("../utils");
16
+ const requireAuth = (req, res, next) => __awaiter(void 0, void 0, void 0, function* () {
17
+ var _a;
18
+ const accessToken = (_a = req.header("Authorization")) === null || _a === void 0 ? void 0 : _a.replace("Bearer ", "");
19
+ if (!accessToken) {
20
+ throw new errors_1.UnAuthorizedError(enums_1.EnumStatusCode.NO_ACCESS_TOKEN, "No access token");
21
+ }
22
+ try {
23
+ const decoded = utils_1.TokenUtils.verifyAccessToken(accessToken);
24
+ if (!decoded) {
25
+ throw new errors_1.UnAuthorizedError(enums_1.EnumStatusCode.CANNOT_DECODE_ACCESS_TOKEN, "Cannot decode access token");
26
+ }
27
+ req.currentUser = decoded;
28
+ next();
29
+ }
30
+ catch (error) {
31
+ if (error.name === "TokenExpiredError") {
32
+ throw new errors_1.UnAuthorizedError(enums_1.EnumStatusCode.ACCESS_TOKEN_EXPIRED, "Access token has expired.");
33
+ }
34
+ else {
35
+ throw new errors_1.UnAuthorizedError(enums_1.EnumStatusCode.CANNOT_DECODE_ACCESS_TOKEN, "Cannot decode access token");
36
+ }
37
+ }
38
+ });
39
+ exports.requireAuth = requireAuth;
@@ -0,0 +1,2 @@
1
+ import { RequestHandler } from "express";
2
+ export declare const validationMiddleware: (type: any, skipMissingProperties?: boolean, whitelist?: boolean, forbidNonWhitelisted?: boolean) => RequestHandler;
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.validationMiddleware = void 0;
13
+ const class_transformer_1 = require("class-transformer");
14
+ const class_validator_1 = require("class-validator");
15
+ const errors_1 = require("../errors");
16
+ const enums_1 = require("../enums");
17
+ const validationMiddleware = (type, skipMissingProperties = false, whitelist = true, forbidNonWhitelisted = true) => {
18
+ return (req, res, next) => __awaiter(void 0, void 0, void 0, function* () {
19
+ try {
20
+ const object = (0, class_transformer_1.plainToInstance)(type, req.body);
21
+ const errors = yield (0, class_validator_1.validate)(object, {
22
+ skipMissingProperties,
23
+ whitelist,
24
+ forbidNonWhitelisted,
25
+ });
26
+ if (errors.length > 0) {
27
+ const message = errors
28
+ .map((error) => { var _a; return Object.values((_a = error.constraints) !== null && _a !== void 0 ? _a : {}); })
29
+ .flat()
30
+ .join(", ");
31
+ return next(new errors_1.BadRequestError(enums_1.EnumStatusCode.VALIDATION_ERROR, message));
32
+ }
33
+ req.body = object;
34
+ next();
35
+ }
36
+ catch (err) {
37
+ next(err);
38
+ }
39
+ });
40
+ };
41
+ exports.validationMiddleware = validationMiddleware;
@@ -0,0 +1,3 @@
1
+ import { Request, Response, NextFunction } from "express";
2
+ import { EnumUserRole } from "../enums/user-role";
3
+ export declare const verifyRoles: (roles: EnumUserRole[]) => (req: Request, res: Response, next: NextFunction) => void;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.verifyRoles = void 0;
4
+ const errors_1 = require("../errors");
5
+ const enums_1 = require("../enums");
6
+ const verifyRoles = (roles) => {
7
+ return (req, res, next) => {
8
+ var _a;
9
+ if (roles.includes((_a = req.currentUser) === null || _a === void 0 ? void 0 : _a.role)) {
10
+ next();
11
+ }
12
+ else {
13
+ throw new errors_1.UnAuthorizedError(enums_1.EnumStatusCode.NOT_ALLOWED, "You are not allowed to perform this action.");
14
+ }
15
+ };
16
+ };
17
+ exports.verifyRoles = verifyRoles;
@@ -0,0 +1,13 @@
1
+ import { Schema, SchemaDefinition } from "mongoose";
2
+ import { IUserDocument } from ".";
3
+ export interface IBaseModel {
4
+ isDeleted: boolean;
5
+ createdAt: number;
6
+ updatedAt: number;
7
+ deletedAt?: number;
8
+ createdBy?: IUserDocument;
9
+ updatedBy?: IUserDocument;
10
+ deletedBy?: IUserDocument;
11
+ }
12
+ export declare const BaseSchemaFields: SchemaDefinition;
13
+ export declare function BaseSchemaPlugin(schema: Schema): void;
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BaseSchemaFields = void 0;
4
+ exports.BaseSchemaPlugin = BaseSchemaPlugin;
5
+ const mongoose_1 = require("mongoose");
6
+ // Base Schema
7
+ exports.BaseSchemaFields = {
8
+ isDeleted: { type: Boolean, default: false },
9
+ createdAt: { type: Number, required: true, default: Date.now() },
10
+ updatedAt: { type: Number, required: true },
11
+ deletedAt: { type: Number, required: false },
12
+ createdBy: {
13
+ type: mongoose_1.Schema.Types.ObjectId,
14
+ ref: "User",
15
+ required: false,
16
+ },
17
+ updatedBy: {
18
+ type: mongoose_1.Schema.Types.ObjectId,
19
+ ref: "User",
20
+ required: false,
21
+ },
22
+ deletedBy: {
23
+ type: mongoose_1.Schema.Types.ObjectId,
24
+ ref: "User",
25
+ required: false,
26
+ },
27
+ };
28
+ function BaseSchemaPlugin(schema) {
29
+ schema.add({
30
+ isDeleted: { type: Boolean, default: false },
31
+ createdAt: { type: Number, default: () => Date.now() },
32
+ updatedAt: { type: Number, default: () => Date.now() },
33
+ deletedAt: { type: Number },
34
+ });
35
+ schema.pre("save", function () {
36
+ this.updatedAt = Date.now();
37
+ });
38
+ schema.pre("findOneAndUpdate", function () {
39
+ this.set({ updatedAt: Date.now() });
40
+ });
41
+ }
@@ -0,0 +1,33 @@
1
+ import { Document, Model } from "mongoose";
2
+ import { ISpecialtyDocument } from ".";
3
+ import { IUserDocument } from ".";
4
+ import { IBaseModel } from ".";
5
+ import { IEducation } from ".";
6
+ import { IPosition } from ".";
7
+ import { ILanguage } from ".";
8
+ import { IFaq } from ".";
9
+ import { ILocation } from ".";
10
+ export interface IDoctor extends IBaseModel {
11
+ name: string;
12
+ slug: string;
13
+ isActive: boolean;
14
+ user: IUserDocument;
15
+ specialty: ISpecialtyDocument;
16
+ biography: string;
17
+ consultationFee: number;
18
+ isVerified: boolean;
19
+ isVisible: boolean;
20
+ isDeactivatedByAdmin: boolean;
21
+ photo?: string;
22
+ educations: IEducation[];
23
+ positions: IPosition[];
24
+ languages: ILanguage[];
25
+ faqs: IFaq[];
26
+ expertises: string[];
27
+ location?: ILocation;
28
+ }
29
+ export interface IDoctorDocument extends IDoctor, Document {
30
+ }
31
+ export interface IDoctorModel extends Model<IDoctorDocument> {
32
+ }
33
+ export declare const DoctorModel: IDoctorModel;
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.DoctorModel = void 0;
13
+ const mongoose_1 = require("mongoose");
14
+ const _1 = require(".");
15
+ const _2 = require(".");
16
+ const _3 = require(".");
17
+ const _4 = require(".");
18
+ const _5 = require(".");
19
+ const _6 = require(".");
20
+ const _7 = require(".");
21
+ const _8 = require(".");
22
+ const DoctorSchema = new mongoose_1.Schema(Object.assign(Object.assign({}, _3.BaseSchemaFields), { user: {
23
+ type: mongoose_1.Schema.Types.ObjectId,
24
+ ref: _2.UserModel,
25
+ required: true,
26
+ onDelete: "cascade",
27
+ }, specialty: {
28
+ type: mongoose_1.Schema.Types.ObjectId,
29
+ ref: _1.SpecialtyModel,
30
+ required: true,
31
+ }, name: { type: String, required: true, trim: true }, biography: { type: String, required: false }, slug: { type: String, required: true, unique: true, trim: true }, isActive: { type: Boolean, default: false }, consultationFee: { type: Number, required: false }, isVerified: { type: Boolean, default: false }, isVisible: { type: Boolean, default: true }, isDeactivatedByAdmin: { type: Boolean, default: false }, photo: { type: String, required: false }, educations: { type: [_4.EducationSchema], required: true, default: [] }, positions: { type: [_5.PositionSchema], required: true, default: [] }, languages: { type: [_6.LanguageSchema], required: true, default: [] }, faqs: { type: [_7.FaqSchema], required: true, default: [] }, expertises: { type: [String], required: true, default: [] }, location: { type: _8.LocationSchema, required: false } }));
32
+ const createSlug = (text) => text
33
+ .toLowerCase()
34
+ .trim()
35
+ .replace(/[\s\W-]+/g, "-")
36
+ .replace(/^-+|-+$/g, "");
37
+ DoctorSchema.pre("validate", function (next) {
38
+ return __awaiter(this, void 0, void 0, function* () {
39
+ // Only set slug if it hasn't been set before
40
+ if (this.slug)
41
+ return next();
42
+ const baseSlug = createSlug(this.name);
43
+ let slug = baseSlug;
44
+ let counter = 0;
45
+ const Doctor = this.constructor;
46
+ while (yield Doctor.exists({ slug })) {
47
+ counter += 1;
48
+ slug = `${baseSlug}-${counter}`;
49
+ }
50
+ this.slug = slug;
51
+ next();
52
+ });
53
+ });
54
+ DoctorSchema.plugin(_3.BaseSchemaPlugin);
55
+ exports.DoctorModel = (0, mongoose_1.model)("Doctor", DoctorSchema);
@@ -0,0 +1,14 @@
1
+ import { Schema } from "mongoose";
2
+ export interface IEducation {
3
+ year: number;
4
+ title: string;
5
+ }
6
+ export declare const EducationSchema: Schema<IEducation, import("mongoose").Model<IEducation, any, any, any, import("mongoose").Document<unknown, any, IEducation, any, {}> & IEducation & {
7
+ _id: import("mongoose").Types.ObjectId;
8
+ } & {
9
+ __v: number;
10
+ }, any>, {}, {}, {}, {}, import("mongoose").DefaultSchemaOptions, IEducation, import("mongoose").Document<unknown, {}, import("mongoose").FlatRecord<IEducation>, {}, import("mongoose").ResolveSchemaOptions<import("mongoose").DefaultSchemaOptions>> & import("mongoose").FlatRecord<IEducation> & {
11
+ _id: import("mongoose").Types.ObjectId;
12
+ } & {
13
+ __v: number;
14
+ }>;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EducationSchema = void 0;
4
+ const mongoose_1 = require("mongoose");
5
+ exports.EducationSchema = new mongoose_1.Schema({
6
+ year: { type: Number, required: true },
7
+ title: { type: String, required: true, trim: true },
8
+ }, { _id: false });
@@ -0,0 +1,14 @@
1
+ import { Schema } from "mongoose";
2
+ export interface IFaq {
3
+ title: string;
4
+ description: string;
5
+ }
6
+ export declare const FaqSchema: Schema<IFaq, import("mongoose").Model<IFaq, any, any, any, import("mongoose").Document<unknown, any, IFaq, any, {}> & IFaq & {
7
+ _id: import("mongoose").Types.ObjectId;
8
+ } & {
9
+ __v: number;
10
+ }, any>, {}, {}, {}, {}, import("mongoose").DefaultSchemaOptions, IFaq, import("mongoose").Document<unknown, {}, import("mongoose").FlatRecord<IFaq>, {}, import("mongoose").ResolveSchemaOptions<import("mongoose").DefaultSchemaOptions>> & import("mongoose").FlatRecord<IFaq> & {
11
+ _id: import("mongoose").Types.ObjectId;
12
+ } & {
13
+ __v: number;
14
+ }>;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FaqSchema = void 0;
4
+ const mongoose_1 = require("mongoose");
5
+ exports.FaqSchema = new mongoose_1.Schema({
6
+ title: { type: String, required: true, trim: true },
7
+ description: { type: String, required: true, trim: true },
8
+ }, { _id: false });