bootifyjs 0.0.3 → 0.1.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.
- package/LICENSE +21 -0
- package/README.md +321 -465
- package/dist/api.d.ts +32 -0
- package/dist/api.js +149 -0
- package/dist/api.js.map +1 -0
- package/dist/config/app.config.d.ts +29 -0
- package/dist/config/app.config.js +55 -0
- package/dist/config/app.config.js.map +1 -0
- package/dist/controllers/config.controller.d.ts +16 -0
- package/dist/controllers/config.controller.js +66 -0
- package/dist/controllers/config.controller.js.map +1 -0
- package/dist/controllers/events.controller.d.ts +66 -0
- package/dist/controllers/events.controller.js +145 -0
- package/dist/controllers/events.controller.js.map +1 -0
- package/dist/controllers/health.controller.d.ts +20 -0
- package/dist/controllers/health.controller.js +92 -0
- package/dist/controllers/health.controller.js.map +1 -0
- package/dist/controllers/user.controller.d.ts +13 -0
- package/dist/controllers/user.controller.js +209 -0
- package/dist/controllers/user.controller.js.map +1 -0
- package/dist/core/application.d.ts +21 -0
- package/dist/core/application.js +90 -0
- package/dist/core/application.js.map +1 -0
- package/dist/core/config.d.ts +3 -0
- package/dist/core/config.js +78 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/container.d.ts +17 -0
- package/dist/core/container.js +92 -0
- package/dist/core/container.js.map +1 -0
- package/dist/core/decorators.d.ts +28 -0
- package/dist/core/decorators.js +204 -0
- package/dist/core/decorators.js.map +1 -0
- package/dist/core/errors.d.ts +18 -0
- package/dist/core/errors.js +74 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/middleware.d.ts +8 -0
- package/dist/core/middleware.js +23 -0
- package/dist/core/middleware.js.map +1 -0
- package/dist/core/openapi.d.ts +80 -0
- package/dist/core/openapi.js +189 -0
- package/dist/core/openapi.js.map +1 -0
- package/dist/core/router.d.ts +32 -0
- package/dist/core/router.js +266 -0
- package/dist/core/router.js.map +1 -0
- package/dist/core/utils.d.ts +7 -0
- package/dist/core/utils.js +75 -0
- package/dist/core/utils.js.map +1 -0
- package/dist/core/validation.d.ts +15 -0
- package/dist/core/validation.js +161 -0
- package/dist/core/validation.js.map +1 -0
- package/dist/events/core/event-bus.d.ts +26 -0
- package/dist/events/core/event-bus.js +253 -0
- package/dist/events/core/event-bus.js.map +1 -0
- package/dist/events/core/event-registry.d.ts +31 -0
- package/dist/events/core/event-registry.js +170 -0
- package/dist/events/core/event-registry.js.map +1 -0
- package/dist/events/decorators/event.decorators.d.ts +11 -0
- package/dist/events/decorators/event.decorators.js +123 -0
- package/dist/events/decorators/event.decorators.js.map +1 -0
- package/dist/events/examples/system.events.d.ts +15 -0
- package/dist/events/examples/system.events.js +28 -0
- package/dist/events/examples/system.events.js.map +1 -0
- package/dist/events/examples/user.events.d.ts +68 -0
- package/dist/events/examples/user.events.js +73 -0
- package/dist/events/examples/user.events.js.map +1 -0
- package/dist/events/examples/user.handlers.d.ts +20 -0
- package/dist/events/examples/user.handlers.js +157 -0
- package/dist/events/examples/user.handlers.js.map +1 -0
- package/dist/events/index.d.ts +13 -0
- package/dist/events/index.js +71 -0
- package/dist/events/index.js.map +1 -0
- package/dist/events/middleware/logging.middleware.d.ts +7 -0
- package/dist/events/middleware/logging.middleware.js +44 -0
- package/dist/events/middleware/logging.middleware.js.map +1 -0
- package/dist/events/middleware/metrics.middleware.d.ts +11 -0
- package/dist/events/middleware/metrics.middleware.js +87 -0
- package/dist/events/middleware/metrics.middleware.js.map +1 -0
- package/dist/events/middleware/validation.middleware.d.ts +8 -0
- package/dist/events/middleware/validation.middleware.js +63 -0
- package/dist/events/middleware/validation.middleware.js.map +1 -0
- package/dist/events/store/memory-event-store.d.ts +21 -0
- package/dist/events/store/memory-event-store.js +81 -0
- package/dist/events/store/memory-event-store.js.map +1 -0
- package/dist/events/types/event.types.d.ts +57 -0
- package/dist/{decorators/cache/ICacheClient.js → events/types/event.types.js} +1 -1
- package/dist/events/types/event.types.js.map +1 -0
- package/dist/examples/basic-api.d.ts +1 -0
- package/dist/examples/basic-api.js +120 -0
- package/dist/examples/basic-api.js.map +1 -0
- package/dist/index.d.ts +17 -11
- package/dist/index.js +95 -31
- package/dist/index.js.map +1 -1
- package/dist/logging/config/logging.config.d.ts +5 -0
- package/dist/logging/config/logging.config.js +101 -0
- package/dist/logging/config/logging.config.js.map +1 -0
- package/dist/logging/core/log-context.service.d.ts +11 -0
- package/dist/logging/core/log-context.service.js +40 -0
- package/dist/logging/core/log-context.service.js.map +1 -0
- package/dist/logging/core/logger.service.d.ts +29 -0
- package/dist/logging/core/logger.service.js +178 -0
- package/dist/logging/core/logger.service.js.map +1 -0
- package/dist/logging/core/startup-logger.service.d.ts +17 -0
- package/dist/logging/core/startup-logger.service.js +156 -0
- package/dist/logging/core/startup-logger.service.js.map +1 -0
- package/dist/logging/decorators/log.decorator.d.ts +11 -0
- package/dist/logging/decorators/log.decorator.js +80 -0
- package/dist/logging/decorators/log.decorator.js.map +1 -0
- package/dist/logging/index.d.ts +15 -0
- package/dist/logging/index.js +46 -0
- package/dist/logging/index.js.map +1 -0
- package/dist/logging/middleware/context.middleware.d.ts +2 -0
- package/dist/logging/middleware/context.middleware.js +29 -0
- package/dist/logging/middleware/context.middleware.js.map +1 -0
- package/dist/logging/middleware/request-logging.middleware.d.ts +3 -0
- package/dist/logging/middleware/request-logging.middleware.js +78 -0
- package/dist/logging/middleware/request-logging.middleware.js.map +1 -0
- package/dist/logging/types/logging.types.d.ts +79 -0
- package/dist/{decorators/transaction/IDatabaseClient.js → logging/types/logging.types.js} +1 -1
- package/dist/logging/types/logging.types.js.map +1 -0
- package/dist/middlewares/auth.middleware.d.ts +2 -0
- package/dist/middlewares/auth.middleware.js +20 -0
- package/dist/middlewares/auth.middleware.js.map +1 -0
- package/dist/middlewares/cors.middleware.d.ts +2 -0
- package/dist/middlewares/cors.middleware.js +16 -0
- package/dist/middlewares/cors.middleware.js.map +1 -0
- package/dist/middlewares/swagger.middleware.d.ts +6 -0
- package/dist/middlewares/swagger.middleware.js +84 -0
- package/dist/middlewares/swagger.middleware.js.map +1 -0
- package/dist/repositories/user.repository.d.ts +16 -0
- package/dist/repositories/user.repository.js +110 -0
- package/dist/repositories/user.repository.js.map +1 -0
- package/dist/schemas/user.schemas.d.ts +214 -0
- package/dist/schemas/user.schemas.js +71 -0
- package/dist/schemas/user.schemas.js.map +1 -0
- package/dist/services/config-demo.service.d.ts +10 -0
- package/dist/services/config-demo.service.js +88 -0
- package/dist/services/config-demo.service.js.map +1 -0
- package/dist/services/user.service.d.ts +21 -0
- package/dist/services/user.service.js +201 -0
- package/dist/services/user.service.js.map +1 -0
- package/package.json +49 -14
- package/dist/application/Application.d.ts +0 -43
- package/dist/application/Application.d.ts.map +0 -1
- package/dist/application/Application.js +0 -283
- package/dist/application/Application.js.map +0 -1
- package/dist/container/container.d.ts +0 -9
- package/dist/container/container.d.ts.map +0 -1
- package/dist/container/container.js +0 -23
- package/dist/container/container.js.map +0 -1
- package/dist/decorators/cache/ICacheClient.d.ts +0 -6
- package/dist/decorators/cache/ICacheClient.d.ts.map +0 -1
- package/dist/decorators/cache/ICacheClient.js.map +0 -1
- package/dist/decorators/cache/cache.decorator.d.ts +0 -2
- package/dist/decorators/cache/cache.decorator.d.ts.map +0 -1
- package/dist/decorators/cache/cache.decorator.js +0 -38
- package/dist/decorators/cache/cache.decorator.js.map +0 -1
- package/dist/decorators/controller.decorator.d.ts +0 -9
- package/dist/decorators/controller.decorator.d.ts.map +0 -1
- package/dist/decorators/controller.decorator.js +0 -99
- package/dist/decorators/controller.decorator.js.map +0 -1
- package/dist/decorators/http.decorator.d.ts +0 -7
- package/dist/decorators/http.decorator.d.ts.map +0 -1
- package/dist/decorators/http.decorator.js +0 -26
- package/dist/decorators/http.decorator.js.map +0 -1
- package/dist/decorators/timing.decorator.d.ts +0 -2
- package/dist/decorators/timing.decorator.d.ts.map +0 -1
- package/dist/decorators/timing.decorator.js +0 -26
- package/dist/decorators/timing.decorator.js.map +0 -1
- package/dist/decorators/transaction/IDatabaseClient.d.ts +0 -9
- package/dist/decorators/transaction/IDatabaseClient.d.ts.map +0 -1
- package/dist/decorators/transaction/IDatabaseClient.js.map +0 -1
- package/dist/decorators/transaction/transactional.decorator.d.ts +0 -2
- package/dist/decorators/transaction/transactional.decorator.d.ts.map +0 -1
- package/dist/decorators/transaction/transactional.decorator.js +0 -27
- package/dist/decorators/transaction/transactional.decorator.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/logger/Logger.d.ts +0 -37
- package/dist/logger/Logger.d.ts.map +0 -1
- package/dist/logger/Logger.js +0 -142
- package/dist/logger/Logger.js.map +0 -1
- package/dist/middleware/http.d.ts +0 -2
- package/dist/middleware/http.d.ts.map +0 -1
- package/dist/middleware/http.js +0 -80
- package/dist/middleware/http.js.map +0 -1
- package/dist/middleware/requestcontext.d.ts +0 -12
- package/dist/middleware/requestcontext.d.ts.map +0 -1
- package/dist/middleware/requestcontext.js +0 -6
- 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,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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"}
|