@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("./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/services/jwt.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/services/rabbitmq-publisher.service.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAKwB;AACxB,gCAAgC;AAChC,+DAA2D;AAGpD,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/services/redis.service.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA2E;AAC3E,qCAA4B;AAC5B,yDAAqD;AAG9C,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 "./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/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/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
+ }
@@ -0,0 +1,70 @@
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.SessionService = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const crypto_1 = require("crypto");
15
+ const redis_service_1 = require("./redis.service");
16
+ let SessionService = class SessionService {
17
+ constructor(redisService) {
18
+ this.redisService = redisService;
19
+ }
20
+ async createSession(data, ttlSec) {
21
+ const sid = (0, crypto_1.randomUUID)();
22
+ const key = `session:${sid}`;
23
+ await this.redisService.setWithOptions(key, JSON.stringify(data), "EX", ttlSec);
24
+ if (data.userId) {
25
+ await this.redisService.sadd(`user_sessions:${data.userId}`, sid);
26
+ await this.redisService.expire(`user_sessions:${data.userId}`, ttlSec);
27
+ }
28
+ return sid;
29
+ }
30
+ async getSession(sid) {
31
+ const key = `session:${sid}`;
32
+ const json = await this.redisService.get(key);
33
+ if (!json)
34
+ return null;
35
+ return JSON.parse(json);
36
+ }
37
+ async extendSession(sid, ttlSec) {
38
+ const key = `session:${sid}`;
39
+ const res = await this.redisService.expire(key, ttlSec);
40
+ return res === 1;
41
+ }
42
+ async deleteSession(sid) {
43
+ const key = `session:${sid}`;
44
+ const json = await this.redisService.get(key);
45
+ if (json) {
46
+ const data = JSON.parse(json);
47
+ if (data.userId) {
48
+ await this.redisService.srem(`user_sessions:${data.userId}`, sid);
49
+ }
50
+ }
51
+ return this.redisService.del(key);
52
+ }
53
+ async revokeAllForUser(userId) {
54
+ const setKey = `user_sessions:${userId}`;
55
+ const sids = await this.redisService.smembers(setKey);
56
+ if (sids.length) {
57
+ const pipeline = this.redisService.pipeline();
58
+ sids.forEach((sid) => pipeline.del(`session:${sid}`));
59
+ pipeline.del(setKey);
60
+ await pipeline.exec();
61
+ }
62
+ return true;
63
+ }
64
+ };
65
+ exports.SessionService = SessionService;
66
+ exports.SessionService = SessionService = __decorate([
67
+ (0, common_1.Injectable)(),
68
+ __metadata("design:paramtypes", [redis_service_1.RedisService])
69
+ ], SessionService);
70
+ //# sourceMappingURL=session.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.service.js","sourceRoot":"","sources":["../../src/services/session.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { CurrentUserDto } from "../services/session.service";
2
+ declare const JwtStrategy_base: new (...args: any[]) => any;
3
+ export declare class JwtStrategy extends JwtStrategy_base {
4
+ constructor();
5
+ validate(payload: any): Promise<CurrentUserDto>;
6
+ }
7
+ export {};
@@ -0,0 +1,38 @@
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.JwtStrategy = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const passport_1 = require("@nestjs/passport");
15
+ const passport_jwt_1 = require("passport-jwt");
16
+ const jwt_config_1 = require("../config/jwt.config");
17
+ const cookie_service_1 = require("../services/cookie.service");
18
+ let JwtStrategy = class JwtStrategy extends (0, passport_1.PassportStrategy)(passport_jwt_1.Strategy) {
19
+ constructor() {
20
+ super({
21
+ jwtFromRequest: passport_jwt_1.ExtractJwt.fromExtractors([
22
+ (req) => cookie_service_1.CookieService.extractTokensFromCookie(req)?.accessToken || null,
23
+ ]),
24
+ ignoreExpiration: false,
25
+ secretOrKey: jwt_config_1.jwtConfig.secret,
26
+ algorithms: ["HS256"],
27
+ });
28
+ }
29
+ async validate(payload) {
30
+ return payload;
31
+ }
32
+ };
33
+ exports.JwtStrategy = JwtStrategy;
34
+ exports.JwtStrategy = JwtStrategy = __decorate([
35
+ (0, common_1.Injectable)(),
36
+ __metadata("design:paramtypes", [])
37
+ ], JwtStrategy);
38
+ //# sourceMappingURL=jwt.strategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt.strategy.js","sourceRoot":"","sources":["../../src/strategies/jwt.strategy.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,+CAAoD;AACpD,+CAAoD;AACpD,qDAAiD;AAEjD,+DAA2D;AAIpD,IAAM,WAAW,GAAjB,MAAM,WAAY,SAAQ,IAAA,2BAAgB,EAAC,uBAAQ,CAAC;IACzD;QACE,KAAK,CAAC;YACJ,cAAc,EAAE,yBAAU,CAAC,cAAc,CAAC;gBACxC,CAAC,GAAY,EAAE,EAAE,CACf,8BAAa,CAAC,uBAAuB,CAAC,GAAG,CAAC,EAAE,WAAW,IAAI,IAAI;aAClE,CAAC;YACF,gBAAgB,EAAE,KAAK;YACvB,WAAW,EAAE,sBAAS,CAAC,MAAM;YAC7B,UAAU,EAAE,CAAC,OAAO,CAAC;SACtB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAY;QACzB,OAAO,OAAyB,CAAC;IACnC,CAAC;CACF,CAAA;AAhBY,kCAAW;sBAAX,WAAW;IADvB,IAAA,mBAAU,GAAE;;GACA,WAAW,CAgBvB"}
@@ -0,0 +1,8 @@
1
+ import { DataSource, EntitySubscriberInterface, InsertEvent, UpdateEvent } from "typeorm";
2
+ export declare class AuditSubscriber implements EntitySubscriberInterface {
3
+ private dataSource;
4
+ constructor(dataSource: DataSource);
5
+ private enrichEntity;
6
+ beforeInsert(event: InsertEvent<any>): void;
7
+ beforeUpdate(event: UpdateEvent<any>): void;
8
+ }