express-ts-api-starter 1.0.1

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 (89) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +495 -0
  3. package/dist/app.d.ts +4 -0
  4. package/dist/app.d.ts.map +1 -0
  5. package/dist/app.js +42 -0
  6. package/dist/config/dbConfig.d.ts +3 -0
  7. package/dist/config/dbConfig.d.ts.map +1 -0
  8. package/dist/config/dbConfig.js +21 -0
  9. package/dist/config/emailConfig.d.ts +1 -0
  10. package/dist/config/emailConfig.d.ts.map +1 -0
  11. package/dist/config/emailConfig.js +1 -0
  12. package/dist/config/envConfig.d.ts +8 -0
  13. package/dist/config/envConfig.d.ts.map +1 -0
  14. package/dist/config/envConfig.js +22 -0
  15. package/dist/config/rateLimitConfig.d.ts +2 -0
  16. package/dist/config/rateLimitConfig.d.ts.map +1 -0
  17. package/dist/config/rateLimitConfig.js +9 -0
  18. package/dist/constants/index.d.ts +6 -0
  19. package/dist/constants/index.d.ts.map +1 -0
  20. package/dist/constants/index.js +9 -0
  21. package/dist/interfaces/userInterface.d.ts +11 -0
  22. package/dist/interfaces/userInterface.d.ts.map +1 -0
  23. package/dist/interfaces/userInterface.js +2 -0
  24. package/dist/messages/index.d.ts +25 -0
  25. package/dist/messages/index.d.ts.map +1 -0
  26. package/dist/messages/index.js +30 -0
  27. package/dist/middleware/auth.d.ts +9 -0
  28. package/dist/middleware/auth.d.ts.map +1 -0
  29. package/dist/middleware/auth.js +30 -0
  30. package/dist/middleware/errorMiddleware.d.ts +4 -0
  31. package/dist/middleware/errorMiddleware.d.ts.map +1 -0
  32. package/dist/middleware/errorMiddleware.js +15 -0
  33. package/dist/middleware/logMiddleware.d.ts +4 -0
  34. package/dist/middleware/logMiddleware.d.ts.map +1 -0
  35. package/dist/middleware/logMiddleware.js +29 -0
  36. package/dist/middleware/requestIdMiddleware.d.ts +3 -0
  37. package/dist/middleware/requestIdMiddleware.d.ts.map +1 -0
  38. package/dist/middleware/requestIdMiddleware.js +11 -0
  39. package/dist/middleware/uploadMiddleware.d.ts +3 -0
  40. package/dist/middleware/uploadMiddleware.d.ts.map +1 -0
  41. package/dist/middleware/uploadMiddleware.js +36 -0
  42. package/dist/middleware/validatorMiddleware.d.ts +3 -0
  43. package/dist/middleware/validatorMiddleware.d.ts.map +1 -0
  44. package/dist/middleware/validatorMiddleware.js +13 -0
  45. package/dist/models/UserModel.d.ts +9 -0
  46. package/dist/models/UserModel.d.ts.map +1 -0
  47. package/dist/models/UserModel.js +59 -0
  48. package/dist/modules/users/tests/userController.test.d.ts +2 -0
  49. package/dist/modules/users/tests/userController.test.d.ts.map +1 -0
  50. package/dist/modules/users/userController.d.ts +5 -0
  51. package/dist/modules/users/userController.d.ts.map +1 -0
  52. package/dist/modules/users/userController.js +90 -0
  53. package/dist/modules/users/userMessage.d.ts +11 -0
  54. package/dist/modules/users/userMessage.d.ts.map +1 -0
  55. package/dist/modules/users/userMessage.js +11 -0
  56. package/dist/modules/users/userService.d.ts +16 -0
  57. package/dist/modules/users/userService.d.ts.map +1 -0
  58. package/dist/modules/users/userService.js +67 -0
  59. package/dist/routes/index.d.ts +3 -0
  60. package/dist/routes/index.d.ts.map +1 -0
  61. package/dist/routes/index.js +11 -0
  62. package/dist/routes/usersRoute.d.ts +3 -0
  63. package/dist/routes/usersRoute.d.ts.map +1 -0
  64. package/dist/routes/usersRoute.js +11 -0
  65. package/dist/server.d.ts +2 -0
  66. package/dist/server.d.ts.map +1 -0
  67. package/dist/server.js +45 -0
  68. package/dist/types/index.d.ts +12 -0
  69. package/dist/types/index.d.ts.map +1 -0
  70. package/dist/types/index.js +2 -0
  71. package/dist/types/roleType.d.ts +2 -0
  72. package/dist/types/roleType.d.ts.map +1 -0
  73. package/dist/types/roleType.js +2 -0
  74. package/dist/types/userTypes.d.ts +20 -0
  75. package/dist/types/userTypes.d.ts.map +1 -0
  76. package/dist/types/userTypes.js +2 -0
  77. package/dist/utils/authFunction.d.ts +3 -0
  78. package/dist/utils/authFunction.d.ts.map +1 -0
  79. package/dist/utils/authFunction.js +50 -0
  80. package/dist/utils/responseUtil.d.ts +5 -0
  81. package/dist/utils/responseUtil.d.ts.map +1 -0
  82. package/dist/utils/responseUtil.js +27 -0
  83. package/dist/validators/index.d.ts +2 -0
  84. package/dist/validators/index.d.ts.map +1 -0
  85. package/dist/validators/index.js +17 -0
  86. package/dist/validators/userValidators.d.ts +3 -0
  87. package/dist/validators/userValidators.d.ts.map +1 -0
  88. package/dist/validators/userValidators.js +34 -0
  89. package/package.json +160 -0
@@ -0,0 +1,11 @@
1
+ import { TRoles } from "../types/userTypes";
2
+ export interface IUser {
3
+ _id?: string;
4
+ name: string;
5
+ email: string;
6
+ passwordHash: string;
7
+ role: TRoles;
8
+ phone: string;
9
+ status: string;
10
+ }
11
+ //# sourceMappingURL=userInterface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"userInterface.d.ts","sourceRoot":"","sources":["../../src/interfaces/userInterface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,WAAW,KAAK;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB"}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,25 @@
1
+ declare const _default: {
2
+ DB_CONNECT_SUCESS: string;
3
+ DB_CONNECT_FAILED: string;
4
+ };
5
+ export default _default;
6
+ export declare enum EUncaughtExceptionMessages {
7
+ uncaughtException = "uncaughtException",
8
+ uncaughtExceptionMessage = "\uD83D\uDCA5 Uncaught Exception"
9
+ }
10
+ export declare enum EUnhandledRejectionMessages {
11
+ unhandledRejection = "unhandledRejection",
12
+ unhandledRejectionMessage = "\uD83D\uDCA5 Uncaught Rejection"
13
+ }
14
+ export declare enum EServerStartMessages {
15
+ serverRunning = "\uD83D\uDE80 Server is running at http://localhost:",
16
+ serverStarted = "\u2139\uFE0F Server started"
17
+ }
18
+ export declare enum EGracefulShutdownMessages {
19
+ shutdownSignal = "shutdownSignal",
20
+ shutdownInitiated = "\uD83D\uDED1 Graceful shutdown initiated",
21
+ connectionsClosed = "\u2705 All connections closed gracefully",
22
+ shutdownTimeout = "\u26A0\uFE0F Shutdown timeout - forcing exit",
23
+ serverClosed = "\uD83D\uDD0C Server closed"
24
+ }
25
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/messages/index.ts"],"names":[],"mappings":";;;;AAEA,wBAGE;AAEF,oBAAY,0BAA0B;IACpC,iBAAiB,sBAAsB;IACvC,wBAAwB,oCAA0B;CACnD;AAED,oBAAY,2BAA2B;IACrC,kBAAkB,uBAAuB;IACzC,yBAAyB,oCAA0B;CACpD;AAED,oBAAY,oBAAoB;IAC9B,aAAa,wDAA8C;IAC3D,aAAa,iCAAuB;CACrC;AAED,oBAAY,yBAAyB;IACnC,cAAc,mBAAmB;IACjC,iBAAiB,6CAAmC;IACpD,iBAAiB,6CAAwC;IACzD,eAAe,kDAAwC;IACvD,YAAY,+BAAqB;CAClC"}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EGracefulShutdownMessages = exports.EServerStartMessages = exports.EUnhandledRejectionMessages = exports.EUncaughtExceptionMessages = void 0;
4
+ exports.default = {
5
+ DB_CONNECT_SUCESS: "💾 database connected successfully ✅",
6
+ DB_CONNECT_FAILED: "❌ database failed connect",
7
+ };
8
+ var EUncaughtExceptionMessages;
9
+ (function (EUncaughtExceptionMessages) {
10
+ EUncaughtExceptionMessages["uncaughtException"] = "uncaughtException";
11
+ EUncaughtExceptionMessages["uncaughtExceptionMessage"] = "\uD83D\uDCA5 Uncaught Exception";
12
+ })(EUncaughtExceptionMessages || (exports.EUncaughtExceptionMessages = EUncaughtExceptionMessages = {}));
13
+ var EUnhandledRejectionMessages;
14
+ (function (EUnhandledRejectionMessages) {
15
+ EUnhandledRejectionMessages["unhandledRejection"] = "unhandledRejection";
16
+ EUnhandledRejectionMessages["unhandledRejectionMessage"] = "\uD83D\uDCA5 Uncaught Rejection";
17
+ })(EUnhandledRejectionMessages || (exports.EUnhandledRejectionMessages = EUnhandledRejectionMessages = {}));
18
+ var EServerStartMessages;
19
+ (function (EServerStartMessages) {
20
+ EServerStartMessages["serverRunning"] = "\uD83D\uDE80 Server is running at http://localhost:";
21
+ EServerStartMessages["serverStarted"] = "\u2139\uFE0F Server started";
22
+ })(EServerStartMessages || (exports.EServerStartMessages = EServerStartMessages = {}));
23
+ var EGracefulShutdownMessages;
24
+ (function (EGracefulShutdownMessages) {
25
+ EGracefulShutdownMessages["shutdownSignal"] = "shutdownSignal";
26
+ EGracefulShutdownMessages["shutdownInitiated"] = "\uD83D\uDED1 Graceful shutdown initiated";
27
+ EGracefulShutdownMessages["connectionsClosed"] = "\u2705 All connections closed gracefully";
28
+ EGracefulShutdownMessages["shutdownTimeout"] = "\u26A0\uFE0F Shutdown timeout - forcing exit";
29
+ EGracefulShutdownMessages["serverClosed"] = "\uD83D\uDD0C Server closed";
30
+ })(EGracefulShutdownMessages || (exports.EGracefulShutdownMessages = EGracefulShutdownMessages = {}));
@@ -0,0 +1,9 @@
1
+ import { Request, Response, NextFunction } from "express";
2
+ export interface AuthenticatedRequest extends Request {
3
+ user?: {
4
+ id: string;
5
+ role: string;
6
+ };
7
+ }
8
+ export declare const authenticate: (req: AuthenticatedRequest, res: Response, next: NextFunction) => void;
9
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAM1D,MAAM,WAAW,oBAAqB,SAAQ,OAAO;IACnD,IAAI,CAAC,EAAE;QACL,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED,eAAO,MAAM,YAAY,GACvB,KAAK,oBAAoB,EACzB,KAAK,QAAQ,EACb,MAAM,YAAY,KACjB,IAoCF,CAAC"}
@@ -0,0 +1,30 @@
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.authenticate = void 0;
7
+ const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
8
+ const http_status_codes_1 = require("http-status-codes");
9
+ const responseUtil_1 = require("../utils/responseUtil");
10
+ const envConfig_1 = require("../config/envConfig");
11
+ const authenticate = (req, res, next) => {
12
+ const token = req.headers.authorization?.split(" ")[1]; // Expecting "Bearer <token>"
13
+ if (!token) {
14
+ return (0, responseUtil_1.sendErrorResponse)(http_status_codes_1.StatusCodes.UNAUTHORIZED, req, res, {}, "No token provided");
15
+ }
16
+ try {
17
+ const decoded = jsonwebtoken_1.default.verify(token, envConfig_1.env.JWT_SECRET);
18
+ req.user = decoded;
19
+ // Optional: override role from header if needed
20
+ const roleFromHeader = req.headers["x-user-role"];
21
+ if (roleFromHeader && typeof roleFromHeader === "string") {
22
+ req.user.role = roleFromHeader;
23
+ }
24
+ next();
25
+ }
26
+ catch (err) {
27
+ return (0, responseUtil_1.sendErrorResponse)(http_status_codes_1.StatusCodes.UNAUTHORIZED, req, res, {}, "Invalid or expired token");
28
+ }
29
+ };
30
+ exports.authenticate = authenticate;
@@ -0,0 +1,4 @@
1
+ import { Request, Response, NextFunction } from "express";
2
+ export declare const globalErrorHandler: (err: Error, req: Request, res: Response) => void;
3
+ export declare const notFoundHandler: (req: Request, res: Response, next: NextFunction) => void;
4
+ //# sourceMappingURL=errorMiddleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errorMiddleware.d.ts","sourceRoot":"","sources":["../../src/middleware/errorMiddleware.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAK1D,eAAO,MAAM,kBAAkB,GAAI,KAAK,KAAK,EAAE,KAAK,OAAO,EAAE,KAAK,QAAQ,SAQzE,CAAC;AAEF,eAAO,MAAM,eAAe,GAC1B,KAAK,OAAO,EACZ,KAAK,QAAQ,EACb,MAAM,YAAY,SAUnB,CAAC"}
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.notFoundHandler = exports.globalErrorHandler = void 0;
4
+ const http_status_codes_1 = require("http-status-codes");
5
+ const responseUtil_1 = require("../utils/responseUtil");
6
+ // Global error handler
7
+ const globalErrorHandler = (err, req, res) => {
8
+ (0, responseUtil_1.sendErrorResponse)(http_status_codes_1.StatusCodes.INTERNAL_SERVER_ERROR, req, res, err, err.message);
9
+ };
10
+ exports.globalErrorHandler = globalErrorHandler;
11
+ const notFoundHandler = (req, res, next) => {
12
+ (0, responseUtil_1.sendErrorResponse)(http_status_codes_1.StatusCodes.NOT_FOUND, req, res, null, `Route ${req.originalUrl} not found`);
13
+ next();
14
+ };
15
+ exports.notFoundHandler = notFoundHandler;
@@ -0,0 +1,4 @@
1
+ import { Request, Response, NextFunction } from "express";
2
+ declare const logMiddleware: (req: Request, res: Response, next: NextFunction) => void;
3
+ export default logMiddleware;
4
+ //# sourceMappingURL=logMiddleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logMiddleware.d.ts","sourceRoot":"","sources":["../../src/middleware/logMiddleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAY1D,QAAA,MAAM,aAAa,GAAI,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,SAgBrE,CAAC;AAEF,eAAe,aAAa,CAAC"}
@@ -0,0 +1,29 @@
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
+ const fs_1 = __importDefault(require("fs"));
7
+ const path_1 = __importDefault(require("path"));
8
+ const logDirectory = path_1.default.join(__dirname, "../../logs");
9
+ const logFile = path_1.default.join(logDirectory, "app.log");
10
+ // Ensure logs directory exists
11
+ if (!fs_1.default.existsSync(logDirectory)) {
12
+ fs_1.default.mkdirSync(logDirectory, { recursive: true });
13
+ }
14
+ const logMiddleware = (req, res, next) => {
15
+ const start = process.hrtime();
16
+ res.on("finish", () => {
17
+ const diff = process.hrtime(start);
18
+ const responseTime = (diff[0] * 1e3 + diff[1] / 1e6).toFixed(2); // ms
19
+ const log = `[${new Date().toISOString()}] ${req.method} ${req.originalUrl} ${res.statusCode} ${responseTime}ms\n`;
20
+ fs_1.default.appendFile(logFile, log, (err) => {
21
+ if (err) {
22
+ // Optionally handle error (e.g., log to console)
23
+ console.error("Failed to write log:", err);
24
+ }
25
+ });
26
+ });
27
+ next();
28
+ };
29
+ exports.default = logMiddleware;
@@ -0,0 +1,3 @@
1
+ import { Request, Response, NextFunction } from "express";
2
+ export declare const requestIdMiddleware: (req: Request, res: Response, next: NextFunction) => void;
3
+ //# sourceMappingURL=requestIdMiddleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requestIdMiddleware.d.ts","sourceRoot":"","sources":["../../src/middleware/requestIdMiddleware.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE1D,eAAO,MAAM,mBAAmB,GAC9B,KAAK,OAAO,EACZ,KAAK,QAAQ,EACb,MAAM,YAAY,SAMnB,CAAC"}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.requestIdMiddleware = void 0;
4
+ const uuid_1 = require("uuid");
5
+ const requestIdMiddleware = (req, res, next) => {
6
+ const requestId = req.headers["x-request-id"] || (0, uuid_1.v4)();
7
+ req.headers["x-request-id"] = requestId;
8
+ res.setHeader("x-request-id", requestId);
9
+ next();
10
+ };
11
+ exports.requestIdMiddleware = requestIdMiddleware;
@@ -0,0 +1,3 @@
1
+ import multer from 'multer';
2
+ export declare const upload: multer.Multer;
3
+ //# sourceMappingURL=uploadMiddleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uploadMiddleware.d.ts","sourceRoot":"","sources":["../../src/middleware/uploadMiddleware.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAoC5B,eAAO,MAAM,MAAM,eAAkC,CAAC"}
@@ -0,0 +1,36 @@
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.upload = void 0;
7
+ const multer_1 = __importDefault(require("multer"));
8
+ // Storage configuration
9
+ const storage = multer_1.default.diskStorage({
10
+ destination: function (_req, _file, cb) {
11
+ cb(null, 'public/uploads/');
12
+ },
13
+ filename: function (_req, file, cb) {
14
+ const filename = `${Date.now()}-${file.originalname}`;
15
+ cb(null, filename);
16
+ },
17
+ });
18
+ // File filter for Excel, PDF, and image files
19
+ const fileFilter = (_req, file, cb) => {
20
+ const allowedMimeTypes = [
21
+ 'application/pdf',
22
+ 'image/jpeg',
23
+ 'image/png',
24
+ 'image/jpg',
25
+ 'image/webp',
26
+ 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', // .xlsx
27
+ 'application/vnd.ms-excel', // .xls
28
+ ];
29
+ if (allowedMimeTypes.includes(file.mimetype)) {
30
+ cb(null, true);
31
+ }
32
+ else {
33
+ cb(new Error('Only PDF, image files (JPEG, PNG, WEBP), and Excel files (.xlsx, .xls) are allowed'));
34
+ }
35
+ };
36
+ exports.upload = (0, multer_1.default)({ storage, fileFilter });
@@ -0,0 +1,3 @@
1
+ import { NextFunction, Request, Response } from "express";
2
+ export declare const validatorFn: (req: Request, res: Response, next: NextFunction) => any;
3
+ //# sourceMappingURL=validatorMiddleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validatorMiddleware.d.ts","sourceRoot":"","sources":["../../src/middleware/validatorMiddleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAI1D,eAAO,MAAM,WAAW,GACtB,KAAK,OAAO,EACZ,KAAK,QAAQ,EACb,MAAM,YAAY,KACjB,GAYF,CAAC"}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validatorFn = void 0;
4
+ const express_validator_1 = require("express-validator");
5
+ const responseUtil_1 = require("../utils/responseUtil");
6
+ const validatorFn = (req, res, next) => {
7
+ const errors = (0, express_validator_1.validationResult)(req);
8
+ if (!errors.isEmpty()) {
9
+ return (0, responseUtil_1.sendErrorResponse)(400, req, res, "validation failed", JSON.stringify(errors.array()));
10
+ }
11
+ next();
12
+ };
13
+ exports.validatorFn = validatorFn;
@@ -0,0 +1,9 @@
1
+ import mongoose from "mongoose";
2
+ import { IUser } from "../interfaces/userInterface";
3
+ declare const _default: mongoose.Model<IUser, {}, {}, {}, mongoose.Document<unknown, {}, IUser, {}> & IUser & Required<{
4
+ _id: string;
5
+ }> & {
6
+ __v: number;
7
+ }, any>;
8
+ export default _default;
9
+ //# sourceMappingURL=UserModel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UserModel.d.ts","sourceRoot":"","sources":["../../src/models/UserModel.ts"],"names":[],"mappings":"AAAA,OAAO,QAAoB,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;;;;;;AA4BpD,wBAAyD"}
@@ -0,0 +1,59 @@
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const mongoose_1 = __importStar(require("mongoose"));
37
+ const userSchema = new mongoose_1.Schema({
38
+ name: { type: String, trim: true, required: true },
39
+ email: {
40
+ type: String,
41
+ trim: true,
42
+ required: true,
43
+ lowercase: true,
44
+ unique: true,
45
+ },
46
+ passwordHash: { type: String, required: true },
47
+ phone: { type: String, required: true },
48
+ role: {
49
+ type: String,
50
+ enum: ["admin", "user"],
51
+ required: true,
52
+ },
53
+ status: {
54
+ type: String,
55
+ enum: ["active", "inactive"],
56
+ default: "active",
57
+ },
58
+ }, { timestamps: true });
59
+ exports.default = mongoose_1.default.model("user", userSchema);
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=userController.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"userController.test.d.ts","sourceRoot":"","sources":["../../../../src/modules/users/tests/userController.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ import { Request, Response } from "express";
2
+ export declare const registerUser: (req: Request, res: Response) => Promise<void>;
3
+ export declare const loginUser: (req: Request, res: Response) => Promise<void>;
4
+ export declare const getAllUsers: (req: Request, res: Response) => Promise<void>;
5
+ //# sourceMappingURL=userController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"userController.d.ts","sourceRoot":"","sources":["../../../src/modules/users/userController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAW5C,eAAO,MAAM,YAAY,GAAU,KAAK,OAAO,EAAE,KAAK,QAAQ,kBAsB7D,CAAC;AAEF,eAAO,MAAM,SAAS,GAAU,KAAK,OAAO,EAAE,KAAK,QAAQ,kBAmB1D,CAAC;AAEF,eAAO,MAAM,WAAW,GAAU,KAAK,OAAO,EAAE,KAAK,QAAQ,kBAqB5D,CAAC"}
@@ -0,0 +1,90 @@
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.getAllUsers = exports.loginUser = exports.registerUser = void 0;
40
+ const userService = __importStar(require("./userService"));
41
+ const responseUtil_1 = require("../../utils/responseUtil");
42
+ const http_status_codes_1 = require("http-status-codes");
43
+ const userMessage_1 = __importDefault(require("./userMessage"));
44
+ const registerUser = async (req, res) => {
45
+ try {
46
+ const body = req.body;
47
+ const createUserBody = {
48
+ name: body.name,
49
+ email: body.email,
50
+ password: body.password,
51
+ role: body.role,
52
+ phone: body.phone,
53
+ };
54
+ const user = await userService.registerUser(createUserBody);
55
+ (0, responseUtil_1.sendSuccessResponse)(http_status_codes_1.StatusCodes.CREATED, req, res, user, userMessage_1.default.CREATE_USER_SUCCESS);
56
+ }
57
+ catch (error) {
58
+ const errorMessage = error instanceof Error ? error.message : String(error);
59
+ (0, responseUtil_1.sendErrorResponse)(http_status_codes_1.StatusCodes.BAD_REQUEST, req, res, {}, errorMessage);
60
+ }
61
+ };
62
+ exports.registerUser = registerUser;
63
+ const loginUser = async (req, res) => {
64
+ const { email, password } = req.body;
65
+ try {
66
+ const createLoginBody = {
67
+ email,
68
+ password,
69
+ };
70
+ const response = await userService.loginUser(createLoginBody);
71
+ (0, responseUtil_1.sendSuccessResponse)(http_status_codes_1.StatusCodes.CREATED, req, res, response, userMessage_1.default.LOGIN_SUCCESS);
72
+ }
73
+ catch (error) {
74
+ const errorMessage = error instanceof Error ? error.message : String(error);
75
+ (0, responseUtil_1.sendErrorResponse)(http_status_codes_1.StatusCodes.UNAUTHORIZED, req, res, {}, errorMessage);
76
+ }
77
+ };
78
+ exports.loginUser = loginUser;
79
+ const getAllUsers = async (req, res) => {
80
+ try {
81
+ const queryParams = req.query;
82
+ const users = await userService.getAllUsers(queryParams);
83
+ (0, responseUtil_1.sendSuccessResponse)(http_status_codes_1.StatusCodes.OK, req, res, users, userMessage_1.default.GET_ALL_USER_SUCCESS);
84
+ }
85
+ catch (error) {
86
+ const errorMessage = error instanceof Error ? error.message : String(error);
87
+ (0, responseUtil_1.sendErrorResponse)(http_status_codes_1.StatusCodes.INTERNAL_SERVER_ERROR, req, res, {}, errorMessage);
88
+ }
89
+ };
90
+ exports.getAllUsers = getAllUsers;
@@ -0,0 +1,11 @@
1
+ declare const _default: {
2
+ CREATE_USER_SUCCESS: string;
3
+ CREATE_USER_FAILED: string;
4
+ GET_ALL_USER_SUCCESS: string;
5
+ GET_ALL_USER_FAILED: string;
6
+ GET_ALL_USER_COUNT_SUCCESS: string;
7
+ GET_ALL_USER_COUNT_FAILED: string;
8
+ LOGIN_SUCCESS: string;
9
+ };
10
+ export default _default;
11
+ //# sourceMappingURL=userMessage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"userMessage.d.ts","sourceRoot":"","sources":["../../../src/modules/users/userMessage.ts"],"names":[],"mappings":";;;;;;;;;AAAA,wBAQE"}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = {
4
+ CREATE_USER_SUCCESS: 'user created successfully',
5
+ CREATE_USER_FAILED: 'Failed to create user',
6
+ GET_ALL_USER_SUCCESS: 'All users fetched successfully',
7
+ GET_ALL_USER_FAILED: 'Failed to fetch all users',
8
+ GET_ALL_USER_COUNT_SUCCESS: 'All users count fetched successfully',
9
+ GET_ALL_USER_COUNT_FAILED: 'Failed to fetch all users count',
10
+ LOGIN_SUCCESS: 'loggedin successfully',
11
+ };
@@ -0,0 +1,16 @@
1
+ import { TCreateUserBody, TRoles, TUserLoginBody } from "../../types/userTypes";
2
+ import { TGetAllQueryParams } from "../../types";
3
+ export declare const registerUser: (createBody: TCreateUserBody) => Promise<{
4
+ name: string;
5
+ email: string;
6
+ role: TRoles;
7
+ }>;
8
+ export declare const loginUser: (bodyParams: TUserLoginBody) => Promise<{
9
+ token: string;
10
+ email: string;
11
+ role: TRoles;
12
+ name: string;
13
+ userId: string;
14
+ }>;
15
+ export declare const getAllUsers: (queryParams: TGetAllQueryParams) => Promise<any>;
16
+ //# sourceMappingURL=userService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"userService.d.ts","sourceRoot":"","sources":["../../../src/modules/users/userService.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGhF,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD,eAAO,MAAM,YAAY,GAAU,YAAY,eAAe;;;;EAc7D,CAAC;AAEF,eAAO,MAAM,SAAS,GACpB,YAAY,cAAc,KACzB,OAAO,CAAC;IACT,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB,CAeA,CAAC;AAEF,eAAO,MAAM,WAAW,GACtB,aAAa,kBAAkB,KAC9B,OAAO,CAAC,GAAG,CAiCb,CAAC"}
@@ -0,0 +1,67 @@
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.getAllUsers = exports.loginUser = exports.registerUser = void 0;
7
+ const bcryptjs_1 = __importDefault(require("bcryptjs"));
8
+ const UserModel_1 = __importDefault(require("../../models/UserModel"));
9
+ const authFunction_1 = require("../../utils/authFunction");
10
+ const registerUser = async (createBody) => {
11
+ const { name, email, password, phone, role } = createBody;
12
+ const existing = await UserModel_1.default.findOne({ email });
13
+ if (existing)
14
+ throw new Error("User already exists");
15
+ const passwordHash = await bcryptjs_1.default.hash(password, 10);
16
+ const user = await UserModel_1.default.create({
17
+ name,
18
+ email,
19
+ passwordHash,
20
+ role,
21
+ phone,
22
+ });
23
+ return { name: user.name, email: user.email, role: user.role };
24
+ };
25
+ exports.registerUser = registerUser;
26
+ const loginUser = async (bodyParams) => {
27
+ const { email, password } = bodyParams;
28
+ const user = await UserModel_1.default.findOne({ email });
29
+ if (!user)
30
+ throw new Error("Invalid credentials");
31
+ const isMatch = await bcryptjs_1.default.compare(password, user.passwordHash);
32
+ if (!isMatch)
33
+ throw new Error("Invalid credentials");
34
+ const generatedToken = await (0, authFunction_1.generateJWT)(user);
35
+ const response = {
36
+ token: generatedToken,
37
+ email: user.email,
38
+ role: user.role,
39
+ name: user.name,
40
+ userId: user._id,
41
+ };
42
+ return response;
43
+ };
44
+ exports.loginUser = loginUser;
45
+ const getAllUsers = async (queryParams) => {
46
+ const { search = "", sortBy = "createdAt", sortOrder = "asc", limit = "10", offset = "0", } = queryParams;
47
+ const parseLimit = limit ? parseInt(limit) : 10;
48
+ const parseOffset = offset ? parseInt(offset) : 0;
49
+ const matchStage = {};
50
+ if (search) {
51
+ matchStage.$or = [
52
+ { name: { $regex: search, $options: "i" } },
53
+ { email: { $regex: search, $options: "i" } },
54
+ { phone: { $regex: search, $options: "i" } },
55
+ ];
56
+ }
57
+ const sortStage = {};
58
+ sortStage[sortBy] = sortOrder === "asc" ? 1 : -1;
59
+ const users = await UserModel_1.default.aggregate([
60
+ { $match: matchStage },
61
+ { $sort: sortStage },
62
+ { $skip: parseOffset },
63
+ { $limit: parseLimit },
64
+ ]);
65
+ return users;
66
+ };
67
+ exports.getAllUsers = getAllUsers;
@@ -0,0 +1,3 @@
1
+ declare const router: import("express-serve-static-core").Router;
2
+ export default router;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/routes/index.ts"],"names":[],"mappings":"AAGA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAKxB,eAAe,MAAM,CAAC"}
@@ -0,0 +1,11 @@
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
+ const express_1 = require("express");
7
+ const usersRoute_1 = __importDefault(require("./usersRoute"));
8
+ const router = (0, express_1.Router)();
9
+ // Versioned routing prefix is added in app.ts using env.BASIC_API_URL
10
+ router.use("/users", usersRoute_1.default);
11
+ exports.default = router;
@@ -0,0 +1,3 @@
1
+ declare const router: import("express-serve-static-core").Router;
2
+ export default router;
3
+ //# sourceMappingURL=usersRoute.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usersRoute.d.ts","sourceRoot":"","sources":["../../src/routes/usersRoute.ts"],"names":[],"mappings":"AAKA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAOxB,eAAe,MAAM,CAAC"}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const express_1 = require("express");
4
+ const userController_1 = require("../modules/users/userController");
5
+ const index_1 = require("../validators/index");
6
+ const router = (0, express_1.Router)();
7
+ router.post("/register", index_1.registerValidator, userController_1.registerUser);
8
+ router.post("/login", index_1.loginValidator, userController_1.loginUser);
9
+ // upload with multer
10
+ // router.post("/upload", upload.single("file"), registerUser);
11
+ exports.default = router;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":""}