docta-package 1.0.2 → 1.2.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.
- package/README.md +1 -0
- package/build/config.d.ts +14 -0
- package/build/config.js +15 -0
- package/build/dto/input/doctor.d.ts +28 -0
- package/build/dto/input/doctor.js +131 -0
- package/build/dto/input/education.d.ts +4 -0
- package/build/dto/input/education.js +26 -0
- package/build/dto/input/faq.d.ts +4 -0
- package/build/dto/input/faq.js +26 -0
- package/build/dto/input/index.js +25 -0
- package/build/dto/input/language.d.ts +5 -0
- package/build/dto/input/language.js +28 -0
- package/build/dto/input/location.d.ts +9 -0
- package/build/dto/input/location.js +51 -0
- package/build/dto/input/patient.d.ts +6 -0
- package/build/dto/input/patient.js +33 -0
- package/build/dto/input/position.d.ts +6 -0
- package/build/dto/input/position.js +37 -0
- package/build/dto/input/specialty.d.ts +12 -0
- package/build/dto/input/specialty.js +56 -0
- package/build/dto/input/user.d.ts +29 -0
- package/build/dto/input/user.js +112 -0
- package/build/dto/output/doctor.d.ts +38 -0
- package/build/dto/output/doctor.js +61 -0
- package/build/dto/output/education.d.ts +6 -0
- package/build/dto/output/education.js +10 -0
- package/build/dto/output/faq.d.ts +6 -0
- package/build/dto/output/faq.js +10 -0
- package/build/dto/output/index.js +25 -0
- package/build/dto/output/language.d.ts +6 -0
- package/build/dto/output/language.js +10 -0
- package/build/dto/output/location.d.ts +11 -0
- package/build/dto/output/location.js +16 -0
- package/build/dto/output/patient.d.ts +20 -0
- package/build/dto/output/patient.js +34 -0
- package/build/dto/output/position.d.ts +8 -0
- package/build/dto/output/position.js +13 -0
- package/build/dto/output/specialty.d.ts +23 -0
- package/build/dto/output/specialty.js +40 -0
- package/build/dto/output/user.d.ts +24 -0
- package/build/dto/output/user.js +36 -0
- package/build/enums/gender.d.ts +4 -0
- package/build/enums/gender.js +8 -0
- package/build/enums/index.js +20 -0
- package/build/enums/language-levels.d.ts +8 -0
- package/build/enums/language-levels.js +12 -0
- package/build/enums/status-codes.d.ts +24 -0
- package/build/enums/status-codes.js +28 -0
- package/build/enums/user-role.d.ts +5 -0
- package/build/enums/user-role.js +9 -0
- package/build/errors/BadRequestError.d.ts +8 -0
- package/build/errors/BadRequestError.js +15 -0
- package/build/errors/CustomError.d.ts +8 -0
- package/build/errors/CustomError.js +13 -0
- package/build/errors/NotFoundError.d.ts +8 -0
- package/build/errors/NotFoundError.js +15 -0
- package/build/errors/UnAuthorizedError.d.ts +8 -0
- package/build/errors/UnAuthorizedError.js +15 -0
- package/build/errors/index.js +20 -0
- package/{src/index.ts → build/index.d.ts} +4 -6
- package/build/index.js +25 -0
- package/build/interfaces/LoggedInUserToken.d.ts +6 -0
- package/build/interfaces/LoggedInUserToken.js +2 -0
- package/build/interfaces/index.js +17 -0
- package/build/middleware/errorHandler.d.ts +2 -0
- package/build/middleware/errorHandler.js +26 -0
- package/build/middleware/index.js +21 -0
- package/build/middleware/multer.d.ts +6 -0
- package/build/middleware/multer.js +58 -0
- package/build/middleware/require-auth.d.ts +2 -0
- package/build/middleware/require-auth.js +39 -0
- package/build/middleware/validate-request.d.ts +2 -0
- package/build/middleware/validate-request.js +41 -0
- package/build/middleware/verify-roles.d.ts +3 -0
- package/build/middleware/verify-roles.js +17 -0
- package/build/models/base.d.ts +13 -0
- package/build/models/base.js +41 -0
- package/build/models/doctor.d.ts +33 -0
- package/build/models/doctor.js +55 -0
- package/build/models/education.d.ts +14 -0
- package/build/models/education.js +8 -0
- package/build/models/faq.d.ts +14 -0
- package/build/models/faq.js +8 -0
- package/build/models/index.js +26 -0
- package/build/models/language.d.ts +15 -0
- package/build/models/language.js +14 -0
- package/build/models/location.d.ts +19 -0
- package/{src/models/location.ts → build/models/location.js} +6 -17
- package/build/models/patient.d.ts +15 -0
- package/build/models/patient.js +15 -0
- package/build/models/position.d.ts +16 -0
- package/build/models/position.js +10 -0
- package/build/models/specialty.d.ts +15 -0
- package/build/models/specialty.js +12 -0
- package/build/models/user.d.ts +19 -0
- package/build/models/user.js +47 -0
- package/build/utils/index.js +21 -0
- package/build/utils/orchestration-result.d.ts +38 -0
- package/build/utils/orchestration-result.js +26 -0
- package/build/utils/s3-helper.d.ts +13 -0
- package/build/utils/s3-helper.js +67 -0
- package/build/utils/token-utils.d.ts +11 -0
- package/build/utils/token-utils.js +77 -0
- package/build/utils/validate-info.d.ts +4 -0
- package/build/utils/validate-info.js +20 -0
- package/build/utils/winston.d.ts +3 -0
- package/build/utils/winston.js +32 -0
- package/package.json +9 -2
- package/src/config.ts +0 -25
- package/src/dto/input/doctor.ts +0 -120
- package/src/dto/input/education.ts +0 -11
- package/src/dto/input/faq.ts +0 -11
- package/src/dto/input/language.ts +0 -13
- package/src/dto/input/location.ts +0 -31
- package/src/dto/input/patient.ts +0 -17
- package/src/dto/input/position.ts +0 -21
- package/src/dto/input/specialty.ts +0 -40
- package/src/dto/input/user.ts +0 -87
- package/src/dto/output/doctor.ts +0 -90
- package/src/dto/output/education.ts +0 -11
- package/src/dto/output/faq.ts +0 -11
- package/src/dto/output/language.ts +0 -11
- package/src/dto/output/location.ts +0 -21
- package/src/dto/output/patient.ts +0 -49
- package/src/dto/output/position.ts +0 -15
- package/src/dto/output/specialty.ts +0 -53
- package/src/dto/output/user.ts +0 -57
- package/src/enums/gender.ts +0 -4
- package/src/enums/language-levels.ts +0 -9
- package/src/enums/status-codes.ts +0 -28
- package/src/enums/user-role.ts +0 -5
- package/src/errors/BadRequestError.ts +0 -18
- package/src/errors/CustomError.ts +0 -18
- package/src/errors/NotFoundError.ts +0 -18
- package/src/errors/UnAuthorizedError.ts +0 -18
- package/src/interfaces/LoggedInUserToken.ts +0 -9
- package/src/middleware/errorHandler.ts +0 -31
- package/src/middleware/multer.ts +0 -74
- package/src/middleware/require-auth.ts +0 -46
- package/src/middleware/validate-request.ts +0 -40
- package/src/middleware/verify-roles.ts +0 -17
- package/src/models/base.ts +0 -52
- package/src/models/doctor.ts +0 -96
- package/src/models/education.ts +0 -14
- package/src/models/faq.ts +0 -14
- package/src/models/language.ts +0 -20
- package/src/models/patient.ts +0 -35
- package/src/models/position.ts +0 -19
- package/src/models/specialty.ts +0 -37
- package/src/models/user.ts +0 -67
- package/src/utils/orchestration-result.ts +0 -74
- package/src/utils/s3-helper.ts +0 -72
- package/src/utils/token-utils.ts +0 -86
- package/src/utils/validate-info.ts +0 -26
- package/src/utils/winston.ts +0 -33
- package/tsconfig.json +0 -120
- /package/{src/dto/input/index.ts → build/dto/input/index.d.ts} +0 -0
- /package/{src/dto/output/index.ts → build/dto/output/index.d.ts} +0 -0
- /package/{src/enums/index.ts → build/enums/index.d.ts} +0 -0
- /package/{src/errors/index.ts → build/errors/index.d.ts} +0 -0
- /package/{src/interfaces/index.ts → build/interfaces/index.d.ts} +0 -0
- /package/{src/middleware/index.ts → build/middleware/index.d.ts} +0 -0
- /package/{src/models/index.ts → build/models/index.d.ts} +0 -0
- /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
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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,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,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,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,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,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 });
|