@fabx.vn/core 1.0.7 → 1.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/services/jwt.service.d.ts +1 -9
- package/dist/core/services/jwt.service.js +4 -50
- package/dist/core/services/jwt.service.js.map +1 -1
- package/dist/core/services/session.service.d.ts +1 -1
- package/dist/core/subscribers/audit.subscriber.js +25 -11
- package/dist/core/subscribers/audit.subscriber.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import { JwtService } from "@nestjs/jwt";
|
|
2
2
|
import { SessionService, CurrentUserDto } from "../services/session.service";
|
|
3
3
|
export interface JwtTokenData {
|
|
4
|
-
sub: string
|
|
5
|
-
sessionId?: string;
|
|
6
|
-
email?: string;
|
|
4
|
+
sub: string;
|
|
7
5
|
}
|
|
8
6
|
export interface JwtValidationResult {
|
|
9
7
|
isValid: boolean;
|
|
@@ -16,23 +14,17 @@ export declare class CoreJwtService {
|
|
|
16
14
|
private readonly logger;
|
|
17
15
|
constructor(jwtService: JwtService, sessionService: SessionService);
|
|
18
16
|
createAccessToken(sessionData: CurrentUserDto): Promise<string>;
|
|
19
|
-
createSimpleAccessToken(userId: string | number, email: string): string;
|
|
20
17
|
decodeToken(token: string): JwtTokenData | null;
|
|
21
18
|
verifyToken(token: string): JwtTokenData | null;
|
|
22
19
|
validateTokenSignature(token: string): JwtValidationResult;
|
|
23
20
|
isTokenSignatureValid(token: string): boolean;
|
|
24
|
-
getUserIdFromToken(token: string): string | number | null;
|
|
25
21
|
getSessionIdFromToken(token: string): string | null;
|
|
26
22
|
deleteSessionFromToken(token: string): Promise<boolean>;
|
|
27
|
-
extractTokenFromHeader(request: any): string | null;
|
|
28
23
|
getTokenExpirationTime(token: string): number | null;
|
|
29
24
|
isTokenExpired(token: string): boolean;
|
|
30
|
-
createTokenPayload(userId: string | number, sessionId?: string, email?: string): JwtTokenData;
|
|
31
|
-
signToken(payload: JwtTokenData): string;
|
|
32
25
|
createInternalToken(service: string): string;
|
|
33
26
|
verifyInternalToken(token: string): {
|
|
34
27
|
service: string;
|
|
35
28
|
} | null;
|
|
36
29
|
getCurrentUser(accessToken: string): Promise<CurrentUserDto | null>;
|
|
37
|
-
getEmailFromToken(token: string): string | null;
|
|
38
30
|
}
|
|
@@ -27,18 +27,7 @@ let CoreJwtService = CoreJwtService_1 = class CoreJwtService {
|
|
|
27
27
|
async createAccessToken(sessionData) {
|
|
28
28
|
const ttlSec = date_utils_1.DateUtils.parseExpirationTime(jwt_config_1.jwtConfig.expiresIn);
|
|
29
29
|
const sessionId = await this.sessionService.createSession(sessionData, ttlSec);
|
|
30
|
-
const payload = {
|
|
31
|
-
sub: sessionData.userId,
|
|
32
|
-
sessionId: sessionId,
|
|
33
|
-
email: sessionData.email,
|
|
34
|
-
};
|
|
35
|
-
return this.jwtService.sign(payload);
|
|
36
|
-
}
|
|
37
|
-
createSimpleAccessToken(userId, email) {
|
|
38
|
-
const payload = {
|
|
39
|
-
sub: userId,
|
|
40
|
-
email: email,
|
|
41
|
-
};
|
|
30
|
+
const payload = { sub: sessionId };
|
|
42
31
|
return this.jwtService.sign(payload);
|
|
43
32
|
}
|
|
44
33
|
decodeToken(token) {
|
|
@@ -84,13 +73,9 @@ let CoreJwtService = CoreJwtService_1 = class CoreJwtService {
|
|
|
84
73
|
const result = this.validateTokenSignature(token);
|
|
85
74
|
return result.isValid;
|
|
86
75
|
}
|
|
87
|
-
getUserIdFromToken(token) {
|
|
88
|
-
const payload = this.decodeToken(token);
|
|
89
|
-
return payload?.sub || null;
|
|
90
|
-
}
|
|
91
76
|
getSessionIdFromToken(token) {
|
|
92
77
|
const payload = this.decodeToken(token);
|
|
93
|
-
return payload?.
|
|
78
|
+
return payload?.sub || null;
|
|
94
79
|
}
|
|
95
80
|
async deleteSessionFromToken(token) {
|
|
96
81
|
const sessionId = this.getSessionIdFromToken(token);
|
|
@@ -100,18 +85,6 @@ let CoreJwtService = CoreJwtService_1 = class CoreJwtService {
|
|
|
100
85
|
}
|
|
101
86
|
return false;
|
|
102
87
|
}
|
|
103
|
-
extractTokenFromHeader(request) {
|
|
104
|
-
try {
|
|
105
|
-
const authHeader = request.headers?.authorization;
|
|
106
|
-
if (!authHeader || !authHeader.startsWith("Bearer ")) {
|
|
107
|
-
return null;
|
|
108
|
-
}
|
|
109
|
-
return authHeader.substring(7);
|
|
110
|
-
}
|
|
111
|
-
catch (error) {
|
|
112
|
-
return null;
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
88
|
getTokenExpirationTime(token) {
|
|
116
89
|
try {
|
|
117
90
|
const payload = this.decodeToken(token);
|
|
@@ -131,21 +104,6 @@ let CoreJwtService = CoreJwtService_1 = class CoreJwtService {
|
|
|
131
104
|
const expirationTime = this.getTokenExpirationTime(token);
|
|
132
105
|
return expirationTime === null || expirationTime <= 0;
|
|
133
106
|
}
|
|
134
|
-
createTokenPayload(userId, sessionId, email) {
|
|
135
|
-
const payload = {
|
|
136
|
-
sub: userId,
|
|
137
|
-
};
|
|
138
|
-
if (sessionId) {
|
|
139
|
-
payload.sessionId = sessionId;
|
|
140
|
-
}
|
|
141
|
-
if (email) {
|
|
142
|
-
payload.email = email;
|
|
143
|
-
}
|
|
144
|
-
return payload;
|
|
145
|
-
}
|
|
146
|
-
signToken(payload) {
|
|
147
|
-
return this.jwtService.sign(payload);
|
|
148
|
-
}
|
|
149
107
|
createInternalToken(service) {
|
|
150
108
|
return this.jwtService.sign({ service }, {
|
|
151
109
|
secret: internal_config_1.internalConfig.internalSecret,
|
|
@@ -167,9 +125,9 @@ let CoreJwtService = CoreJwtService_1 = class CoreJwtService {
|
|
|
167
125
|
try {
|
|
168
126
|
const payload = this.decodeToken(accessToken);
|
|
169
127
|
this.logger.log(`Payload: ${JSON.stringify(payload)}`);
|
|
170
|
-
if (!payload?.
|
|
128
|
+
if (!payload?.sub)
|
|
171
129
|
return null;
|
|
172
|
-
const sessionData = await this.sessionService.getSession(payload.
|
|
130
|
+
const sessionData = await this.sessionService.getSession(payload.sub);
|
|
173
131
|
this.logger.log(`Session data: ${JSON.stringify(sessionData)}`);
|
|
174
132
|
return sessionData;
|
|
175
133
|
}
|
|
@@ -177,10 +135,6 @@ let CoreJwtService = CoreJwtService_1 = class CoreJwtService {
|
|
|
177
135
|
return null;
|
|
178
136
|
}
|
|
179
137
|
}
|
|
180
|
-
getEmailFromToken(token) {
|
|
181
|
-
const payload = this.decodeToken(token);
|
|
182
|
-
return payload?.email || null;
|
|
183
|
-
}
|
|
184
138
|
};
|
|
185
139
|
exports.CoreJwtService = CoreJwtService;
|
|
186
140
|
exports.CoreJwtService = CoreJwtService = CoreJwtService_1 = __decorate([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jwt.service.js","sourceRoot":"","sources":["../../../src/core/services/jwt.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAAoD;AACpD,qCAAyC;AACzC,oEAAgF;AAChF,kDAA8C;AAC9C,mDAA+C;AAC/C,6DAAyD;AACzD,sEAAyD;
|
|
1
|
+
{"version":3,"file":"jwt.service.js","sourceRoot":"","sources":["../../../src/core/services/jwt.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,12 +2,12 @@ import { RedisService } from "../services/redis.service";
|
|
|
2
2
|
export interface CurrentUserDto {
|
|
3
3
|
userUuid: string;
|
|
4
4
|
userId: number;
|
|
5
|
+
orgUnitId: number;
|
|
5
6
|
email: string;
|
|
6
7
|
fullName: string;
|
|
7
8
|
employeeCode: string;
|
|
8
9
|
avatar: string;
|
|
9
10
|
dataScope: string;
|
|
10
|
-
orgUnitIds: number[];
|
|
11
11
|
permissions: string[];
|
|
12
12
|
}
|
|
13
13
|
export declare class SessionService {
|
|
@@ -18,11 +18,26 @@ let AuditSubscriber = class AuditSubscriber {
|
|
|
18
18
|
this.dataSource = dataSource;
|
|
19
19
|
this.dataSource.subscribers.push(this);
|
|
20
20
|
}
|
|
21
|
-
safeSetProperty(entity, property, value) {
|
|
21
|
+
safeSetProperty(entity, property, value, metadata) {
|
|
22
22
|
if (!entity)
|
|
23
23
|
return;
|
|
24
24
|
try {
|
|
25
|
-
|
|
25
|
+
let entityMetadata = metadata;
|
|
26
|
+
if (!entityMetadata && entity.constructor) {
|
|
27
|
+
entityMetadata = this.dataSource.entityMetadatas.find((meta) => meta.target === entity.constructor);
|
|
28
|
+
}
|
|
29
|
+
if (entityMetadata) {
|
|
30
|
+
const hasProperty = entityMetadata.columns.some((column) => column.propertyName === property);
|
|
31
|
+
if (hasProperty) {
|
|
32
|
+
entity[property] = value;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
if (property in entity ||
|
|
37
|
+
Object.prototype.hasOwnProperty.call(entity, property)) {
|
|
38
|
+
entity[property] = value;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
26
41
|
}
|
|
27
42
|
catch (error) {
|
|
28
43
|
}
|
|
@@ -32,11 +47,10 @@ let AuditSubscriber = class AuditSubscriber {
|
|
|
32
47
|
return;
|
|
33
48
|
const user = request_context_service_1.RequestContextService.getCurrentUser();
|
|
34
49
|
if (user?.userId) {
|
|
35
|
-
this.safeSetProperty(event.entity, "createdBy", user.userId);
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
this.safeSetProperty(event.entity, "orgUnitId", orgUnitId);
|
|
50
|
+
this.safeSetProperty(event.entity, "createdBy", user.userId, event.metadata);
|
|
51
|
+
if (user.orgUnitId) {
|
|
52
|
+
this.safeSetProperty(event.entity, "createdOrg", user.orgUnitId, event.metadata);
|
|
53
|
+
}
|
|
40
54
|
}
|
|
41
55
|
}
|
|
42
56
|
beforeUpdate(event) {
|
|
@@ -45,10 +59,10 @@ let AuditSubscriber = class AuditSubscriber {
|
|
|
45
59
|
const user = request_context_service_1.RequestContextService.getCurrentUser();
|
|
46
60
|
if (user?.userId) {
|
|
47
61
|
if (event.entity.deletedAt) {
|
|
48
|
-
this.safeSetProperty(event.entity, "deletedBy", user.userId);
|
|
62
|
+
this.safeSetProperty(event.entity, "deletedBy", user.userId, event.metadata);
|
|
49
63
|
}
|
|
50
64
|
else {
|
|
51
|
-
this.safeSetProperty(event.entity, "updatedBy", user.userId);
|
|
65
|
+
this.safeSetProperty(event.entity, "updatedBy", user.userId, event.metadata);
|
|
52
66
|
}
|
|
53
67
|
}
|
|
54
68
|
}
|
|
@@ -57,7 +71,7 @@ let AuditSubscriber = class AuditSubscriber {
|
|
|
57
71
|
return;
|
|
58
72
|
const user = request_context_service_1.RequestContextService.getCurrentUser();
|
|
59
73
|
if (user?.userId) {
|
|
60
|
-
this.safeSetProperty(event.entity, "deletedBy", user.userId);
|
|
74
|
+
this.safeSetProperty(event.entity, "deletedBy", user.userId, event.metadata);
|
|
61
75
|
}
|
|
62
76
|
}
|
|
63
77
|
beforeSoftRemove(event) {
|
|
@@ -65,7 +79,7 @@ let AuditSubscriber = class AuditSubscriber {
|
|
|
65
79
|
return;
|
|
66
80
|
const user = request_context_service_1.RequestContextService.getCurrentUser();
|
|
67
81
|
if (user?.userId) {
|
|
68
|
-
this.safeSetProperty(event.entity, "deletedBy", user.userId);
|
|
82
|
+
this.safeSetProperty(event.entity, "deletedBy", user.userId, event.metadata);
|
|
69
83
|
}
|
|
70
84
|
}
|
|
71
85
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.subscriber.js","sourceRoot":"","sources":["../../../src/core/subscribers/audit.subscriber.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qCAQiB;AACjB,2CAA4C;AAC5C,oFAA+E;AAIxE,IAAM,eAAe,GAArB,MAAM,eAAe;IAC1B,YAAoB,UAAsB;QAAtB,eAAU,GAAV,UAAU,CAAY;QACxC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;
|
|
1
|
+
{"version":3,"file":"audit.subscriber.js","sourceRoot":"","sources":["../../../src/core/subscribers/audit.subscriber.ts"],"names":[],"mappings":"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"}
|