bootifyjs 0.0.3 → 0.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 (188) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +116 -510
  3. package/dist/api.d.ts +32 -0
  4. package/dist/api.js +149 -0
  5. package/dist/api.js.map +1 -0
  6. package/dist/config/app.config.d.ts +29 -0
  7. package/dist/config/app.config.js +55 -0
  8. package/dist/config/app.config.js.map +1 -0
  9. package/dist/controllers/config.controller.d.ts +16 -0
  10. package/dist/controllers/config.controller.js +66 -0
  11. package/dist/controllers/config.controller.js.map +1 -0
  12. package/dist/controllers/events.controller.d.ts +66 -0
  13. package/dist/controllers/events.controller.js +145 -0
  14. package/dist/controllers/events.controller.js.map +1 -0
  15. package/dist/controllers/health.controller.d.ts +20 -0
  16. package/dist/controllers/health.controller.js +92 -0
  17. package/dist/controllers/health.controller.js.map +1 -0
  18. package/dist/controllers/user.controller.d.ts +13 -0
  19. package/dist/controllers/user.controller.js +209 -0
  20. package/dist/controllers/user.controller.js.map +1 -0
  21. package/dist/core/application.d.ts +21 -0
  22. package/dist/core/application.js +90 -0
  23. package/dist/core/application.js.map +1 -0
  24. package/dist/core/config.d.ts +3 -0
  25. package/dist/core/config.js +78 -0
  26. package/dist/core/config.js.map +1 -0
  27. package/dist/core/container.d.ts +17 -0
  28. package/dist/core/container.js +92 -0
  29. package/dist/core/container.js.map +1 -0
  30. package/dist/core/decorators.d.ts +28 -0
  31. package/dist/core/decorators.js +204 -0
  32. package/dist/core/decorators.js.map +1 -0
  33. package/dist/core/errors.d.ts +18 -0
  34. package/dist/core/errors.js +74 -0
  35. package/dist/core/errors.js.map +1 -0
  36. package/dist/core/middleware.d.ts +8 -0
  37. package/dist/core/middleware.js +23 -0
  38. package/dist/core/middleware.js.map +1 -0
  39. package/dist/core/openapi.d.ts +80 -0
  40. package/dist/core/openapi.js +189 -0
  41. package/dist/core/openapi.js.map +1 -0
  42. package/dist/core/router.d.ts +32 -0
  43. package/dist/core/router.js +266 -0
  44. package/dist/core/router.js.map +1 -0
  45. package/dist/core/utils.d.ts +7 -0
  46. package/dist/core/utils.js +75 -0
  47. package/dist/core/utils.js.map +1 -0
  48. package/dist/core/validation.d.ts +15 -0
  49. package/dist/core/validation.js +161 -0
  50. package/dist/core/validation.js.map +1 -0
  51. package/dist/events/core/event-bus.d.ts +26 -0
  52. package/dist/events/core/event-bus.js +253 -0
  53. package/dist/events/core/event-bus.js.map +1 -0
  54. package/dist/events/core/event-registry.d.ts +31 -0
  55. package/dist/events/core/event-registry.js +170 -0
  56. package/dist/events/core/event-registry.js.map +1 -0
  57. package/dist/events/decorators/event.decorators.d.ts +11 -0
  58. package/dist/events/decorators/event.decorators.js +123 -0
  59. package/dist/events/decorators/event.decorators.js.map +1 -0
  60. package/dist/events/examples/system.events.d.ts +15 -0
  61. package/dist/events/examples/system.events.js +28 -0
  62. package/dist/events/examples/system.events.js.map +1 -0
  63. package/dist/events/examples/user.events.d.ts +68 -0
  64. package/dist/events/examples/user.events.js +73 -0
  65. package/dist/events/examples/user.events.js.map +1 -0
  66. package/dist/events/examples/user.handlers.d.ts +20 -0
  67. package/dist/events/examples/user.handlers.js +157 -0
  68. package/dist/events/examples/user.handlers.js.map +1 -0
  69. package/dist/events/index.d.ts +13 -0
  70. package/dist/events/index.js +71 -0
  71. package/dist/events/index.js.map +1 -0
  72. package/dist/events/middleware/logging.middleware.d.ts +7 -0
  73. package/dist/events/middleware/logging.middleware.js +44 -0
  74. package/dist/events/middleware/logging.middleware.js.map +1 -0
  75. package/dist/events/middleware/metrics.middleware.d.ts +11 -0
  76. package/dist/events/middleware/metrics.middleware.js +87 -0
  77. package/dist/events/middleware/metrics.middleware.js.map +1 -0
  78. package/dist/events/middleware/validation.middleware.d.ts +8 -0
  79. package/dist/events/middleware/validation.middleware.js +63 -0
  80. package/dist/events/middleware/validation.middleware.js.map +1 -0
  81. package/dist/events/store/memory-event-store.d.ts +21 -0
  82. package/dist/events/store/memory-event-store.js +81 -0
  83. package/dist/events/store/memory-event-store.js.map +1 -0
  84. package/dist/events/types/event.types.d.ts +57 -0
  85. package/dist/{decorators/cache/ICacheClient.js → events/types/event.types.js} +1 -1
  86. package/dist/events/types/event.types.js.map +1 -0
  87. package/dist/examples/basic-api.d.ts +1 -0
  88. package/dist/examples/basic-api.js +120 -0
  89. package/dist/examples/basic-api.js.map +1 -0
  90. package/dist/index.d.ts +17 -11
  91. package/dist/index.js +95 -31
  92. package/dist/index.js.map +1 -1
  93. package/dist/logging/config/logging.config.d.ts +5 -0
  94. package/dist/logging/config/logging.config.js +101 -0
  95. package/dist/logging/config/logging.config.js.map +1 -0
  96. package/dist/logging/core/log-context.service.d.ts +11 -0
  97. package/dist/logging/core/log-context.service.js +40 -0
  98. package/dist/logging/core/log-context.service.js.map +1 -0
  99. package/dist/logging/core/logger.service.d.ts +29 -0
  100. package/dist/logging/core/logger.service.js +178 -0
  101. package/dist/logging/core/logger.service.js.map +1 -0
  102. package/dist/logging/core/startup-logger.service.d.ts +17 -0
  103. package/dist/logging/core/startup-logger.service.js +156 -0
  104. package/dist/logging/core/startup-logger.service.js.map +1 -0
  105. package/dist/logging/decorators/log.decorator.d.ts +11 -0
  106. package/dist/logging/decorators/log.decorator.js +80 -0
  107. package/dist/logging/decorators/log.decorator.js.map +1 -0
  108. package/dist/logging/index.d.ts +15 -0
  109. package/dist/logging/index.js +46 -0
  110. package/dist/logging/index.js.map +1 -0
  111. package/dist/logging/middleware/context.middleware.d.ts +2 -0
  112. package/dist/logging/middleware/context.middleware.js +29 -0
  113. package/dist/logging/middleware/context.middleware.js.map +1 -0
  114. package/dist/logging/middleware/request-logging.middleware.d.ts +3 -0
  115. package/dist/logging/middleware/request-logging.middleware.js +78 -0
  116. package/dist/logging/middleware/request-logging.middleware.js.map +1 -0
  117. package/dist/logging/types/logging.types.d.ts +79 -0
  118. package/dist/{decorators/transaction/IDatabaseClient.js → logging/types/logging.types.js} +1 -1
  119. package/dist/logging/types/logging.types.js.map +1 -0
  120. package/dist/middlewares/auth.middleware.d.ts +2 -0
  121. package/dist/middlewares/auth.middleware.js +20 -0
  122. package/dist/middlewares/auth.middleware.js.map +1 -0
  123. package/dist/middlewares/cors.middleware.d.ts +2 -0
  124. package/dist/middlewares/cors.middleware.js +16 -0
  125. package/dist/middlewares/cors.middleware.js.map +1 -0
  126. package/dist/middlewares/swagger.middleware.d.ts +6 -0
  127. package/dist/middlewares/swagger.middleware.js +84 -0
  128. package/dist/middlewares/swagger.middleware.js.map +1 -0
  129. package/dist/repositories/user.repository.d.ts +16 -0
  130. package/dist/repositories/user.repository.js +110 -0
  131. package/dist/repositories/user.repository.js.map +1 -0
  132. package/dist/schemas/user.schemas.d.ts +214 -0
  133. package/dist/schemas/user.schemas.js +71 -0
  134. package/dist/schemas/user.schemas.js.map +1 -0
  135. package/dist/services/config-demo.service.d.ts +10 -0
  136. package/dist/services/config-demo.service.js +88 -0
  137. package/dist/services/config-demo.service.js.map +1 -0
  138. package/dist/services/user.service.d.ts +21 -0
  139. package/dist/services/user.service.js +201 -0
  140. package/dist/services/user.service.js.map +1 -0
  141. package/package.json +49 -14
  142. package/dist/application/Application.d.ts +0 -43
  143. package/dist/application/Application.d.ts.map +0 -1
  144. package/dist/application/Application.js +0 -283
  145. package/dist/application/Application.js.map +0 -1
  146. package/dist/container/container.d.ts +0 -9
  147. package/dist/container/container.d.ts.map +0 -1
  148. package/dist/container/container.js +0 -23
  149. package/dist/container/container.js.map +0 -1
  150. package/dist/decorators/cache/ICacheClient.d.ts +0 -6
  151. package/dist/decorators/cache/ICacheClient.d.ts.map +0 -1
  152. package/dist/decorators/cache/ICacheClient.js.map +0 -1
  153. package/dist/decorators/cache/cache.decorator.d.ts +0 -2
  154. package/dist/decorators/cache/cache.decorator.d.ts.map +0 -1
  155. package/dist/decorators/cache/cache.decorator.js +0 -38
  156. package/dist/decorators/cache/cache.decorator.js.map +0 -1
  157. package/dist/decorators/controller.decorator.d.ts +0 -9
  158. package/dist/decorators/controller.decorator.d.ts.map +0 -1
  159. package/dist/decorators/controller.decorator.js +0 -99
  160. package/dist/decorators/controller.decorator.js.map +0 -1
  161. package/dist/decorators/http.decorator.d.ts +0 -7
  162. package/dist/decorators/http.decorator.d.ts.map +0 -1
  163. package/dist/decorators/http.decorator.js +0 -26
  164. package/dist/decorators/http.decorator.js.map +0 -1
  165. package/dist/decorators/timing.decorator.d.ts +0 -2
  166. package/dist/decorators/timing.decorator.d.ts.map +0 -1
  167. package/dist/decorators/timing.decorator.js +0 -26
  168. package/dist/decorators/timing.decorator.js.map +0 -1
  169. package/dist/decorators/transaction/IDatabaseClient.d.ts +0 -9
  170. package/dist/decorators/transaction/IDatabaseClient.d.ts.map +0 -1
  171. package/dist/decorators/transaction/IDatabaseClient.js.map +0 -1
  172. package/dist/decorators/transaction/transactional.decorator.d.ts +0 -2
  173. package/dist/decorators/transaction/transactional.decorator.d.ts.map +0 -1
  174. package/dist/decorators/transaction/transactional.decorator.js +0 -27
  175. package/dist/decorators/transaction/transactional.decorator.js.map +0 -1
  176. package/dist/index.d.ts.map +0 -1
  177. package/dist/logger/Logger.d.ts +0 -37
  178. package/dist/logger/Logger.d.ts.map +0 -1
  179. package/dist/logger/Logger.js +0 -142
  180. package/dist/logger/Logger.js.map +0 -1
  181. package/dist/middleware/http.d.ts +0 -2
  182. package/dist/middleware/http.d.ts.map +0 -1
  183. package/dist/middleware/http.js +0 -80
  184. package/dist/middleware/http.js.map +0 -1
  185. package/dist/middleware/requestcontext.d.ts +0 -12
  186. package/dist/middleware/requestcontext.d.ts.map +0 -1
  187. package/dist/middleware/requestcontext.js +0 -6
  188. package/dist/middleware/requestcontext.js.map +0 -1
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.HealthController = void 0;
13
+ const decorators_1 = require("../core/decorators");
14
+ const user_schemas_1 = require("../schemas/user.schemas");
15
+ const router_1 = require("../core/router");
16
+ const container_1 = require("../core/container");
17
+ let HealthController = class HealthController {
18
+ getRoutes() {
19
+ // Get router instance from container (if available) or create summary
20
+ try {
21
+ const router = container_1.container.resolve(router_1.Router);
22
+ return router.getRoutesSummary();
23
+ }
24
+ catch {
25
+ return {
26
+ message: 'Router information not available',
27
+ timestamp: new Date().toISOString()
28
+ };
29
+ }
30
+ }
31
+ health() {
32
+ return {
33
+ status: 'OK',
34
+ timestamp: new Date().toISOString(),
35
+ uptime: process.uptime(),
36
+ memory: process.memoryUsage(),
37
+ version: process.version
38
+ };
39
+ }
40
+ ping() {
41
+ return { message: 'pong' };
42
+ }
43
+ };
44
+ exports.HealthController = HealthController;
45
+ __decorate([
46
+ (0, decorators_1.Get)('/routes'),
47
+ (0, decorators_1.ApiOperation)({
48
+ summary: 'Get registered routes',
49
+ description: 'Get a list of all registered routes in the application',
50
+ operationId: 'getRoutes'
51
+ }),
52
+ __metadata("design:type", Function),
53
+ __metadata("design:paramtypes", []),
54
+ __metadata("design:returntype", void 0)
55
+ ], HealthController.prototype, "getRoutes", null);
56
+ __decorate([
57
+ (0, decorators_1.Get)('/'),
58
+ (0, decorators_1.ApiOperation)({
59
+ summary: 'Health check',
60
+ description: 'Get system health status and metrics',
61
+ operationId: 'getHealth'
62
+ }),
63
+ (0, decorators_1.ValidateResponse)(user_schemas_1.healthResponseSchema),
64
+ (0, decorators_1.ApiResponse)(200, {
65
+ description: 'System health information',
66
+ schema: user_schemas_1.healthResponseSchema
67
+ }),
68
+ __metadata("design:type", Function),
69
+ __metadata("design:paramtypes", []),
70
+ __metadata("design:returntype", void 0)
71
+ ], HealthController.prototype, "health", null);
72
+ __decorate([
73
+ (0, decorators_1.Get)('/ping'),
74
+ (0, decorators_1.ApiOperation)({
75
+ summary: 'Ping endpoint',
76
+ description: 'Simple ping endpoint for connectivity testing',
77
+ operationId: 'ping'
78
+ }),
79
+ (0, decorators_1.ValidateResponse)(user_schemas_1.pingResponseSchema),
80
+ (0, decorators_1.ApiResponse)(200, {
81
+ description: 'Pong response',
82
+ schema: user_schemas_1.pingResponseSchema
83
+ }),
84
+ __metadata("design:type", Function),
85
+ __metadata("design:paramtypes", []),
86
+ __metadata("design:returntype", void 0)
87
+ ], HealthController.prototype, "ping", null);
88
+ exports.HealthController = HealthController = __decorate([
89
+ (0, decorators_1.Controller)('/health'),
90
+ (0, decorators_1.ApiTags)('Health', 'System Health')
91
+ ], HealthController);
92
+ //# sourceMappingURL=health.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.controller.js","sourceRoot":"","sources":["../../src/controllers/health.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mDAA2G;AAC3G,0DAAmF;AACnF,2CAAwC;AACxC,iDAA8C;AAIvC,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IAO3B,SAAS;QACP,sEAAsE;QACtE,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,qBAAS,CAAC,OAAO,CAAC,eAAM,CAAC,CAAC;YACzC,OAAO,MAAM,CAAC,gBAAgB,EAAE,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;gBACL,OAAO,EAAE,kCAAkC;gBAC3C,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC;QACJ,CAAC;IACH,CAAC;IAaD,MAAM;QACJ,OAAO;YACL,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE;YACxB,MAAM,EAAE,OAAO,CAAC,WAAW,EAAE;YAC7B,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC;IACJ,CAAC;IAaD,IAAI;QACF,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAC7B,CAAC;CACF,CAAA;AAvDY,4CAAgB;AAO3B;IANC,IAAA,gBAAG,EAAC,SAAS,CAAC;IACd,IAAA,yBAAY,EAAC;QACZ,OAAO,EAAE,uBAAuB;QAChC,WAAW,EAAE,wDAAwD;QACrE,WAAW,EAAE,WAAW;KACzB,CAAC;;;;iDAYD;AAaD;IAXC,IAAA,gBAAG,EAAC,GAAG,CAAC;IACR,IAAA,yBAAY,EAAC;QACZ,OAAO,EAAE,cAAc;QACvB,WAAW,EAAE,sCAAsC;QACnD,WAAW,EAAE,WAAW;KACzB,CAAC;IACD,IAAA,6BAAgB,EAAC,mCAAoB,CAAC;IACtC,IAAA,wBAAW,EAAC,GAAG,EAAE;QAChB,WAAW,EAAE,2BAA2B;QACxC,MAAM,EAAE,mCAAoB;KAC7B,CAAC;;;;8CASD;AAaD;IAXC,IAAA,gBAAG,EAAC,OAAO,CAAC;IACZ,IAAA,yBAAY,EAAC;QACZ,OAAO,EAAE,eAAe;QACxB,WAAW,EAAE,+CAA+C;QAC5D,WAAW,EAAE,MAAM;KACpB,CAAC;IACD,IAAA,6BAAgB,EAAC,iCAAkB,CAAC;IACpC,IAAA,wBAAW,EAAC,GAAG,EAAE;QAChB,WAAW,EAAE,eAAe;QAC5B,MAAM,EAAE,iCAAkB;KAC3B,CAAC;;;;4CAGD;2BAtDU,gBAAgB;IAF5B,IAAA,uBAAU,EAAC,SAAS,CAAC;IACrB,IAAA,oBAAO,EAAC,QAAQ,EAAE,eAAe,CAAC;GACtB,gBAAgB,CAuD5B"}
@@ -0,0 +1,13 @@
1
+ import { UserService, CreateUserDto, UpdateUserDto } from '../services/user.service';
2
+ export declare class UserController {
3
+ private userService;
4
+ constructor(userService: UserService);
5
+ getAllUsers(limit?: string): import("../repositories/user.repository").User[];
6
+ getUserById(id: string): import("../repositories/user.repository").User;
7
+ getUserByEmail(email: string): import("../repositories/user.repository").User;
8
+ createUser(userData: CreateUserDto): Promise<import("../repositories/user.repository").User>;
9
+ updateUser(id: string, userData: UpdateUserDto): Promise<import("../repositories/user.repository").User>;
10
+ deleteUser(id: string): Promise<{
11
+ message: string;
12
+ }>;
13
+ }
@@ -0,0 +1,209 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.UserController = void 0;
16
+ const decorators_1 = require("../core/decorators");
17
+ const user_service_1 = require("../services/user.service");
18
+ const auth_middleware_1 = require("../middlewares/auth.middleware");
19
+ const user_schemas_1 = require("../schemas/user.schemas");
20
+ let UserController = class UserController {
21
+ constructor(userService) {
22
+ this.userService = userService;
23
+ }
24
+ getAllUsers(limit) {
25
+ const users = this.userService.getAllUsers();
26
+ if (limit) {
27
+ const limitNum = parseInt(limit, 10);
28
+ return users.slice(0, limitNum);
29
+ }
30
+ return users;
31
+ }
32
+ getUserById(id) {
33
+ return this.userService.getUserById(id);
34
+ }
35
+ getUserByEmail(email) {
36
+ return this.userService.getUserByEmail(email);
37
+ }
38
+ async createUser(userData) {
39
+ return await this.userService.createUser(userData);
40
+ }
41
+ async updateUser(id, userData) {
42
+ return await this.userService.updateUser(id, userData);
43
+ }
44
+ async deleteUser(id) {
45
+ await this.userService.deleteUser(id);
46
+ return { message: 'User deleted successfully' };
47
+ }
48
+ };
49
+ exports.UserController = UserController;
50
+ __decorate([
51
+ (0, decorators_1.Get)('/'),
52
+ (0, decorators_1.ApiOperation)({
53
+ summary: 'Get all users',
54
+ description: 'Retrieve a list of all users with optional pagination',
55
+ operationId: 'getAllUsers'
56
+ }),
57
+ (0, decorators_1.ValidateQuery)(user_schemas_1.paginationSchema),
58
+ (0, decorators_1.ValidateResponse)(user_schemas_1.usersListResponseSchema),
59
+ (0, decorators_1.ApiResponse)(200, {
60
+ description: 'List of users retrieved successfully',
61
+ schema: user_schemas_1.usersListResponseSchema
62
+ }),
63
+ __param(0, (0, decorators_1.Query)('limit')),
64
+ __metadata("design:type", Function),
65
+ __metadata("design:paramtypes", [String]),
66
+ __metadata("design:returntype", void 0)
67
+ ], UserController.prototype, "getAllUsers", null);
68
+ __decorate([
69
+ (0, decorators_1.Get)('/:id'),
70
+ (0, decorators_1.ApiOperation)({
71
+ summary: 'Get user by ID',
72
+ description: 'Retrieve a specific user by their unique identifier',
73
+ operationId: 'getUserById'
74
+ }),
75
+ (0, decorators_1.ValidateParams)(user_schemas_1.userParamsSchema),
76
+ (0, decorators_1.ValidateResponse)(user_schemas_1.userResponseSchema),
77
+ (0, decorators_1.ApiResponse)(200, {
78
+ description: 'User found successfully',
79
+ schema: user_schemas_1.userResponseSchema
80
+ }),
81
+ (0, decorators_1.ApiResponse)(404, {
82
+ description: 'User not found',
83
+ schema: user_schemas_1.errorResponseSchema
84
+ }),
85
+ __param(0, (0, decorators_1.Param)('id')),
86
+ __metadata("design:type", Function),
87
+ __metadata("design:paramtypes", [String]),
88
+ __metadata("design:returntype", void 0)
89
+ ], UserController.prototype, "getUserById", null);
90
+ __decorate([
91
+ (0, decorators_1.Get)('/email/:email'),
92
+ (0, decorators_1.ApiOperation)({
93
+ summary: 'Get user by email',
94
+ description: 'Retrieve a specific user by their email address',
95
+ operationId: 'getUserByEmail'
96
+ }),
97
+ (0, decorators_1.ValidateParams)(user_schemas_1.emailParamsSchema),
98
+ (0, decorators_1.ValidateResponse)(user_schemas_1.userResponseSchema),
99
+ (0, decorators_1.ApiResponse)(200, {
100
+ description: 'User found successfully',
101
+ schema: user_schemas_1.userResponseSchema
102
+ }),
103
+ (0, decorators_1.ApiResponse)(404, {
104
+ description: 'User not found',
105
+ schema: user_schemas_1.errorResponseSchema
106
+ }),
107
+ __param(0, (0, decorators_1.Param)('email')),
108
+ __metadata("design:type", Function),
109
+ __metadata("design:paramtypes", [String]),
110
+ __metadata("design:returntype", void 0)
111
+ ], UserController.prototype, "getUserByEmail", null);
112
+ __decorate([
113
+ (0, decorators_1.Post)('/'),
114
+ (0, decorators_1.ApiOperation)({
115
+ summary: 'Create new user',
116
+ description: 'Create a new user account with email and name validation',
117
+ operationId: 'createUser'
118
+ }),
119
+ (0, decorators_1.ValidateBody)(user_schemas_1.createUserSchema),
120
+ (0, decorators_1.ValidateResponse)(user_schemas_1.createUserResponseSchema),
121
+ (0, decorators_1.ApiResponse)(201, {
122
+ description: 'User created successfully',
123
+ schema: user_schemas_1.createUserResponseSchema
124
+ }),
125
+ (0, decorators_1.ApiResponse)(409, {
126
+ description: 'Email already exists',
127
+ schema: user_schemas_1.errorResponseSchema
128
+ }),
129
+ __param(0, (0, decorators_1.Body)()),
130
+ __metadata("design:type", Function),
131
+ __metadata("design:paramtypes", [Object]),
132
+ __metadata("design:returntype", Promise)
133
+ ], UserController.prototype, "createUser", null);
134
+ __decorate([
135
+ (0, decorators_1.Put)('/:id'),
136
+ (0, decorators_1.UseMiddleware)(auth_middleware_1.authMiddleware),
137
+ (0, decorators_1.ApiOperation)({
138
+ summary: 'Update user',
139
+ description: 'Update an existing user\'s information',
140
+ operationId: 'updateUser'
141
+ }),
142
+ (0, decorators_1.ApiSecurity)([{ bearerAuth: [] }]),
143
+ (0, decorators_1.ValidateParams)(user_schemas_1.userParamsSchema),
144
+ (0, decorators_1.ValidateBody)(user_schemas_1.updateUserSchema),
145
+ (0, decorators_1.ValidateResponse)(user_schemas_1.updateUserResponseSchema),
146
+ (0, decorators_1.ApiResponse)(200, {
147
+ description: 'User updated successfully',
148
+ schema: user_schemas_1.updateUserResponseSchema
149
+ }),
150
+ (0, decorators_1.ApiResponse)(401, {
151
+ description: 'Unauthorized - Invalid or missing token',
152
+ schema: user_schemas_1.errorResponseSchema
153
+ }),
154
+ (0, decorators_1.ApiResponse)(404, {
155
+ description: 'User not found',
156
+ schema: user_schemas_1.errorResponseSchema
157
+ }),
158
+ (0, decorators_1.ApiResponse)(409, {
159
+ description: 'Email already exists',
160
+ schema: user_schemas_1.errorResponseSchema
161
+ }),
162
+ __param(0, (0, decorators_1.Param)('id')),
163
+ __param(1, (0, decorators_1.Body)()),
164
+ __metadata("design:type", Function),
165
+ __metadata("design:paramtypes", [String, Object]),
166
+ __metadata("design:returntype", Promise)
167
+ ], UserController.prototype, "updateUser", null);
168
+ __decorate([
169
+ (0, decorators_1.Delete)('/:id'),
170
+ (0, decorators_1.UseMiddleware)(auth_middleware_1.authMiddleware),
171
+ (0, decorators_1.ApiOperation)({
172
+ summary: 'Delete user',
173
+ description: 'Delete a user account permanently',
174
+ operationId: 'deleteUser'
175
+ }),
176
+ (0, decorators_1.ApiSecurity)([{ bearerAuth: [] }]),
177
+ (0, decorators_1.ValidateParams)(user_schemas_1.userParamsSchema),
178
+ (0, decorators_1.ValidateResponse)(user_schemas_1.deleteUserResponseSchema),
179
+ (0, decorators_1.ApiResponse)(200, {
180
+ description: 'User deleted successfully',
181
+ schema: user_schemas_1.deleteUserResponseSchema
182
+ }),
183
+ (0, decorators_1.ApiResponse)(401, {
184
+ description: 'Unauthorized - Invalid or missing token',
185
+ schema: user_schemas_1.errorResponseSchema
186
+ }),
187
+ (0, decorators_1.ApiResponse)(404, {
188
+ description: 'User not found',
189
+ schema: user_schemas_1.errorResponseSchema
190
+ }),
191
+ __param(0, (0, decorators_1.Param)('id')),
192
+ __metadata("design:type", Function),
193
+ __metadata("design:paramtypes", [String]),
194
+ __metadata("design:returntype", Promise)
195
+ ], UserController.prototype, "deleteUser", null);
196
+ exports.UserController = UserController = __decorate([
197
+ (0, decorators_1.Controller)('/users'),
198
+ (0, decorators_1.ApiTags)('Users', 'User Management'),
199
+ (0, decorators_1.ApiResponse)(400, {
200
+ description: 'Validation error',
201
+ schema: user_schemas_1.validationErrorResponseSchema
202
+ }),
203
+ (0, decorators_1.ApiResponse)(500, {
204
+ description: 'Internal server error',
205
+ schema: user_schemas_1.errorResponseSchema
206
+ }),
207
+ __metadata("design:paramtypes", [user_service_1.UserService])
208
+ ], UserController);
209
+ //# sourceMappingURL=user.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.controller.js","sourceRoot":"","sources":["../../src/controllers/user.controller.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { Server } from 'http';
2
+ import { Middleware } from './middleware';
3
+ export interface ApplicationConfig {
4
+ controllers: any[];
5
+ middlewares?: Middleware[];
6
+ port?: number;
7
+ hostname?: string;
8
+ }
9
+ export declare class Application {
10
+ private server;
11
+ private router;
12
+ private globalMiddleware;
13
+ private config;
14
+ private logger?;
15
+ private startupLogger?;
16
+ constructor(config: ApplicationConfig);
17
+ private handleRequest;
18
+ start(): Promise<void>;
19
+ stop(): Promise<void>;
20
+ getServer(): Server;
21
+ }
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Application = void 0;
4
+ const http_1 = require("http");
5
+ const router_1 = require("./router");
6
+ const middleware_1 = require("./middleware");
7
+ const errors_1 = require("./errors");
8
+ const logging_1 = require("../logging");
9
+ class Application {
10
+ constructor(config) {
11
+ this.config = {
12
+ port: 3000,
13
+ hostname: 'localhost',
14
+ ...config
15
+ };
16
+ // Initialize logging if available
17
+ try {
18
+ this.logger = logging_1.LoggerService.getInstance();
19
+ this.startupLogger = logging_1.StartupLoggerService.getInstance(this.logger);
20
+ this.startupLogger.logComponentStart('Application', {
21
+ port: this.config.port,
22
+ hostname: this.config.hostname,
23
+ controllers: config.controllers.length,
24
+ middlewares: config.middlewares?.length || 0
25
+ });
26
+ }
27
+ catch (error) {
28
+ // Logging not configured yet, continue without it
29
+ }
30
+ this.router = new router_1.Router();
31
+ this.globalMiddleware = new middleware_1.MiddlewareStack();
32
+ // Register global middlewares
33
+ if (config.middlewares) {
34
+ config.middlewares.forEach(middleware => {
35
+ this.globalMiddleware.use(middleware);
36
+ });
37
+ }
38
+ // Register controllers
39
+ this.router.registerControllers(config.controllers);
40
+ if (this.startupLogger) {
41
+ this.startupLogger.logComponentComplete('Router', {
42
+ routesRegistered: this.router.getRouteCount()
43
+ });
44
+ }
45
+ // Create server
46
+ this.server = (0, http_1.createServer)(this.handleRequest.bind(this));
47
+ if (this.startupLogger) {
48
+ this.startupLogger.logComponentComplete('HTTP Server');
49
+ }
50
+ }
51
+ async handleRequest(req, res) {
52
+ try {
53
+ // Execute global middlewares
54
+ await this.globalMiddleware.execute(req, res);
55
+ // Handle route
56
+ await this.router.handleRequest(req, res);
57
+ }
58
+ catch (error) {
59
+ (0, errors_1.errorHandler)(error, res);
60
+ }
61
+ }
62
+ start() {
63
+ return new Promise((resolve) => {
64
+ this.server.listen(this.config.port, this.config.hostname, () => {
65
+ if (this.logger && this.startupLogger) {
66
+ this.startupLogger.logComponentComplete('Application');
67
+ this.startupLogger.logStartupComplete();
68
+ }
69
+ console.log(`🚀 Server running at http://${this.config.hostname}:${this.config.port}`);
70
+ resolve();
71
+ });
72
+ });
73
+ }
74
+ stop() {
75
+ return new Promise((resolve) => {
76
+ this.server.close(() => {
77
+ if (this.logger) {
78
+ this.logger.info('Server stopped gracefully');
79
+ }
80
+ console.log('🛑 Server stopped');
81
+ resolve();
82
+ });
83
+ });
84
+ }
85
+ getServer() {
86
+ return this.server;
87
+ }
88
+ }
89
+ exports.Application = Application;
90
+ //# sourceMappingURL=application.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"application.js","sourceRoot":"","sources":["../../src/core/application.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import 'reflect-metadata';
2
+ export declare function Config(prefix?: string): ClassDecorator;
3
+ export declare function getConfigInstance<T>(configClass: new () => T): T;
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Config = Config;
4
+ exports.getConfigInstance = getConfigInstance;
5
+ require("reflect-metadata");
6
+ // Class decorator to enable automatic configuration
7
+ function Config(prefix = 'BOOTIFY') {
8
+ return function (target) {
9
+ // Store the prefix for later use
10
+ Reflect.defineMetadata('config:prefix', prefix, target);
11
+ // Create a singleton instance
12
+ const instance = new target();
13
+ // Load configuration values automatically
14
+ loadConfigurationFromEnv(instance, prefix);
15
+ // Store the singleton instance
16
+ Reflect.defineMetadata('config:instance', instance, target);
17
+ return target;
18
+ };
19
+ }
20
+ function loadConfigurationFromEnv(instance, prefix) {
21
+ // Get all environment variables with the prefix
22
+ const envVars = Object.keys(process.env)
23
+ .filter(key => key.startsWith(`${prefix}_`))
24
+ .reduce((acc, key) => {
25
+ acc[key] = process.env[key];
26
+ return acc;
27
+ }, {});
28
+ // Process each environment variable
29
+ Object.entries(envVars).forEach(([envKey, envValue]) => {
30
+ if (envValue === undefined)
31
+ return;
32
+ // Convert environment key to property path
33
+ // BOOTIFY_SERVER_PORT -> server.port
34
+ // BOOTIFY_SERVICE_NAME -> SERVICE_NAME
35
+ const propertyPath = envKey
36
+ .replace(`${prefix}_`, '')
37
+ .toLowerCase()
38
+ .split('_')
39
+ .join('.');
40
+ // Convert value based on content
41
+ let value = envValue;
42
+ // Try to convert to number
43
+ const numValue = Number(envValue);
44
+ if (!isNaN(numValue) && envValue.trim() !== '') {
45
+ value = numValue;
46
+ }
47
+ // Try to convert to boolean
48
+ else if (envValue.toLowerCase() === 'true' || envValue.toLowerCase() === 'false') {
49
+ value = envValue.toLowerCase() === 'true';
50
+ }
51
+ // Set nested property
52
+ setNestedProperty(instance, propertyPath, value);
53
+ });
54
+ }
55
+ function setNestedProperty(obj, path, value) {
56
+ const keys = path.split('.');
57
+ let current = obj;
58
+ // Navigate/create nested structure
59
+ for (let i = 0; i < keys.length - 1; i++) {
60
+ const key = keys[i];
61
+ if (!(key in current) || typeof current[key] !== 'object' || current[key] === null) {
62
+ current[key] = {};
63
+ }
64
+ current = current[key];
65
+ }
66
+ // Set the final value
67
+ const finalKey = keys[keys.length - 1];
68
+ current[finalKey] = value;
69
+ }
70
+ // Helper function to get configuration instance
71
+ function getConfigInstance(configClass) {
72
+ const instance = Reflect.getMetadata('config:instance', configClass);
73
+ if (!instance) {
74
+ throw new Error(`Configuration class ${configClass.name} is not decorated with @Config`);
75
+ }
76
+ return instance;
77
+ }
78
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import 'reflect-metadata';
2
+ export type Constructor<T = any> = new (...args: any[]) => T;
3
+ export declare enum Scope {
4
+ SINGLETON = "singleton",
5
+ TRANSIENT = "transient"
6
+ }
7
+ export declare class Container {
8
+ private services;
9
+ private resolving;
10
+ private logger?;
11
+ constructor();
12
+ register<T>(token: Constructor<T>, scope?: Scope): void;
13
+ resolve<T>(token: Constructor<T>): T;
14
+ isRegistered<T>(token: Constructor<T>): boolean;
15
+ clear(): void;
16
+ }
17
+ export declare const container: Container;
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.container = exports.Container = exports.Scope = void 0;
4
+ require("reflect-metadata");
5
+ const logging_1 = require("../logging");
6
+ const config_1 = require("./config");
7
+ var Scope;
8
+ (function (Scope) {
9
+ Scope["SINGLETON"] = "singleton";
10
+ Scope["TRANSIENT"] = "transient";
11
+ })(Scope || (exports.Scope = Scope = {}));
12
+ class Container {
13
+ constructor() {
14
+ this.services = new Map();
15
+ this.resolving = new Set();
16
+ try {
17
+ this.logger = logging_1.LoggerService.getInstance();
18
+ }
19
+ catch (error) {
20
+ // Logger not initialized yet
21
+ }
22
+ }
23
+ register(token, scope = Scope.SINGLETON) {
24
+ this.services.set(token, { token, scope });
25
+ if (this.logger) {
26
+ this.logger.trace(`Service registered: ${token.name}`, { scope });
27
+ }
28
+ }
29
+ resolve(token) {
30
+ const serviceDefinition = this.services.get(token);
31
+ if (!serviceDefinition) {
32
+ if (this.logger) {
33
+ this.logger.error(`Service not registered: ${token.name}`);
34
+ }
35
+ throw new Error(`Service ${token.name} is not registered`);
36
+ }
37
+ // Check for circular dependencies
38
+ if (this.resolving.has(token)) {
39
+ if (this.logger) {
40
+ this.logger.error(`Circular dependency detected: ${token.name}`);
41
+ }
42
+ throw new Error(`Circular dependency detected for ${token.name}`);
43
+ }
44
+ // Return existing singleton instance
45
+ if (serviceDefinition.scope === Scope.SINGLETON && serviceDefinition.instance) {
46
+ if (this.logger) {
47
+ this.logger.trace(`Returning existing singleton: ${token.name}`);
48
+ }
49
+ return serviceDefinition.instance;
50
+ }
51
+ this.resolving.add(token);
52
+ try {
53
+ const dependencies = Reflect.getMetadata('design:paramtypes', token) || [];
54
+ const configDependencies = Reflect.getMetadata('inject:configs', token) || [];
55
+ if (this.logger && dependencies.length > 0) {
56
+ this.logger.trace(`Resolving dependencies for ${token.name}`, {
57
+ dependencies: dependencies.map((dep) => dep.name)
58
+ });
59
+ }
60
+ const args = dependencies.map((dep, index) => {
61
+ // Check if this parameter should be injected with configuration
62
+ const configClass = configDependencies[index];
63
+ if (configClass) {
64
+ return (0, config_1.getConfigInstance)(configClass);
65
+ }
66
+ return this.resolve(dep);
67
+ });
68
+ const instance = new token(...args);
69
+ // Store singleton instance
70
+ if (serviceDefinition.scope === Scope.SINGLETON) {
71
+ serviceDefinition.instance = instance;
72
+ }
73
+ if (this.logger) {
74
+ this.logger.trace(`Service resolved successfully: ${token.name}`);
75
+ }
76
+ return instance;
77
+ }
78
+ finally {
79
+ this.resolving.delete(token);
80
+ }
81
+ }
82
+ isRegistered(token) {
83
+ return this.services.has(token);
84
+ }
85
+ clear() {
86
+ this.services.clear();
87
+ this.resolving.clear();
88
+ }
89
+ }
90
+ exports.Container = Container;
91
+ exports.container = new Container();
92
+ //# sourceMappingURL=container.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container.js","sourceRoot":"","sources":["../../src/core/container.ts"],"names":[],"mappings":"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"}