@fabx.vn/core 1.0.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 (171) hide show
  1. package/README.md +270 -0
  2. package/dist/config/cookie.config.d.ts +3 -0
  3. package/dist/config/cookie.config.js +7 -0
  4. package/dist/config/cookie.config.js.map +1 -0
  5. package/dist/config/cors.config.d.ts +6 -0
  6. package/dist/config/cors.config.js +15 -0
  7. package/dist/config/cors.config.js.map +1 -0
  8. package/dist/config/database.config.d.ts +13 -0
  9. package/dist/config/database.config.js +17 -0
  10. package/dist/config/database.config.js.map +1 -0
  11. package/dist/config/google-oauth.config.d.ts +6 -0
  12. package/dist/config/google-oauth.config.js +10 -0
  13. package/dist/config/google-oauth.config.js.map +1 -0
  14. package/dist/config/internal.config.d.ts +8 -0
  15. package/dist/config/internal.config.js +15 -0
  16. package/dist/config/internal.config.js.map +1 -0
  17. package/dist/config/jwt.config.d.ts +5 -0
  18. package/dist/config/jwt.config.js +9 -0
  19. package/dist/config/jwt.config.js.map +1 -0
  20. package/dist/config/rabbitmq.config.d.ts +19 -0
  21. package/dist/config/rabbitmq.config.js +25 -0
  22. package/dist/config/rabbitmq.config.js.map +1 -0
  23. package/dist/config/redis.config.d.ts +9 -0
  24. package/dist/config/redis.config.js +13 -0
  25. package/dist/config/redis.config.js.map +1 -0
  26. package/dist/constants/http-status.constants.d.ts +106 -0
  27. package/dist/constants/http-status.constants.js +110 -0
  28. package/dist/constants/http-status.constants.js.map +1 -0
  29. package/dist/constants/messages.constants.d.ts +112 -0
  30. package/dist/constants/messages.constants.js +116 -0
  31. package/dist/constants/messages.constants.js.map +1 -0
  32. package/dist/core/core.module.d.ts +2 -0
  33. package/dist/core/core.module.js +72 -0
  34. package/dist/core/core.module.js.map +1 -0
  35. package/dist/core/decorators/current-user.decorator.d.ts +1 -0
  36. package/dist/core/decorators/current-user.decorator.js +9 -0
  37. package/dist/core/decorators/current-user.decorator.js.map +1 -0
  38. package/dist/core/decorators/public.decorator.d.ts +2 -0
  39. package/dist/core/decorators/public.decorator.js +8 -0
  40. package/dist/core/decorators/public.decorator.js.map +1 -0
  41. package/dist/core/decorators/require-permissions.decorator.d.ts +4 -0
  42. package/dist/core/decorators/require-permissions.decorator.js +11 -0
  43. package/dist/core/decorators/require-permissions.decorator.js.map +1 -0
  44. package/dist/core/dtos/api-response.dto.d.ts +10 -0
  45. package/dist/core/dtos/api-response.dto.js +22 -0
  46. package/dist/core/dtos/api-response.dto.js.map +1 -0
  47. package/dist/core/dtos/pagination.dto.d.ts +17 -0
  48. package/dist/core/dtos/pagination.dto.js +61 -0
  49. package/dist/core/dtos/pagination.dto.js.map +1 -0
  50. package/dist/core/filters/http-exception.filter.d.ts +5 -0
  51. package/dist/core/filters/http-exception.filter.js +47 -0
  52. package/dist/core/filters/http-exception.filter.js.map +1 -0
  53. package/dist/core/guards/internal-auth.guard.d.ts +7 -0
  54. package/dist/core/guards/internal-auth.guard.js +42 -0
  55. package/dist/core/guards/internal-auth.guard.js.map +1 -0
  56. package/dist/core/guards/jwt-auth.guard.d.ts +12 -0
  57. package/dist/core/guards/jwt-auth.guard.js +56 -0
  58. package/dist/core/guards/jwt-auth.guard.js.map +1 -0
  59. package/dist/core/guards/permission.guard.d.ts +9 -0
  60. package/dist/core/guards/permission.guard.js +71 -0
  61. package/dist/core/guards/permission.guard.js.map +1 -0
  62. package/dist/core/interceptors/request-context.interceptor.d.ts +8 -0
  63. package/dist/core/interceptors/request-context.interceptor.js +39 -0
  64. package/dist/core/interceptors/request-context.interceptor.js.map +1 -0
  65. package/dist/core/services/cache.service.d.ts +13 -0
  66. package/dist/core/services/cache.service.js +51 -0
  67. package/dist/core/services/cache.service.js.map +1 -0
  68. package/dist/core/services/cookie.service.d.ts +13 -0
  69. package/dist/core/services/cookie.service.js +50 -0
  70. package/dist/core/services/cookie.service.js.map +1 -0
  71. package/dist/core/services/jwt.service.d.ts +37 -0
  72. package/dist/core/services/jwt.service.js +187 -0
  73. package/dist/core/services/jwt.service.js.map +1 -0
  74. package/dist/core/services/permission.service.d.ts +23 -0
  75. package/dist/core/services/permission.service.js +83 -0
  76. package/dist/core/services/permission.service.js.map +1 -0
  77. package/dist/core/services/rabbitmq-publisher.service.d.ts +9 -0
  78. package/dist/core/services/rabbitmq-publisher.service.js +57 -0
  79. package/dist/core/services/rabbitmq-publisher.service.js.map +1 -0
  80. package/dist/core/services/redis.service.d.ts +18 -0
  81. package/dist/core/services/redis.service.js +66 -0
  82. package/dist/core/services/redis.service.js.map +1 -0
  83. package/dist/core/services/request-context.service.d.ts +18 -0
  84. package/dist/core/services/request-context.service.js +40 -0
  85. package/dist/core/services/request-context.service.js.map +1 -0
  86. package/dist/core/services/request-info.service.d.ts +8 -0
  87. package/dist/core/services/request-info.service.js +32 -0
  88. package/dist/core/services/request-info.service.js.map +1 -0
  89. package/dist/core/services/session.service.d.ts +21 -0
  90. package/dist/core/services/session.service.js +70 -0
  91. package/dist/core/services/session.service.js.map +1 -0
  92. package/dist/core/strategies/jwt.strategy.d.ts +7 -0
  93. package/dist/core/strategies/jwt.strategy.js +38 -0
  94. package/dist/core/strategies/jwt.strategy.js.map +1 -0
  95. package/dist/core/subscribers/audit.subscriber.d.ts +8 -0
  96. package/dist/core/subscribers/audit.subscriber.js +40 -0
  97. package/dist/core/subscribers/audit.subscriber.js.map +1 -0
  98. package/dist/core.module.d.ts +2 -0
  99. package/dist/core.module.js +72 -0
  100. package/dist/core.module.js.map +1 -0
  101. package/dist/decorators/current-user.decorator.d.ts +1 -0
  102. package/dist/decorators/current-user.decorator.js +9 -0
  103. package/dist/decorators/current-user.decorator.js.map +1 -0
  104. package/dist/decorators/public.decorator.d.ts +2 -0
  105. package/dist/decorators/public.decorator.js +8 -0
  106. package/dist/decorators/public.decorator.js.map +1 -0
  107. package/dist/decorators/require-permissions.decorator.d.ts +4 -0
  108. package/dist/decorators/require-permissions.decorator.js +11 -0
  109. package/dist/decorators/require-permissions.decorator.js.map +1 -0
  110. package/dist/dtos/api-response.dto.d.ts +10 -0
  111. package/dist/dtos/api-response.dto.js +22 -0
  112. package/dist/dtos/api-response.dto.js.map +1 -0
  113. package/dist/dtos/pagination.dto.d.ts +17 -0
  114. package/dist/dtos/pagination.dto.js +61 -0
  115. package/dist/dtos/pagination.dto.js.map +1 -0
  116. package/dist/filters/http-exception.filter.d.ts +5 -0
  117. package/dist/filters/http-exception.filter.js +47 -0
  118. package/dist/filters/http-exception.filter.js.map +1 -0
  119. package/dist/guards/internal-auth.guard.d.ts +7 -0
  120. package/dist/guards/internal-auth.guard.js +42 -0
  121. package/dist/guards/internal-auth.guard.js.map +1 -0
  122. package/dist/guards/jwt-auth.guard.d.ts +12 -0
  123. package/dist/guards/jwt-auth.guard.js +56 -0
  124. package/dist/guards/jwt-auth.guard.js.map +1 -0
  125. package/dist/guards/permission.guard.d.ts +9 -0
  126. package/dist/guards/permission.guard.js +71 -0
  127. package/dist/guards/permission.guard.js.map +1 -0
  128. package/dist/index.d.ts +33 -0
  129. package/dist/index.js +80 -0
  130. package/dist/index.js.map +1 -0
  131. package/dist/interceptors/request-context.interceptor.d.ts +8 -0
  132. package/dist/interceptors/request-context.interceptor.js +39 -0
  133. package/dist/interceptors/request-context.interceptor.js.map +1 -0
  134. package/dist/libs/axios/axios-client.d.ts +8 -0
  135. package/dist/libs/axios/axios-client.js +61 -0
  136. package/dist/libs/axios/axios-client.js.map +1 -0
  137. package/dist/libs/axios/index.d.ts +1 -0
  138. package/dist/libs/axios/index.js +8 -0
  139. package/dist/libs/axios/index.js.map +1 -0
  140. package/dist/services/cookie.service.d.ts +13 -0
  141. package/dist/services/cookie.service.js +50 -0
  142. package/dist/services/cookie.service.js.map +1 -0
  143. package/dist/services/jwt.service.d.ts +37 -0
  144. package/dist/services/jwt.service.js +187 -0
  145. package/dist/services/jwt.service.js.map +1 -0
  146. package/dist/services/rabbitmq-publisher.service.d.ts +9 -0
  147. package/dist/services/rabbitmq-publisher.service.js +57 -0
  148. package/dist/services/rabbitmq-publisher.service.js.map +1 -0
  149. package/dist/services/redis.service.d.ts +18 -0
  150. package/dist/services/redis.service.js +66 -0
  151. package/dist/services/redis.service.js.map +1 -0
  152. package/dist/services/request-context.service.d.ts +18 -0
  153. package/dist/services/request-context.service.js +40 -0
  154. package/dist/services/request-context.service.js.map +1 -0
  155. package/dist/services/request-info.service.d.ts +8 -0
  156. package/dist/services/request-info.service.js +32 -0
  157. package/dist/services/request-info.service.js.map +1 -0
  158. package/dist/services/session.service.d.ts +21 -0
  159. package/dist/services/session.service.js +70 -0
  160. package/dist/services/session.service.js.map +1 -0
  161. package/dist/strategies/jwt.strategy.d.ts +7 -0
  162. package/dist/strategies/jwt.strategy.js +38 -0
  163. package/dist/strategies/jwt.strategy.js.map +1 -0
  164. package/dist/subscribers/audit.subscriber.d.ts +8 -0
  165. package/dist/subscribers/audit.subscriber.js +40 -0
  166. package/dist/subscribers/audit.subscriber.js.map +1 -0
  167. package/dist/tsconfig.tsbuildinfo +1 -0
  168. package/dist/utils/date.utils.d.ts +4 -0
  169. package/dist/utils/date.utils.js +52 -0
  170. package/dist/utils/date.utils.js.map +1 -0
  171. package/package.json +52 -0
@@ -0,0 +1,187 @@
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.CoreJwtService = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const jwt_1 = require("@nestjs/jwt");
15
+ const session_service_1 = require("@core/services/session.service");
16
+ const date_utils_1 = require("@utils/date.utils");
17
+ const jwt_config_1 = require("@config/jwt.config");
18
+ const internal_config_1 = require("@config/internal.config");
19
+ const messages_constants_1 = require("@constants/messages.constants");
20
+ let CoreJwtService = class CoreJwtService {
21
+ constructor(jwtService, sessionService) {
22
+ this.jwtService = jwtService;
23
+ this.sessionService = sessionService;
24
+ }
25
+ async createAccessToken(sessionData) {
26
+ const ttlSec = date_utils_1.DateUtils.parseExpirationTime(jwt_config_1.jwtConfig.expiresIn);
27
+ const sessionId = await this.sessionService.createSession(sessionData, ttlSec);
28
+ const payload = {
29
+ sub: sessionData.userId,
30
+ sessionId: sessionId,
31
+ email: sessionData.email,
32
+ };
33
+ return this.jwtService.sign(payload);
34
+ }
35
+ createSimpleAccessToken(userId, email) {
36
+ const payload = {
37
+ sub: userId,
38
+ email: email,
39
+ };
40
+ return this.jwtService.sign(payload);
41
+ }
42
+ decodeToken(token) {
43
+ try {
44
+ const payload = this.jwtService.decode(token);
45
+ return payload;
46
+ }
47
+ catch (error) {
48
+ return null;
49
+ }
50
+ }
51
+ verifyToken(token) {
52
+ try {
53
+ const payload = this.jwtService.verify(token);
54
+ return payload;
55
+ }
56
+ catch (error) {
57
+ return null;
58
+ }
59
+ }
60
+ validateTokenSignature(token) {
61
+ try {
62
+ const payload = this.verifyToken(token);
63
+ if (!payload) {
64
+ return {
65
+ isValid: false,
66
+ error: messages_constants_1.MESSAGES.JWT.INVALID_TOKEN_SIGNATURE,
67
+ };
68
+ }
69
+ return {
70
+ isValid: true,
71
+ payload,
72
+ };
73
+ }
74
+ catch (error) {
75
+ return {
76
+ isValid: false,
77
+ error: messages_constants_1.MESSAGES.JWT.TOKEN_VALIDATION_FAILED,
78
+ };
79
+ }
80
+ }
81
+ isTokenSignatureValid(token) {
82
+ const result = this.validateTokenSignature(token);
83
+ return result.isValid;
84
+ }
85
+ getUserIdFromToken(token) {
86
+ const payload = this.decodeToken(token);
87
+ return payload?.sub || null;
88
+ }
89
+ getSessionIdFromToken(token) {
90
+ const payload = this.decodeToken(token);
91
+ return payload?.sessionId || null;
92
+ }
93
+ async deleteSessionFromToken(token) {
94
+ const sessionId = this.getSessionIdFromToken(token);
95
+ if (sessionId) {
96
+ await this.sessionService.deleteSession(sessionId);
97
+ return true;
98
+ }
99
+ return false;
100
+ }
101
+ extractTokenFromHeader(request) {
102
+ try {
103
+ const authHeader = request.headers?.authorization;
104
+ if (!authHeader || !authHeader.startsWith("Bearer ")) {
105
+ return null;
106
+ }
107
+ return authHeader.substring(7);
108
+ }
109
+ catch (error) {
110
+ return null;
111
+ }
112
+ }
113
+ getTokenExpirationTime(token) {
114
+ try {
115
+ const payload = this.decodeToken(token);
116
+ if (!payload)
117
+ return null;
118
+ const decoded = this.jwtService.decode(token);
119
+ if (!decoded?.exp)
120
+ return null;
121
+ const expiresIn = decoded.exp - Math.floor(Date.now() / 1000);
122
+ return expiresIn > 0 ? expiresIn : null;
123
+ }
124
+ catch (error) {
125
+ return null;
126
+ }
127
+ }
128
+ isTokenExpired(token) {
129
+ const expirationTime = this.getTokenExpirationTime(token);
130
+ return expirationTime === null || expirationTime <= 0;
131
+ }
132
+ createTokenPayload(userId, sessionId, email) {
133
+ const payload = {
134
+ sub: userId,
135
+ };
136
+ if (sessionId) {
137
+ payload.sessionId = sessionId;
138
+ }
139
+ if (email) {
140
+ payload.email = email;
141
+ }
142
+ return payload;
143
+ }
144
+ signToken(payload) {
145
+ return this.jwtService.sign(payload);
146
+ }
147
+ createInternalToken(service) {
148
+ return this.jwtService.sign({ service }, {
149
+ secret: internal_config_1.internalConfig.internalSecret,
150
+ expiresIn: "1m",
151
+ });
152
+ }
153
+ verifyInternalToken(token) {
154
+ try {
155
+ const payload = this.jwtService.verify(token, {
156
+ secret: internal_config_1.internalConfig.internalSecret,
157
+ });
158
+ return payload;
159
+ }
160
+ catch (error) {
161
+ return null;
162
+ }
163
+ }
164
+ async getCurrentUser(accessToken) {
165
+ try {
166
+ const payload = this.decodeToken(accessToken);
167
+ if (!payload?.sessionId)
168
+ return null;
169
+ const sessionData = await this.sessionService.getSession(payload.sessionId);
170
+ return sessionData;
171
+ }
172
+ catch (error) {
173
+ return null;
174
+ }
175
+ }
176
+ getEmailFromToken(token) {
177
+ const payload = this.decodeToken(token);
178
+ return payload?.email || null;
179
+ }
180
+ };
181
+ exports.CoreJwtService = CoreJwtService;
182
+ exports.CoreJwtService = CoreJwtService = __decorate([
183
+ (0, common_1.Injectable)(),
184
+ __metadata("design:paramtypes", [jwt_1.JwtService,
185
+ session_service_1.SessionService])
186
+ ], CoreJwtService);
187
+ //# sourceMappingURL=jwt.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt.service.js","sourceRoot":"","sources":["../../../src/core/services/jwt.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { DataSource } from "typeorm";
2
+ import { RedisService } from "./redis.service";
3
+ export interface PermissionQueryProvider {
4
+ getUserPermissionsQuery(userId: string): {
5
+ query: string;
6
+ params: any[];
7
+ };
8
+ }
9
+ export declare class PermissionService {
10
+ private dataSource;
11
+ private redisService;
12
+ private queryProvider;
13
+ private readonly CACHE_TTL;
14
+ private readonly CACHE_PREFIX;
15
+ constructor(dataSource: DataSource, redisService: RedisService, queryProvider: PermissionQueryProvider);
16
+ getUserPermissions(userId: string): Promise<string[]>;
17
+ hasPermissions(authUserId: string, requiredPermissions: string[]): Promise<boolean>;
18
+ hasAnyPermission(authUserId: string, requiredPermissions: string[]): Promise<boolean>;
19
+ invalidateUserPermissionsCache(userId: string): Promise<void>;
20
+ invalidateAllUserPermissionsCache(): Promise<void>;
21
+ private getCachedPermissions;
22
+ private setCachedPermissions;
23
+ }
@@ -0,0 +1,83 @@
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.PermissionService = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const typeorm_1 = require("@nestjs/typeorm");
18
+ const typeorm_2 = require("typeorm");
19
+ const redis_service_1 = require("./redis.service");
20
+ let PermissionService = class PermissionService {
21
+ constructor(dataSource, redisService, queryProvider) {
22
+ this.dataSource = dataSource;
23
+ this.redisService = redisService;
24
+ this.queryProvider = queryProvider;
25
+ this.CACHE_TTL = 300;
26
+ this.CACHE_PREFIX = "user_permissions:";
27
+ }
28
+ async getUserPermissions(userId) {
29
+ try {
30
+ const cachedPermissions = await this.getCachedPermissions(userId);
31
+ if (cachedPermissions) {
32
+ return cachedPermissions;
33
+ }
34
+ const { query, params } = this.queryProvider.getUserPermissionsQuery(userId);
35
+ const permissions = await this.dataSource.query(query, params);
36
+ const permissionCodes = permissions.map((p) => p.permission_code || p.code);
37
+ await this.setCachedPermissions(userId, permissionCodes);
38
+ return permissionCodes;
39
+ }
40
+ catch (error) {
41
+ console.warn("Cache failed, falling back to database:", error);
42
+ const { query, params } = this.queryProvider.getUserPermissionsQuery(userId);
43
+ const permissions = await this.dataSource.query(query, params);
44
+ return permissions.map((p) => p.permission_code || p.code);
45
+ }
46
+ }
47
+ async hasPermissions(authUserId, requiredPermissions) {
48
+ const userPermissions = await this.getUserPermissions(authUserId);
49
+ return requiredPermissions.every((permission) => userPermissions.includes(permission));
50
+ }
51
+ async hasAnyPermission(authUserId, requiredPermissions) {
52
+ const userPermissions = await this.getUserPermissions(authUserId);
53
+ return requiredPermissions.some((permission) => userPermissions.includes(permission));
54
+ }
55
+ async invalidateUserPermissionsCache(userId) {
56
+ const key = `${this.CACHE_PREFIX}${userId}`;
57
+ await this.redisService.del(key);
58
+ }
59
+ async invalidateAllUserPermissionsCache() {
60
+ const pattern = `${this.CACHE_PREFIX}*`;
61
+ const keys = await this.redisService.keys(pattern);
62
+ if (keys.length > 0) {
63
+ await Promise.all(keys.map((key) => this.redisService.del(key)));
64
+ }
65
+ }
66
+ async getCachedPermissions(userId) {
67
+ const key = `${this.CACHE_PREFIX}${userId}`;
68
+ const cached = await this.redisService.get(key);
69
+ return cached ? JSON.parse(cached) : null;
70
+ }
71
+ async setCachedPermissions(userId, permissions, ttl = this.CACHE_TTL) {
72
+ const key = `${this.CACHE_PREFIX}${userId}`;
73
+ await this.redisService.set(key, JSON.stringify(permissions), ttl);
74
+ }
75
+ };
76
+ exports.PermissionService = PermissionService;
77
+ exports.PermissionService = PermissionService = __decorate([
78
+ (0, common_1.Injectable)(),
79
+ __param(0, (0, typeorm_1.InjectDataSource)()),
80
+ __metadata("design:paramtypes", [typeorm_2.DataSource,
81
+ redis_service_1.RedisService, Object])
82
+ ], PermissionService);
83
+ //# sourceMappingURL=permission.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permission.service.js","sourceRoot":"","sources":["../../../src/core/services/permission.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { OnModuleInit, OnModuleDestroy } from "@nestjs/common";
2
+ export declare class RabbitMQPublisher implements OnModuleInit, OnModuleDestroy {
3
+ private readonly logger;
4
+ private channel;
5
+ private connection;
6
+ onModuleInit(): Promise<void>;
7
+ publish(routingKey: string, message: any): Promise<void>;
8
+ onModuleDestroy(): Promise<void>;
9
+ }
@@ -0,0 +1,57 @@
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 RabbitMQPublisher_1;
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.RabbitMQPublisher = void 0;
11
+ const common_1 = require("@nestjs/common");
12
+ const amqp = require("amqplib");
13
+ const rabbitmq_config_1 = require("@config/rabbitmq.config");
14
+ let RabbitMQPublisher = RabbitMQPublisher_1 = class RabbitMQPublisher {
15
+ constructor() {
16
+ this.logger = new common_1.Logger(RabbitMQPublisher_1.name);
17
+ }
18
+ async onModuleInit() {
19
+ try {
20
+ this.connection = await amqp.connect(rabbitmq_config_1.rabbitmqConfig.url);
21
+ this.channel = await this.connection.createChannel();
22
+ await this.channel.assertExchange(rabbitmq_config_1.rabbitmqConfig.eventsExchange, "topic", {
23
+ durable: true,
24
+ });
25
+ this.logger.log("✅ RabbitMQ Publisher connected successfully");
26
+ }
27
+ catch (error) {
28
+ this.logger.error("❌ Failed to connect to RabbitMQ:", error);
29
+ }
30
+ }
31
+ async publish(routingKey, message) {
32
+ try {
33
+ const formattedMessage = {
34
+ pattern: routingKey,
35
+ data: message,
36
+ };
37
+ this.channel.publish(rabbitmq_config_1.rabbitmqConfig.eventsExchange, routingKey, Buffer.from(JSON.stringify(formattedMessage)), { persistent: true });
38
+ this.logger.log(`📤 Published event: ${routingKey}`);
39
+ }
40
+ catch (error) {
41
+ this.logger.error(`❌ Failed to publish event ${routingKey}:`, error);
42
+ }
43
+ }
44
+ async onModuleDestroy() {
45
+ if (this.channel) {
46
+ await this.channel.close();
47
+ }
48
+ if (this.connection) {
49
+ await this.connection.close();
50
+ }
51
+ }
52
+ };
53
+ exports.RabbitMQPublisher = RabbitMQPublisher;
54
+ exports.RabbitMQPublisher = RabbitMQPublisher = RabbitMQPublisher_1 = __decorate([
55
+ (0, common_1.Injectable)()
56
+ ], RabbitMQPublisher);
57
+ //# sourceMappingURL=rabbitmq-publisher.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rabbitmq-publisher.service.js","sourceRoot":"","sources":["../../../src/core/services/rabbitmq-publisher.service.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAKwB;AACxB,gCAAgC;AAChC,6DAAyD;AAGlD,IAAM,iBAAiB,yBAAvB,MAAM,iBAAiB;IAAvB;QACY,WAAM,GAAG,IAAI,eAAM,CAAC,mBAAiB,CAAC,IAAI,CAAC,CAAC;IAoD/D,CAAC;IAhDC,KAAK,CAAC,YAAY;QAChB,IAAI,CAAC;YACH,IAAI,CAAC,UAAU,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,gCAAc,CAAC,GAAG,CAAC,CAAC;YACzD,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC;YAGrD,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,CAC/B,gCAAc,CAAC,cAAc,EAC7B,OAAO,EACP;gBACE,OAAO,EAAE,IAAI;aACd,CACF,CAAC;YAEF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,UAAkB,EAAE,OAAY;QAC5C,IAAI,CAAC;YAEH,MAAM,gBAAgB,GAAG;gBACvB,OAAO,EAAE,UAAU;gBACnB,IAAI,EAAE,OAAO;aACd,CAAC;YAEF,IAAI,CAAC,OAAO,CAAC,OAAO,CAClB,gCAAc,CAAC,cAAc,EAC7B,UAAU,EACV,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,EAC7C,EAAE,UAAU,EAAE,IAAI,EAAE,CACrB,CAAC;YACF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,uBAAuB,UAAU,EAAE,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA6B,UAAU,GAAG,EAAE,KAAK,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC7B,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QAChC,CAAC;IACH,CAAC;CACF,CAAA;AArDY,8CAAiB;4BAAjB,iBAAiB;IAD7B,IAAA,mBAAU,GAAE;GACA,iBAAiB,CAqD7B"}
@@ -0,0 +1,18 @@
1
+ import { OnModuleInit, OnModuleDestroy } from "@nestjs/common";
2
+ export declare class RedisService implements OnModuleInit, OnModuleDestroy {
3
+ private redis;
4
+ onModuleInit(): Promise<void>;
5
+ onModuleDestroy(): Promise<void>;
6
+ get(key: string): Promise<string | null>;
7
+ set(key: string, value: string, ttl?: number): Promise<void>;
8
+ setWithOptions(key: string, value: string, ...options: any[]): Promise<void>;
9
+ del(key: string): Promise<number>;
10
+ exists(key: string): Promise<number>;
11
+ expire(key: string, ttl: number): Promise<number>;
12
+ keys(pattern: string): Promise<string[]>;
13
+ flushall(): Promise<string>;
14
+ sadd(key: string, ...members: (string | number)[]): Promise<number>;
15
+ smembers(key: string): Promise<string[]>;
16
+ srem(key: string, ...members: (string | number)[]): Promise<number>;
17
+ pipeline(): import("ioredis").ChainableCommander;
18
+ }
@@ -0,0 +1,66 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.RedisService = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const ioredis_1 = require("ioredis");
12
+ const redis_config_1 = require("@config/redis.config");
13
+ let RedisService = class RedisService {
14
+ async onModuleInit() {
15
+ this.redis = new ioredis_1.default(redis_config_1.redisConfig);
16
+ }
17
+ async onModuleDestroy() {
18
+ await this.redis.quit();
19
+ }
20
+ async get(key) {
21
+ return this.redis.get(key);
22
+ }
23
+ async set(key, value, ttl) {
24
+ if (ttl) {
25
+ await this.redis.setex(key, ttl, value);
26
+ }
27
+ else {
28
+ await this.redis.set(key, value);
29
+ }
30
+ }
31
+ async setWithOptions(key, value, ...options) {
32
+ await this.redis.set(key, value, ...options);
33
+ }
34
+ async del(key) {
35
+ return this.redis.del(key);
36
+ }
37
+ async exists(key) {
38
+ return this.redis.exists(key);
39
+ }
40
+ async expire(key, ttl) {
41
+ return this.redis.expire(key, ttl);
42
+ }
43
+ async keys(pattern) {
44
+ return this.redis.keys(pattern);
45
+ }
46
+ async flushall() {
47
+ return this.redis.flushall();
48
+ }
49
+ async sadd(key, ...members) {
50
+ return this.redis.sadd(key, ...members);
51
+ }
52
+ async smembers(key) {
53
+ return this.redis.smembers(key);
54
+ }
55
+ async srem(key, ...members) {
56
+ return this.redis.srem(key, ...members);
57
+ }
58
+ pipeline() {
59
+ return this.redis.pipeline();
60
+ }
61
+ };
62
+ exports.RedisService = RedisService;
63
+ exports.RedisService = RedisService = __decorate([
64
+ (0, common_1.Injectable)()
65
+ ], RedisService);
66
+ //# sourceMappingURL=redis.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis.service.js","sourceRoot":"","sources":["../../../src/core/services/redis.service.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA2E;AAC3E,qCAA4B;AAC5B,uDAAmD;AAG5C,IAAM,YAAY,GAAlB,MAAM,YAAY;IAGvB,KAAK,CAAC,YAAY;QAChB,IAAI,CAAC,KAAK,GAAG,IAAI,iBAAK,CAAC,0BAAW,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAa,EAAE,GAAY;QAChD,IAAI,GAAG,EAAE,CAAC;YACR,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QAC1C,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,cAAc,CAClB,GAAW,EACX,KAAa,EACb,GAAG,OAAc;QAEjB,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW,EAAE,GAAW;QACnC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAe;QACxB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC/B,CAAC;IAGD,KAAK,CAAC,IAAI,CAAC,GAAW,EAAE,GAAG,OAA4B;QACrD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,GAAW;QACxB,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAW,EAAE,GAAG,OAA4B;QACrD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC;IAC1C,CAAC;IAGD,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC/B,CAAC;CACF,CAAA;AApEY,oCAAY;uBAAZ,YAAY;IADxB,IAAA,mBAAU,GAAE;GACA,YAAY,CAoExB"}
@@ -0,0 +1,18 @@
1
+ import { CurrentUserDto } from "@core/services/session.service";
2
+ export interface RequestContext {
3
+ user?: CurrentUserDto;
4
+ requestId?: string;
5
+ ipAddress?: string;
6
+ userAgent?: string;
7
+ }
8
+ export declare class RequestContextService {
9
+ private static asyncLocalStorage;
10
+ static run<T>(context: RequestContext, callback: () => T): T;
11
+ static getCurrentContext(): RequestContext | undefined;
12
+ static getCurrentUser(): CurrentUserDto | undefined;
13
+ static getCurrentUserId(): number | undefined;
14
+ static getCurrentRequestInfo(): {
15
+ ipAddress?: string;
16
+ userAgent?: string;
17
+ };
18
+ }
@@ -0,0 +1,40 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.RequestContextService = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const async_hooks_1 = require("async_hooks");
12
+ let RequestContextService = class RequestContextService {
13
+ static run(context, callback) {
14
+ return this.asyncLocalStorage.run(context, callback);
15
+ }
16
+ static getCurrentContext() {
17
+ return this.asyncLocalStorage.getStore();
18
+ }
19
+ static getCurrentUser() {
20
+ const context = this.getCurrentContext();
21
+ return context?.user;
22
+ }
23
+ static getCurrentUserId() {
24
+ const user = this.getCurrentUser();
25
+ return user?.userId || undefined;
26
+ }
27
+ static getCurrentRequestInfo() {
28
+ const context = this.getCurrentContext();
29
+ return {
30
+ ipAddress: context?.ipAddress,
31
+ userAgent: context?.userAgent,
32
+ };
33
+ }
34
+ };
35
+ exports.RequestContextService = RequestContextService;
36
+ RequestContextService.asyncLocalStorage = new async_hooks_1.AsyncLocalStorage();
37
+ exports.RequestContextService = RequestContextService = __decorate([
38
+ (0, common_1.Injectable)()
39
+ ], RequestContextService);
40
+ //# sourceMappingURL=request-context.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-context.service.js","sourceRoot":"","sources":["../../../src/core/services/request-context.service.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA4C;AAC5C,6CAAgD;AAWzC,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;IAGhC,MAAM,CAAC,GAAG,CAAI,OAAuB,EAAE,QAAiB;QACtD,OAAO,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,CAAC,iBAAiB;QACtB,OAAO,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,CAAC;IAC3C,CAAC;IAED,MAAM,CAAC,cAAc;QACnB,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzC,OAAO,OAAO,EAAE,IAAI,CAAC;IACvB,CAAC;IAED,MAAM,CAAC,gBAAgB;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACnC,OAAO,IAAI,EAAE,MAAM,IAAI,SAAS,CAAC;IACnC,CAAC;IAED,MAAM,CAAC,qBAAqB;QAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzC,OAAO;YACL,SAAS,EAAE,OAAO,EAAE,SAAS;YAC7B,SAAS,EAAE,OAAO,EAAE,SAAS;SAC9B,CAAC;IACJ,CAAC;;AA3BU,sDAAqB;AACjB,uCAAiB,GAAG,IAAI,+BAAiB,EAAkB,AAA1C,CAA2C;gCADhE,qBAAqB;IADjC,IAAA,mBAAU,GAAE;GACA,qBAAqB,CA4BjC"}
@@ -0,0 +1,8 @@
1
+ import { Request } from "express";
2
+ export declare class RequestInfoService {
3
+ getRequestInfo(request: Request): {
4
+ ipAddress: string;
5
+ userAgent: string;
6
+ };
7
+ private getClientIP;
8
+ }
@@ -0,0 +1,32 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.RequestInfoService = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ let RequestInfoService = class RequestInfoService {
12
+ getRequestInfo(request) {
13
+ return {
14
+ ipAddress: this.getClientIP(request),
15
+ userAgent: request.headers["user-agent"] || "Unknown",
16
+ };
17
+ }
18
+ getClientIP(request) {
19
+ return (request.headers["x-forwarded-for"]?.toString().split(",")[0].trim() ||
20
+ request.headers["x-real-ip"]?.toString() ||
21
+ request.headers["cf-connecting-ip"]?.toString() ||
22
+ request.connection?.remoteAddress ||
23
+ request.socket?.remoteAddress ||
24
+ request.ip ||
25
+ "127.0.0.1");
26
+ }
27
+ };
28
+ exports.RequestInfoService = RequestInfoService;
29
+ exports.RequestInfoService = RequestInfoService = __decorate([
30
+ (0, common_1.Injectable)()
31
+ ], RequestInfoService);
32
+ //# sourceMappingURL=request-info.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-info.service.js","sourceRoot":"","sources":["../../../src/core/services/request-info.service.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA4C;AAIrC,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;IAC7B,cAAc,CAAC,OAAgB;QAC7B,OAAO;YACL,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;YACpC,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,SAAS;SACtD,CAAC;IACJ,CAAC;IAEO,WAAW,CAAC,OAAgB;QAClC,OAAO,CACL,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;YACnE,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE;YACxC,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,QAAQ,EAAE;YAC/C,OAAO,CAAC,UAAU,EAAE,aAAa;YACjC,OAAO,CAAC,MAAM,EAAE,aAAa;YAC7B,OAAO,CAAC,EAAE;YACV,WAAW,CACZ,CAAC;IACJ,CAAC;CACF,CAAA;AAnBY,gDAAkB;6BAAlB,kBAAkB;IAD9B,IAAA,mBAAU,GAAE;GACA,kBAAkB,CAmB9B"}
@@ -0,0 +1,21 @@
1
+ import { RedisService } from "./redis.service";
2
+ export interface CurrentUserDto {
3
+ userUuid: string;
4
+ userId: number;
5
+ email: string;
6
+ fullName: string;
7
+ employeeCode: string;
8
+ avatar: string;
9
+ dataScope: string;
10
+ orgUnitIds: number[];
11
+ permissions: string[];
12
+ }
13
+ export declare class SessionService {
14
+ private readonly redisService;
15
+ constructor(redisService: RedisService);
16
+ createSession(data: CurrentUserDto, ttlSec: number): Promise<`${string}-${string}-${string}-${string}-${string}`>;
17
+ getSession(sid: string): Promise<CurrentUserDto | null>;
18
+ extendSession(sid: string, ttlSec: number): Promise<boolean>;
19
+ deleteSession(sid: string): Promise<number>;
20
+ revokeAllForUser(userId: number | string): Promise<boolean>;
21
+ }