bootifyjs 1.1.9 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (185) hide show
  1. package/dist/api.d.ts +4 -0
  2. package/dist/api.d.ts.map +1 -1
  3. package/dist/api.js +24 -9
  4. package/dist/api.js.map +1 -1
  5. package/dist/auth/AuthManager.d.ts +68 -0
  6. package/dist/auth/AuthManager.d.ts.map +1 -0
  7. package/dist/auth/AuthManager.js +239 -0
  8. package/dist/auth/AuthManager.js.map +1 -0
  9. package/dist/auth/examples/basic-usage.d.ts +29 -0
  10. package/dist/auth/examples/basic-usage.d.ts.map +1 -0
  11. package/dist/auth/examples/basic-usage.js +390 -0
  12. package/dist/auth/examples/basic-usage.js.map +1 -0
  13. package/dist/auth/index.d.ts +72 -0
  14. package/dist/auth/index.d.ts.map +1 -0
  15. package/dist/auth/index.js +118 -0
  16. package/dist/auth/index.js.map +1 -0
  17. package/dist/auth/middleware/AuthMiddleware.d.ts +110 -0
  18. package/dist/auth/middleware/AuthMiddleware.d.ts.map +1 -0
  19. package/dist/auth/middleware/AuthMiddleware.js +336 -0
  20. package/dist/auth/middleware/AuthMiddleware.js.map +1 -0
  21. package/dist/auth/storage/RedisTokenStorage.d.ts +92 -0
  22. package/dist/auth/storage/RedisTokenStorage.d.ts.map +1 -0
  23. package/dist/auth/storage/RedisTokenStorage.js +207 -0
  24. package/dist/auth/storage/RedisTokenStorage.js.map +1 -0
  25. package/dist/auth/strategies/ApiKeyStrategy.d.ts +64 -0
  26. package/dist/auth/strategies/ApiKeyStrategy.d.ts.map +1 -0
  27. package/dist/auth/strategies/ApiKeyStrategy.js +391 -0
  28. package/dist/auth/strategies/ApiKeyStrategy.js.map +1 -0
  29. package/dist/auth/strategies/JwtStrategy.d.ts +46 -0
  30. package/dist/auth/strategies/JwtStrategy.d.ts.map +1 -0
  31. package/dist/auth/strategies/JwtStrategy.js +310 -0
  32. package/dist/auth/strategies/JwtStrategy.js.map +1 -0
  33. package/dist/auth/types.d.ts +130 -0
  34. package/dist/auth/types.d.ts.map +1 -0
  35. package/dist/auth/types.js +50 -0
  36. package/dist/auth/types.js.map +1 -0
  37. package/dist/config/AppConfig.d.ts +3 -3
  38. package/dist/config/AppConfig.d.ts.map +1 -1
  39. package/dist/config/AppConfig.js +9 -2
  40. package/dist/config/AppConfig.js.map +1 -1
  41. package/dist/constants/index.d.ts +61 -0
  42. package/dist/constants/index.d.ts.map +1 -0
  43. package/dist/constants/index.js +75 -0
  44. package/dist/constants/index.js.map +1 -0
  45. package/dist/core/decorators.d.ts +7 -7
  46. package/dist/core/decorators.d.ts.map +1 -1
  47. package/dist/core/decorators.js +8 -7
  48. package/dist/core/decorators.js.map +1 -1
  49. package/dist/core/di-container.d.ts +1 -1
  50. package/dist/core/di-container.d.ts.map +1 -1
  51. package/dist/core/di-container.js +3 -3
  52. package/dist/core/di-container.js.map +1 -1
  53. package/dist/events/event-bus.service.d.ts.map +1 -1
  54. package/dist/events/event-bus.service.js +2 -0
  55. package/dist/events/event-bus.service.js.map +1 -1
  56. package/dist/examples/auth/auth.middleware.d.ts +27 -0
  57. package/dist/examples/auth/auth.middleware.d.ts.map +1 -0
  58. package/dist/examples/auth/auth.middleware.js +187 -0
  59. package/dist/examples/auth/auth.middleware.js.map +1 -0
  60. package/dist/examples/auth/authorization.middleware.d.ts +1 -0
  61. package/dist/examples/auth/authorization.middleware.d.ts.map +1 -0
  62. package/dist/examples/auth/authorization.middleware.js +2 -0
  63. package/dist/examples/auth/authorization.middleware.js.map +1 -0
  64. package/dist/examples/auth/context.extractor.d.ts +1 -0
  65. package/dist/examples/auth/context.extractor.d.ts.map +1 -0
  66. package/dist/examples/auth/context.extractor.js +2 -0
  67. package/dist/examples/auth/context.extractor.js.map +1 -0
  68. package/dist/examples/auth/example.d.ts +1 -0
  69. package/dist/examples/auth/example.d.ts.map +1 -0
  70. package/dist/examples/auth/example.js +2 -0
  71. package/dist/examples/auth/example.js.map +1 -0
  72. package/dist/examples/auth/provider.d.ts +1 -0
  73. package/dist/examples/auth/provider.d.ts.map +1 -0
  74. package/dist/examples/auth/provider.js +2 -0
  75. package/dist/examples/auth/provider.js.map +1 -0
  76. package/dist/examples/auth/users.d.ts +1 -0
  77. package/dist/examples/auth/users.d.ts.map +1 -0
  78. package/dist/examples/auth/users.js +2 -0
  79. package/dist/examples/auth/users.js.map +1 -0
  80. package/dist/examples/authorization-examples.d.ts +67 -0
  81. package/dist/examples/authorization-examples.d.ts.map +1 -0
  82. package/dist/examples/authorization-examples.js +202 -0
  83. package/dist/examples/authorization-examples.js.map +1 -0
  84. package/dist/examples/controllers/auth.controller.d.ts +64 -0
  85. package/dist/examples/controllers/auth.controller.d.ts.map +1 -0
  86. package/dist/examples/controllers/auth.controller.js +284 -0
  87. package/dist/examples/controllers/auth.controller.js.map +1 -0
  88. package/dist/examples/controllers/health.controller.d.ts +1 -0
  89. package/dist/examples/controllers/health.controller.d.ts.map +1 -1
  90. package/dist/examples/controllers/health.controller.js +6 -0
  91. package/dist/examples/controllers/health.controller.js.map +1 -1
  92. package/dist/examples/controllers/todo-updated.controller.d.ts +103 -0
  93. package/dist/examples/controllers/todo-updated.controller.d.ts.map +1 -0
  94. package/dist/examples/controllers/todo-updated.controller.js +328 -0
  95. package/dist/examples/controllers/todo-updated.controller.js.map +1 -0
  96. package/dist/examples/controllers/todo-with-jwt-auth.controller.d.ts +114 -0
  97. package/dist/examples/controllers/todo-with-jwt-auth.controller.d.ts.map +1 -0
  98. package/dist/examples/controllers/todo-with-jwt-auth.controller.js +329 -0
  99. package/dist/examples/controllers/todo-with-jwt-auth.controller.js.map +1 -0
  100. package/dist/examples/controllers/todo.controller.d.ts +4 -2
  101. package/dist/examples/controllers/todo.controller.d.ts.map +1 -1
  102. package/dist/examples/controllers/todo.controller.js +44 -18
  103. package/dist/examples/controllers/todo.controller.js.map +1 -1
  104. package/dist/examples/events/TodoEventHandler.d.ts +4 -1
  105. package/dist/examples/events/TodoEventHandler.d.ts.map +1 -1
  106. package/dist/examples/events/TodoEventHandler.js +8 -4
  107. package/dist/examples/events/TodoEventHandler.js.map +1 -1
  108. package/dist/examples/global-middleware-example.d.ts +2 -0
  109. package/dist/examples/global-middleware-example.d.ts.map +1 -0
  110. package/dist/examples/global-middleware-example.js +94 -0
  111. package/dist/examples/global-middleware-example.js.map +1 -0
  112. package/dist/examples/index.d.ts.map +1 -1
  113. package/dist/examples/index.js +81 -25
  114. package/dist/examples/index.js.map +1 -1
  115. package/dist/examples/jwt-auth-example.d.ts +47 -0
  116. package/dist/examples/jwt-auth-example.d.ts.map +1 -0
  117. package/dist/examples/jwt-auth-example.js +316 -0
  118. package/dist/examples/jwt-auth-example.js.map +1 -0
  119. package/dist/examples/services/todo.service.d.ts +3 -2
  120. package/dist/examples/services/todo.service.d.ts.map +1 -1
  121. package/dist/examples/services/todo.service.js +12 -2
  122. package/dist/examples/services/todo.service.js.map +1 -1
  123. package/dist/examples/services/user.service.d.ts +99 -0
  124. package/dist/examples/services/user.service.d.ts.map +1 -0
  125. package/dist/examples/services/user.service.js +281 -0
  126. package/dist/examples/services/user.service.js.map +1 -0
  127. package/dist/examples/simple-auth-example.d.ts +7 -0
  128. package/dist/examples/simple-auth-example.d.ts.map +1 -0
  129. package/dist/examples/simple-auth-example.js +106 -0
  130. package/dist/examples/simple-auth-example.js.map +1 -0
  131. package/dist/examples/test-auth-flow.d.ts +56 -0
  132. package/dist/examples/test-auth-flow.d.ts.map +1 -0
  133. package/dist/examples/test-auth-flow.js +449 -0
  134. package/dist/examples/test-auth-flow.js.map +1 -0
  135. package/dist/examples/todos/schema.d.ts +8 -8
  136. package/dist/index.d.ts +1 -0
  137. package/dist/index.d.ts.map +1 -1
  138. package/dist/index.js +1 -0
  139. package/dist/index.js.map +1 -1
  140. package/dist/logging/config/logging.config.d.ts +0 -32
  141. package/dist/logging/config/logging.config.d.ts.map +1 -1
  142. package/dist/logging/config/logging.config.js +43 -49
  143. package/dist/logging/config/logging.config.js.map +1 -1
  144. package/dist/logging/core/logger.d.ts +1 -0
  145. package/dist/logging/core/logger.d.ts.map +1 -1
  146. package/dist/logging/core/logger.js +3 -0
  147. package/dist/logging/core/logger.js.map +1 -1
  148. package/dist/logging/core/logger.provider.d.ts.map +1 -1
  149. package/dist/logging/core/logger.provider.js +24 -12
  150. package/dist/logging/core/logger.provider.js.map +1 -1
  151. package/dist/logging/core/startup.logger.d.ts +1 -1
  152. package/dist/logging/core/startup.logger.d.ts.map +1 -1
  153. package/dist/logging/core/startup.logger.js +6 -3
  154. package/dist/logging/core/startup.logger.js.map +1 -1
  155. package/dist/logging/core/tracing.service.d.ts +32 -0
  156. package/dist/logging/core/tracing.service.d.ts.map +1 -0
  157. package/dist/logging/core/tracing.service.js +165 -0
  158. package/dist/logging/core/tracing.service.js.map +1 -0
  159. package/dist/logging/index.d.ts +1 -1
  160. package/dist/logging/index.d.ts.map +1 -1
  161. package/dist/logging/index.js +3 -2
  162. package/dist/logging/index.js.map +1 -1
  163. package/dist/middleware/auth-context.extractor.d.ts +5 -0
  164. package/dist/middleware/auth-context.extractor.d.ts.map +1 -0
  165. package/dist/middleware/auth-context.extractor.js +114 -0
  166. package/dist/middleware/auth-context.extractor.js.map +1 -0
  167. package/dist/middleware/auth.middleware.d.ts +16 -2
  168. package/dist/middleware/auth.middleware.d.ts.map +1 -1
  169. package/dist/middleware/auth.middleware.js +110 -13
  170. package/dist/middleware/auth.middleware.js.map +1 -1
  171. package/dist/middleware/authorization.middleware.d.ts +21 -0
  172. package/dist/middleware/authorization.middleware.d.ts.map +1 -0
  173. package/dist/middleware/authorization.middleware.js +55 -0
  174. package/dist/middleware/authorization.middleware.js.map +1 -0
  175. package/dist/middleware/context.middleware.d.ts +12 -2
  176. package/dist/middleware/context.middleware.d.ts.map +1 -1
  177. package/dist/middleware/context.middleware.js +43 -17
  178. package/dist/middleware/context.middleware.js.map +1 -1
  179. package/dist/middleware/index.d.ts +1 -0
  180. package/dist/middleware/index.d.ts.map +1 -1
  181. package/dist/middleware/tracing.middleware.d.ts +15 -0
  182. package/dist/middleware/tracing.middleware.d.ts.map +1 -0
  183. package/dist/middleware/tracing.middleware.js +36 -0
  184. package/dist/middleware/tracing.middleware.js.map +1 -0
  185. package/package.json +5 -1
@@ -0,0 +1,94 @@
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.startAppWithGlobalMiddlewares = startAppWithGlobalMiddlewares;
13
+ const index_1 = require("../index");
14
+ const decorators_1 = require("../core/decorators");
15
+ // Example middleware implementations
16
+ const authMiddleware = async (request, reply) => {
17
+ console.log('šŸ” Auth middleware executed');
18
+ request.user = { id: 1, username: 'testuser' };
19
+ };
20
+ const rateLimitMiddleware = async (request, reply) => {
21
+ console.log('ā±ļø Rate limit middleware executed');
22
+ // Add rate limiting logic here
23
+ // For example: check request count per IP, implement sliding window, etc.
24
+ // Example: Simple rate limiting check
25
+ const clientIP = request.ip;
26
+ console.log(`Rate limiting check for IP: ${clientIP}`);
27
+ };
28
+ const loggingMiddleware = async (request, reply) => {
29
+ console.log('šŸ“ Custom logging middleware executed');
30
+ // Add custom logging logic here
31
+ // For example: log request details, performance metrics, etc.
32
+ console.log(`${request.method} ${request.url} - User-Agent: ${request.headers['user-agent']}`);
33
+ };
34
+ const corsMiddleware = async (request, reply) => {
35
+ console.log('🌐 CORS middleware executed');
36
+ // Add CORS headers
37
+ reply.header('Access-Control-Allow-Origin', '*');
38
+ reply.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
39
+ reply.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
40
+ };
41
+ let UserController = class UserController {
42
+ getUsers() {
43
+ return {
44
+ message: 'Users retrieved successfully',
45
+ users: [
46
+ { id: 1, name: 'John Doe' },
47
+ { id: 2, name: 'Jane Smith' }
48
+ ]
49
+ };
50
+ }
51
+ getUserById() {
52
+ return {
53
+ message: 'User retrieved successfully',
54
+ user: { id: 1, name: 'John Doe' }
55
+ };
56
+ }
57
+ };
58
+ __decorate([
59
+ (0, decorators_1.Get)('/'),
60
+ __metadata("design:type", Function),
61
+ __metadata("design:paramtypes", []),
62
+ __metadata("design:returntype", void 0)
63
+ ], UserController.prototype, "getUsers", null);
64
+ __decorate([
65
+ (0, decorators_1.Get)('/:id'),
66
+ __metadata("design:type", Function),
67
+ __metadata("design:paramtypes", []),
68
+ __metadata("design:returntype", void 0)
69
+ ], UserController.prototype, "getUserById", null);
70
+ UserController = __decorate([
71
+ (0, decorators_1.Controller)('/api/users')
72
+ ], UserController);
73
+ // Example usage of globalMiddlewares
74
+ async function startAppWithGlobalMiddlewares() {
75
+ const app = await (0, index_1.createBootifyApp)({
76
+ controllers: [UserController],
77
+ port: 3000,
78
+ enableSwagger: true,
79
+ // Global middlewares execute in the order they are defined
80
+ globalMiddlewares: [
81
+ corsMiddleware, // Executes first - handles CORS
82
+ authMiddleware, // Executes second - handles authentication
83
+ rateLimitMiddleware, // Executes third - handles rate limiting
84
+ loggingMiddleware // Executes fourth - handles custom logging
85
+ ]
86
+ });
87
+ await app.start();
88
+ console.log('šŸš€ Server started with global middlewares!');
89
+ console.log('šŸ“– API Documentation: http://localhost:3000/api-docs');
90
+ console.log('šŸ”— Test endpoint: http://localhost:3000/api/users');
91
+ }
92
+ // Uncomment to run this example
93
+ // startAppWithGlobalMiddlewares().catch(console.error)
94
+ //# sourceMappingURL=global-middleware-example.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-middleware-example.js","sourceRoot":"","sources":["../../src/examples/global-middleware-example.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/examples/index.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/examples/index.ts"],"names":[],"mappings":"AACA,OAAO,kBAAkB,CAAA"}
@@ -3,44 +3,100 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- require("reflect-metadata");
7
6
  const dotenv_1 = __importDefault(require("dotenv"));
8
- dotenv_1.default.config();
7
+ require("reflect-metadata");
9
8
  const api_1 = require("../api");
9
+ const di_container_1 = require("../core/di-container");
10
+ const bootstrap_1 = require("../events/bootstrap");
10
11
  const health_controller_1 = require("./controllers/health.controller");
11
12
  const todo_controller_1 = require("./controllers/todo.controller");
12
- const component_registry_1 = require("../core/component-registry");
13
- const bootstrap_1 = require("../events/bootstrap");
14
- const di_container_1 = require("../core/di-container");
15
- const todo_service_1 = require("./services/todo.service");
13
+ dotenv_1.default.config();
14
+ // import { bootstrapCache } from '../cache/bootstrap'
16
15
  const zod_1 = __importDefault(require("zod"));
17
- const AppConfig_1 = require("../config/AppConfig");
18
- // import { createBootifyApp } from './api'
19
- // import { HealthController } from './examples/controllers/health.controller'
20
- // import { TodoController } from './examples/controllers/todo.controller'
16
+ const basic_usage_1 = require("../auth/examples/basic-usage");
21
17
  // --- Application Startup ---
18
+ const envSchema = zod_1.default.object({
19
+ NODE_ENV: zod_1.default.string().min(1),
20
+ JWT_SECRET: zod_1.default.string().min(1),
21
+ });
22
+ // Global middleware implementations
23
+ const corsMiddleware = async (request, reply) => {
24
+ console.log('🌐 CORS middleware executed');
25
+ reply.header('Access-Control-Allow-Origin', '*');
26
+ reply.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
27
+ reply.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
28
+ };
29
+ const requestTimingMiddleware = async (request, reply) => {
30
+ const startTime = Date.now();
31
+ console.log(`ā±ļø Request started: ${request.method} ${request.url}`);
32
+ request.startTime = startTime;
33
+ request.logTiming = () => {
34
+ const duration = Date.now() - startTime;
35
+ console.log(`ā±ļø Request completed in ${duration}ms: ${request.method} ${request.url}`);
36
+ };
37
+ };
38
+ const securityHeadersMiddleware = async (request, reply) => {
39
+ console.log('šŸ”’ Security headers middleware executed');
40
+ reply.header('X-Content-Type-Options', 'nosniff');
41
+ reply.header('X-Frame-Options', 'DENY');
42
+ reply.header('X-XSS-Protection', '1; mode=block');
43
+ reply.header('Strict-Transport-Security', 'max-age=31536000; includeSubDomains');
44
+ };
45
+ const requestLoggingMiddleware = async (request, reply) => {
46
+ const clientIP = request.ip;
47
+ const userAgent = request.headers['user-agent'] || 'Unknown';
48
+ console.log(`šŸ“ Request: ${request.method} ${request.url} from ${clientIP} - ${userAgent}`);
49
+ };
22
50
  async function main() {
23
51
  // await intitializeLogging()
24
- AppConfig_1.AppConfig.initialize(zod_1.default.object({
25
- NODE_ENV: zod_1.default.string().min(1),
26
- }));
27
- const allComponents = Array.from(component_registry_1.registeredComponents);
52
+ const { middleware: jwtAuthMiddleware, authManager } = await (0, basic_usage_1.setupJwtAuth)();
53
+ // Register authManager in DI container for controller injection
54
+ di_container_1.container.register('AuthManager', { useFactory: () => authManager });
55
+ const allComponents = Array.from(di_container_1.container.getRegisteredComponents());
28
56
  await (0, bootstrap_1.bootstrapEventSystem)(allComponents);
29
57
  // await bootstrapCache()
30
- const { start } = await (0, api_1.createBootifyApp)({
58
+ const { app, start } = await (0, api_1.createBootifyApp)({
31
59
  controllers: [health_controller_1.HealthController, todo_controller_1.TodoController],
32
60
  enableSwagger: true,
33
- port: 3000,
34
- configSchema: zod_1.default.object({
35
- NODE_ENV: zod_1.default.string().min(1),
36
- }),
61
+ port: 8080,
62
+ configSchema: envSchema,
63
+ globalMiddlewares: [
64
+ jwtAuthMiddleware.authenticate({
65
+ strategies: ['jwt', 'api-key'],
66
+ skipPaths: ['/auth/login', '/auth/refresh', '/health']
67
+ }),
68
+ corsMiddleware, // 1st: Handle CORS headers
69
+ securityHeadersMiddleware, // 2nd: Add security headers
70
+ requestTimingMiddleware, // 3rd: Start request timing
71
+ requestLoggingMiddleware // 4th: Log request details
72
+ ]
37
73
  });
38
- console.log('All components:', di_container_1.container.getRegisteredComponents());
39
- const animal = di_container_1.container.resolve('Animal');
40
- // console.log(animal)
41
- const animalservice = di_container_1.container.resolve(todo_service_1.AnimalService);
42
- console.log(animalservice.animal === animalservice.animal1);
43
- console.log(animalservice.animal.name);
74
+ await (0, basic_usage_1.registerJWTAuthRoutes)(app, authManager, jwtAuthMiddleware);
75
+ // Setup context middleware with authentication
76
+ // app.addHook('onRequest', createContextMiddleware(authContextExtractor));
77
+ // console.log('All components:', container.getRegisteredComponents())
78
+ // const animal = container.resolve<Animal>('Animal')
79
+ // // console.log(animal)
80
+ // const animalservice: AnimalService = container.resolve<AnimalService>(AnimalService)
81
+ // console.log(animalservice.animal === animalservice.animal1)
82
+ // console.log(animalservice.animal.name)
83
+ // console.log('šŸš€ BootifyJS Example Server starting...');
84
+ // console.log('šŸ”§ Global middlewares enabled: CORS, Security Headers, Request Timing, Request Logging');
85
+ // console.log('šŸ“Š Available endpoints:');
86
+ // console.log(' GET /todos - List all todos (requires authentication)');
87
+ // console.log(' POST /todos - Create a new todo (requires authentication)');
88
+ // console.log(' GET /todos/:id - Get a specific todo (requires authentication)');
89
+ // console.log(' PUT /todos/:id - Update a todo (requires authentication)');
90
+ // console.log(' DELETE /todos/:id - Delete a todo (requires authentication)');
91
+ // console.log(' GET /animals - List all animals');
92
+ // console.log(' POST /animals - Create a new animal');
93
+ // console.log('šŸ” Authentication endpoints:');
94
+ // console.log(' POST /auth/login - Login to get JWT token');
95
+ // console.log(' GET /auth/info - Check authentication status');
96
+ // console.log('šŸ’” Use @UseMiddleware(authenticate()) decorator for protected routes!');
97
+ // console.log('šŸ”‘ Test credentials: admin/admin123, manager/manager123, user/user123');
98
+ // console.log('🌐 CORS enabled for all origins');
99
+ // console.log('šŸ”’ Security headers automatically added to all responses');
44
100
  await start();
45
101
  }
46
102
  main();
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/examples/index.ts"],"names":[],"mappings":";;;;;AAAA,4BAAyB;AACzB,oDAA2B;AAC3B,gBAAM,CAAC,MAAM,EAAE,CAAA;AACf,gCAAyC;AACzC,uEAAkE;AAClE,mEAA8D;AAC9D,mEAAiE;AACjE,mDAA0D;AAC1D,uDAAgD;AAChD,0DAA+D;AAG/D,8CAAmB;AACnB,mDAA+C;AAC/C,2CAA2C;AAC3C,8EAA8E;AAC9E,0EAA0E;AAE1E,8BAA8B;AAE9B,KAAK,UAAU,IAAI;IACjB,+BAA+B;IAC/B,qBAAS,CAAC,UAAU,CAClB,aAAC,CAAC,MAAM,CAAC;QACP,QAAQ,EAAE,aAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;KAC5B,CAAC,CACH,CAAA;IAED,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,yCAAoB,CAAC,CAAA;IACtD,MAAM,IAAA,gCAAoB,EAAC,aAAa,CAAC,CAAA;IACzC,yBAAyB;IACzB,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAA,sBAAgB,EAAC;QACvC,WAAW,EAAE,CAAC,oCAAgB,EAAE,gCAAc,CAAC;QAC/C,aAAa,EAAE,IAAI;QACnB,IAAI,EAAE,IAAI;QACV,YAAY,EAAE,aAAC,CAAC,MAAM,CAAC;YACrB,QAAQ,EAAE,aAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;SAC5B,CAAC;KACH,CAAC,CAAA;IAEF,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,wBAAS,CAAC,uBAAuB,EAAE,CAAC,CAAA;IACnE,MAAM,MAAM,GAAG,wBAAS,CAAC,OAAO,CAAS,QAAQ,CAAC,CAAA;IAElD,wBAAwB;IACxB,MAAM,aAAa,GAAkB,wBAAS,CAAC,OAAO,CAAgB,4BAAa,CAAC,CAAA;IACpF,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,KAAK,aAAa,CAAC,OAAO,CAAC,CAAA;IAC3D,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAEtC,MAAM,KAAK,EAAE,CAAA;AACf,CAAC;AAED,IAAI,EAAE,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/examples/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import { FastifyInstance } from 'fastify';
2
+ /**
3
+ * JWT Authentication Example
4
+ * Demonstrates how to set up JWT authentication with global middleware
5
+ * and protected routes in a Fastify application
6
+ */
7
+ /**
8
+ * Protected User Controller
9
+ * Example controller that requires authentication
10
+ */
11
+ declare class ProtectedUserController {
12
+ /**
13
+ * Get current user profile (requires authentication)
14
+ */
15
+ getProfile(request: any, reply: any): Promise<void>;
16
+ /**
17
+ * Update user profile (requires authentication)
18
+ */
19
+ updateProfile(request: any, reply: any): Promise<void>;
20
+ /**
21
+ * Admin only endpoint (requires admin role)
22
+ */
23
+ getAllUsers(request: any, reply: any): Promise<void>;
24
+ /**
25
+ * Delete user (requires admin permission)
26
+ */
27
+ deleteUser(request: any, reply: any): Promise<void>;
28
+ /**
29
+ * Public endpoint (optional authentication)
30
+ */
31
+ getPublicInfo(request: any, reply: any): Promise<void>;
32
+ }
33
+ /**
34
+ * Setup JWT Authentication Routes and Middleware
35
+ */
36
+ export declare function setupJwtAuth(fastify: FastifyInstance): Promise<void>;
37
+ /**
38
+ * Setup Global JWT Authentication Middleware
39
+ * This applies JWT authentication to ALL routes except those explicitly excluded
40
+ */
41
+ export declare function setupGlobalJwtAuth(fastify: FastifyInstance): Promise<void>;
42
+ /**
43
+ * Start Fastify server with JWT authentication
44
+ */
45
+ export declare function startAppWithJwtAuth(useGlobalAuth?: boolean): Promise<void>;
46
+ export { ProtectedUserController };
47
+ //# sourceMappingURL=jwt-auth-example.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt-auth-example.d.ts","sourceRoot":"","sources":["../../src/examples/jwt-auth-example.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAK1C;;;;GAIG;AAEH;;;GAGG;AACH,cAAM,uBAAuB;IAC3B;;OAEG;IACG,UAAU,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG;IAUzC;;OAEG;IACG,aAAa,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG;IAyB5C;;OAEG;IACG,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG;IAU1C;;OAEG;IACG,UAAU,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG;IAkBzC;;OAEG;IACG,aAAa,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG;CAc7C;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,eAAe,iBAmE1D;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,eAAe,iBA2EhE;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,aAAa,GAAE,OAAe,iBAgFvE;AAGD,OAAO,EAAE,uBAAuB,EAAE,CAAC"}
@@ -0,0 +1,316 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ProtectedUserController = void 0;
4
+ exports.setupJwtAuth = setupJwtAuth;
5
+ exports.setupGlobalJwtAuth = setupGlobalJwtAuth;
6
+ exports.startAppWithJwtAuth = startAppWithJwtAuth;
7
+ const auth_controller_1 = require("./controllers/auth.controller");
8
+ const auth_middleware_1 = require("./auth/auth.middleware");
9
+ const user_service_1 = require("./services/user.service");
10
+ /**
11
+ * JWT Authentication Example
12
+ * Demonstrates how to set up JWT authentication with global middleware
13
+ * and protected routes in a Fastify application
14
+ */
15
+ /**
16
+ * Protected User Controller
17
+ * Example controller that requires authentication
18
+ */
19
+ class ProtectedUserController {
20
+ /**
21
+ * Get current user profile (requires authentication)
22
+ */
23
+ async getProfile(request, reply) {
24
+ const user = request.user;
25
+ const profile = await user_service_1.userService.getUserProfile(user.id);
26
+ reply.send({
27
+ success: true,
28
+ data: profile
29
+ });
30
+ }
31
+ /**
32
+ * Update user profile (requires authentication)
33
+ */
34
+ async updateProfile(request, reply) {
35
+ const user = request.user;
36
+ const { email, firstName, lastName } = request.body;
37
+ const updatedUser = await user_service_1.userService.updateProfile(user.id, {
38
+ email,
39
+ firstName,
40
+ lastName
41
+ });
42
+ if (!updatedUser) {
43
+ reply.code(404).send({
44
+ error: 'USER_NOT_FOUND',
45
+ message: 'User not found'
46
+ });
47
+ return;
48
+ }
49
+ reply.send({
50
+ success: true,
51
+ data: updatedUser,
52
+ message: 'Profile updated successfully'
53
+ });
54
+ }
55
+ /**
56
+ * Admin only endpoint (requires admin role)
57
+ */
58
+ async getAllUsers(request, reply) {
59
+ const users = await user_service_1.userService.userRepository.findAll();
60
+ reply.send({
61
+ success: true,
62
+ data: users,
63
+ count: users.length
64
+ });
65
+ }
66
+ /**
67
+ * Delete user (requires admin permission)
68
+ */
69
+ async deleteUser(request, reply) {
70
+ const { userId } = request.params;
71
+ const success = await user_service_1.userService.userRepository.delete(userId);
72
+ if (!success) {
73
+ reply.code(404).send({
74
+ error: 'USER_NOT_FOUND',
75
+ message: 'User not found'
76
+ });
77
+ return;
78
+ }
79
+ reply.send({
80
+ success: true,
81
+ message: 'User deleted successfully'
82
+ });
83
+ }
84
+ /**
85
+ * Public endpoint (optional authentication)
86
+ */
87
+ async getPublicInfo(request, reply) {
88
+ const isAuthenticated = request.isAuthenticated;
89
+ const user = request.user;
90
+ reply.send({
91
+ success: true,
92
+ data: {
93
+ message: 'This is public information',
94
+ timestamp: new Date().toISOString(),
95
+ authenticated: isAuthenticated,
96
+ user: isAuthenticated ? { id: user.id, username: user.username } : null
97
+ }
98
+ });
99
+ }
100
+ }
101
+ exports.ProtectedUserController = ProtectedUserController;
102
+ /**
103
+ * Setup JWT Authentication Routes and Middleware
104
+ */
105
+ async function setupJwtAuth(fastify) {
106
+ // Initialize controllers
107
+ const authController = new auth_controller_1.AuthController();
108
+ const userController = new ProtectedUserController();
109
+ // Register authentication routes (no middleware needed)
110
+ fastify.register(async function authRoutes(fastify) {
111
+ fastify.post('/auth/login', async (request, reply) => {
112
+ return authController.login(request.body);
113
+ });
114
+ fastify.post('/auth/refresh', async (request, reply) => {
115
+ return authController.refreshToken(request.body);
116
+ });
117
+ fastify.post('/auth/logout', async (request, reply) => {
118
+ return authController.logout(request.body);
119
+ });
120
+ fastify.get('/auth/info', async (request, reply) => {
121
+ return authController.getAuthInfo();
122
+ });
123
+ });
124
+ // Register public routes with optional authentication
125
+ fastify.register(async function publicRoutes(fastify) {
126
+ // Add optional auth middleware
127
+ fastify.addHook('preHandler', auth_middleware_1.optionalJwtAuthMiddleware);
128
+ fastify.get('/public/info', async (request, reply) => {
129
+ return userController.getPublicInfo(request, reply);
130
+ });
131
+ });
132
+ // Register protected user routes (requires authentication)
133
+ fastify.register(async function protectedRoutes(fastify) {
134
+ // Add JWT authentication middleware to all routes in this group
135
+ fastify.addHook('preHandler', auth_middleware_1.jwtAuthMiddleware);
136
+ fastify.get('/user/profile', async (request, reply) => {
137
+ return userController.getProfile(request, reply);
138
+ });
139
+ fastify.put('/user/profile', async (request, reply) => {
140
+ return userController.updateProfile(request, reply);
141
+ });
142
+ });
143
+ // Register admin routes (requires admin role)
144
+ fastify.register(async function adminRoutes(fastify) {
145
+ // Add JWT authentication middleware
146
+ fastify.addHook('preHandler', auth_middleware_1.jwtAuthMiddleware);
147
+ // Add role-based authorization middleware
148
+ fastify.addHook('preHandler', (0, auth_middleware_1.requireRoles)(['admin']));
149
+ fastify.get('/admin/users', async (request, reply) => {
150
+ return userController.getAllUsers(request, reply);
151
+ });
152
+ });
153
+ // Register admin routes with permission-based access
154
+ fastify.register(async function adminPermissionRoutes(fastify) {
155
+ // Add JWT authentication middleware
156
+ fastify.addHook('preHandler', auth_middleware_1.jwtAuthMiddleware);
157
+ // Add permission-based authorization middleware
158
+ fastify.addHook('preHandler', (0, auth_middleware_1.requirePermissions)(['delete']));
159
+ fastify.delete('/admin/users/:userId', async (request, reply) => {
160
+ return userController.deleteUser(request, reply);
161
+ });
162
+ });
163
+ }
164
+ /**
165
+ * Setup Global JWT Authentication Middleware
166
+ * This applies JWT authentication to ALL routes except those explicitly excluded
167
+ */
168
+ async function setupGlobalJwtAuth(fastify) {
169
+ // Define paths that should skip authentication
170
+ const skipAuthPaths = [
171
+ '/auth/login',
172
+ '/auth/refresh',
173
+ '/public/info',
174
+ '/health',
175
+ '/docs',
176
+ '/docs/static/*'
177
+ ];
178
+ // Global authentication middleware
179
+ fastify.addHook('preHandler', async (request, reply) => {
180
+ // Skip authentication for excluded paths
181
+ const shouldSkip = skipAuthPaths.some(path => {
182
+ if (path.endsWith('/*')) {
183
+ const basePath = path.slice(0, -2);
184
+ return request.url.startsWith(basePath);
185
+ }
186
+ return request.url === path || request.url.startsWith(path + '?');
187
+ });
188
+ if (shouldSkip) {
189
+ return;
190
+ }
191
+ // Apply JWT authentication middleware
192
+ await (0, auth_middleware_1.jwtAuthMiddleware)(request, reply);
193
+ });
194
+ // Initialize controllers
195
+ const authController = new auth_controller_1.AuthController();
196
+ const userController = new ProtectedUserController();
197
+ // Register all routes (authentication will be handled globally)
198
+ fastify.post('/auth/login', async (request, reply) => {
199
+ return authController.login(request.body);
200
+ });
201
+ fastify.post('/auth/refresh', async (request, reply) => {
202
+ return authController.refreshToken(request.body);
203
+ });
204
+ fastify.post('/auth/logout', async (request, reply) => {
205
+ return authController.logout(request.body);
206
+ });
207
+ fastify.get('/auth/info', async (request, reply) => {
208
+ return authController.getAuthInfo();
209
+ });
210
+ // Public routes
211
+ fastify.get('/public/info', async (request, reply) => {
212
+ return userController.getPublicInfo(request, reply);
213
+ });
214
+ // Protected routes (will be automatically protected by global middleware)
215
+ fastify.get('/user/profile', async (request, reply) => {
216
+ return userController.getProfile(request, reply);
217
+ });
218
+ fastify.put('/user/profile', async (request, reply) => {
219
+ return userController.updateProfile(request, reply);
220
+ });
221
+ // Admin routes with additional role checks
222
+ fastify.register(async function adminRoutes(fastify) {
223
+ fastify.addHook('preHandler', (0, auth_middleware_1.requireRoles)(['admin']));
224
+ fastify.get('/admin/users', async (request, reply) => {
225
+ return userController.getAllUsers(request, reply);
226
+ });
227
+ });
228
+ fastify.register(async function adminPermissionRoutes(fastify) {
229
+ fastify.addHook('preHandler', (0, auth_middleware_1.requirePermissions)(['delete']));
230
+ fastify.delete('/admin/users/:userId', async (request, reply) => {
231
+ return userController.deleteUser(request, reply);
232
+ });
233
+ });
234
+ }
235
+ /**
236
+ * Start Fastify server with JWT authentication
237
+ */
238
+ async function startAppWithJwtAuth(useGlobalAuth = false) {
239
+ const fastify = require('fastify')({ logger: true });
240
+ try {
241
+ // Setup CORS
242
+ await fastify.register(require('@fastify/cors'), {
243
+ origin: true,
244
+ credentials: true
245
+ });
246
+ // Setup JSON schema validation
247
+ fastify.setErrorHandler((error, request, reply) => {
248
+ if (error.validation) {
249
+ reply.code(400).send({
250
+ error: 'VALIDATION_ERROR',
251
+ message: 'Request validation failed',
252
+ details: error.validation
253
+ });
254
+ return;
255
+ }
256
+ if (error.statusCode) {
257
+ reply.code(error.statusCode).send({
258
+ error: error.name || 'ERROR',
259
+ message: error.message
260
+ });
261
+ return;
262
+ }
263
+ reply.code(500).send({
264
+ error: 'INTERNAL_SERVER_ERROR',
265
+ message: 'An unexpected error occurred'
266
+ });
267
+ });
268
+ // Setup authentication
269
+ if (useGlobalAuth) {
270
+ console.log('Setting up global JWT authentication...');
271
+ await setupGlobalJwtAuth(fastify);
272
+ }
273
+ else {
274
+ console.log('Setting up route-specific JWT authentication...');
275
+ await setupJwtAuth(fastify);
276
+ }
277
+ // Health check endpoint
278
+ fastify.get('/health', async (request, reply) => {
279
+ return {
280
+ status: 'ok',
281
+ timestamp: new Date().toISOString(),
282
+ uptime: process.uptime()
283
+ };
284
+ });
285
+ // Start server
286
+ const port = process.env.PORT || 3000;
287
+ const host = process.env.HOST || '0.0.0.0';
288
+ await fastify.listen({ port: Number(port), host });
289
+ console.log(`\nšŸš€ Server running at http://${host}:${port}`);
290
+ console.log('\nšŸ“š Available endpoints:');
291
+ console.log(' POST /auth/login - Login with username/password');
292
+ console.log(' POST /auth/refresh - Refresh access token');
293
+ console.log(' POST /auth/logout - Logout and revoke tokens');
294
+ console.log(' GET /auth/info - Get current user info (requires auth)');
295
+ console.log(' GET /public/info - Public endpoint (optional auth)');
296
+ console.log(' GET /user/profile - Get user profile (requires auth)');
297
+ console.log(' PUT /user/profile - Update user profile (requires auth)');
298
+ console.log(' GET /admin/users - Get all users (requires admin role)');
299
+ console.log(' DELETE /admin/users/:userId - Delete user (requires delete permission)');
300
+ console.log(' GET /health - Health check');
301
+ console.log('\nšŸ” Test credentials:');
302
+ console.log(' Admin: username=admin, password=admin123');
303
+ console.log(' User: username=user, password=user123');
304
+ console.log(' Guest: username=guest, password=guest123');
305
+ }
306
+ catch (err) {
307
+ console.error('Error starting server:', err);
308
+ process.exit(1);
309
+ }
310
+ }
311
+ // If this file is run directly, start the server
312
+ if (require.main === module) {
313
+ const useGlobalAuth = process.argv.includes('--global');
314
+ startAppWithJwtAuth(useGlobalAuth);
315
+ }
316
+ //# sourceMappingURL=jwt-auth-example.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt-auth-example.js","sourceRoot":"","sources":["../../src/examples/jwt-auth-example.ts"],"names":[],"mappings":"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"}