@tomei/sso 0.58.0 → 0.58.3
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/.commitlintrc.json +22 -22
- package/.gitlab-ci.yml +16 -16
- package/.husky/commit-msg +15 -15
- package/.husky/pre-commit +7 -7
- package/.prettierrc +4 -4
- package/Jenkinsfile +57 -57
- package/README.md +23 -23
- package/__tests__/unit/components/group/group.spec.ts +79 -79
- package/__tests__/unit/components/group-object-privilege/group-object-privilege.spec.ts +88 -88
- package/__tests__/unit/components/group-privilege/group-privilege.spec.ts +68 -68
- package/__tests__/unit/components/group-reporting-user/group-reporting-user.spec.ts +66 -66
- package/__tests__/unit/components/group-system-access/group-system-access.spec.ts +83 -83
- package/__tests__/unit/components/login-user/l.spec.ts +746 -746
- package/__tests__/unit/components/login-user/login.spec.ts +1164 -1164
- package/__tests__/unit/components/password-hash/password-hash.service.spec.ts +31 -31
- package/__tests__/unit/components/system/system.spec.ts +254 -254
- package/__tests__/unit/components/system-privilege/system-privilege.spec.ts +83 -83
- package/__tests__/unit/components/user-group/user-group.spec.ts +86 -86
- package/__tests__/unit/components/user-object-privilege/user-object-privilege.spec.ts +78 -78
- package/__tests__/unit/components/user-privilege/user-privilege.spec.ts +72 -72
- package/__tests__/unit/components/user-system-access/user-system-access.spec.ts +89 -89
- package/__tests__/unit/redis-client/redis.service.spec.ts +23 -23
- package/__tests__/unit/session/session.service.spec.ts +47 -47
- package/__tests__/unit/system-privilege/system-privilage.spec.ts +91 -91
- package/coverage/clover.xml +1452 -1452
- package/coverage/coverage-final.json +47 -47
- package/coverage/lcov-report/base.css +224 -224
- package/coverage/lcov-report/block-navigation.js +87 -87
- package/coverage/lcov-report/components/group/group.repository.ts.html +117 -117
- package/coverage/lcov-report/components/group/group.ts.html +327 -327
- package/coverage/lcov-report/components/group/index.html +130 -130
- package/coverage/lcov-report/components/group-object-privilege/group-object-privilege.repository.ts.html +117 -117
- package/coverage/lcov-report/components/group-object-privilege/group-object-privilege.ts.html +321 -321
- package/coverage/lcov-report/components/group-object-privilege/index.html +130 -130
- package/coverage/lcov-report/components/group-privilege/group-privilege.repository.ts.html +117 -117
- package/coverage/lcov-report/components/group-privilege/group-privilege.ts.html +303 -303
- package/coverage/lcov-report/components/group-privilege/index.html +130 -130
- package/coverage/lcov-report/components/group-reporting-user/group-reporting-user.repository.ts.html +117 -117
- package/coverage/lcov-report/components/group-reporting-user/group-reporting-user.ts.html +327 -327
- package/coverage/lcov-report/components/group-reporting-user/index.html +130 -130
- package/coverage/lcov-report/components/group-system-access/group-system-access.repository.ts.html +117 -117
- package/coverage/lcov-report/components/group-system-access/group-system-access.ts.html +309 -309
- package/coverage/lcov-report/components/group-system-access/index.html +130 -130
- package/coverage/lcov-report/components/login-history/index.html +115 -115
- package/coverage/lcov-report/components/login-history/login-history.repository.ts.html +117 -117
- package/coverage/lcov-report/components/login-user/index.html +130 -130
- package/coverage/lcov-report/components/login-user/login-user.ts.html +5007 -5007
- package/coverage/lcov-report/components/login-user/user.repository.ts.html +117 -117
- package/coverage/lcov-report/components/password-hash/index.html +115 -115
- package/coverage/lcov-report/components/password-hash/password-hash.service.ts.html +126 -126
- package/coverage/lcov-report/components/system/index.html +130 -130
- package/coverage/lcov-report/components/system/system.repository.ts.html +117 -117
- package/coverage/lcov-report/components/system/system.ts.html +909 -909
- package/coverage/lcov-report/components/system-privilege/index.html +130 -130
- package/coverage/lcov-report/components/system-privilege/system-privilege.repository.ts.html +120 -120
- package/coverage/lcov-report/components/system-privilege/system-privilege.ts.html +390 -390
- package/coverage/lcov-report/components/user-group/index.html +130 -130
- package/coverage/lcov-report/components/user-group/user-group.repository.ts.html +117 -117
- package/coverage/lcov-report/components/user-group/user-group.ts.html +354 -354
- package/coverage/lcov-report/components/user-object-privilege/index.html +130 -130
- package/coverage/lcov-report/components/user-object-privilege/user-object-privilege.repository.ts.html +117 -117
- package/coverage/lcov-report/components/user-object-privilege/user-object-privilege.ts.html +312 -312
- package/coverage/lcov-report/components/user-privilege/index.html +130 -130
- package/coverage/lcov-report/components/user-privilege/user-privilege.repository.ts.html +117 -117
- package/coverage/lcov-report/components/user-privilege/user-privilege.ts.html +306 -306
- package/coverage/lcov-report/components/user-system-access/index.html +130 -130
- package/coverage/lcov-report/components/user-system-access/user-system-access.repository.ts.html +117 -117
- package/coverage/lcov-report/components/user-system-access/user-system-access.ts.html +312 -312
- package/coverage/lcov-report/enum/group-type.enum.ts.html +108 -108
- package/coverage/lcov-report/enum/index.html +160 -160
- package/coverage/lcov-report/enum/index.ts.html +93 -93
- package/coverage/lcov-report/enum/user-status.enum.ts.html +105 -105
- package/coverage/lcov-report/enum/yn.enum.ts.html +96 -96
- package/coverage/lcov-report/index.html +370 -370
- package/coverage/lcov-report/models/group-object-privilege.entity.ts.html +333 -333
- package/coverage/lcov-report/models/group-privilege.entity.ts.html +315 -315
- package/coverage/lcov-report/models/group-reporting-user.entity.ts.html +339 -339
- package/coverage/lcov-report/models/group-system-access.entity.ts.html +324 -324
- package/coverage/lcov-report/models/group.entity.ts.html +435 -435
- package/coverage/lcov-report/models/index.html +310 -310
- package/coverage/lcov-report/models/login-history.entity.ts.html +252 -252
- package/coverage/lcov-report/models/staff.entity.ts.html +411 -411
- package/coverage/lcov-report/models/system-privilege.entity.ts.html +354 -354
- package/coverage/lcov-report/models/system.entity.ts.html +423 -423
- package/coverage/lcov-report/models/user-group.entity.ts.html +354 -354
- package/coverage/lcov-report/models/user-object-privilege.entity.ts.html +330 -330
- package/coverage/lcov-report/models/user-privilege.entity.ts.html +315 -315
- package/coverage/lcov-report/models/user-system-access.entity.ts.html +315 -315
- package/coverage/lcov-report/models/user.entity.ts.html +522 -522
- package/coverage/lcov-report/prettify.css +1 -1
- package/coverage/lcov-report/prettify.js +2 -2
- package/coverage/lcov-report/redis-client/index.html +115 -115
- package/coverage/lcov-report/redis-client/redis.service.ts.html +240 -240
- package/coverage/lcov-report/session/index.html +115 -115
- package/coverage/lcov-report/session/session.service.ts.html +246 -246
- package/coverage/lcov-report/sorter.js +196 -196
- package/coverage/lcov.info +2490 -2490
- package/coverage/test-report.xml +128 -128
- package/create-sso-user.sql +39 -39
- package/dist/src/components/login-user/login-user.js +60 -0
- package/dist/src/components/login-user/login-user.js.map +1 -1
- package/dist/src/components/login-user/user.d.ts +2 -0
- package/dist/src/components/login-user/user.js +91 -12
- package/dist/src/components/login-user/user.js.map +1 -1
- package/dist/src/components/user-reporting-hierarchy/user-reporting-hierarchy.js +24 -20
- package/dist/src/components/user-reporting-hierarchy/user-reporting-hierarchy.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/eslint.config.mjs +58 -58
- package/jest.config.js +14 -14
- package/migrations/20240314080602-create-user-table.js +124 -124
- package/migrations/20240314080603-create-user-group-table.js +85 -85
- package/migrations/20240314080604-create-user-user-group-table.js +55 -55
- package/migrations/20240314080605-create-login-history-table.js +53 -53
- package/migrations/20240527064925-create-system-table.js +78 -78
- package/migrations/20240527064926-create-system-privilege-table.js +71 -71
- package/migrations/20240527065342-create-group-table.js +93 -93
- package/migrations/20240527065633-create-group-reporting-user-table.js +76 -76
- package/migrations/20240528011551-create-group-system-access-table.js +72 -72
- package/migrations/20240528023018-user-system-access-table.js +75 -75
- package/migrations/20240528032229-user-privilege-table.js +76 -76
- package/migrations/20240528063003-create-group-privilege-table.js +76 -76
- package/migrations/20240528063051-create-group-object-privilege-table.js +84 -84
- package/migrations/20240528063107-create-user-object-privilege-table.js +84 -84
- package/migrations/20240528063108-create-api-key-table.js +85 -85
- package/migrations/20241104104802-create-building-table.js +95 -95
- package/migrations/20250108091132-add-area-manager-user-id-to-building-table.js +14 -14
- package/migrations/20250108091133-add-passcode-to-user-table.js +36 -36
- package/migrations/20250210115636-create-user-reporting-hierarchy.js +76 -76
- package/package.json +90 -90
- package/sampledotenv +7 -7
- package/sonar-project.properties +22 -22
- package/src/components/login-user/login-user.ts +63 -0
- package/src/components/login-user/user.ts +141 -30
- package/src/components/user-reporting-hierarchy/user-reporting-hierarchy.ts +37 -32
- package/tsconfig.build.json +5 -5
- package/tsconfig.json +23 -23
- package/dist/__tests__/unit/components/group-privilege/group-privilege.test.d.ts +0 -1
- package/dist/__tests__/unit/components/group-privilege/group-privilege.test.js +0 -71
- package/dist/__tests__/unit/components/group-privilege/group-privilege.test.js.map +0 -1
- package/dist/__tests__/unit/components/login-user/login-user.spec.d.ts +0 -0
- package/dist/__tests__/unit/components/login-user/login-user.spec.js +0 -6
- package/dist/__tests__/unit/components/login-user/login-user.spec.js.map +0 -1
package/sonar-project.properties
CHANGED
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
sonar.projectKey=all-tomei-projects_sso
|
|
2
|
-
sonar.organization=all-tomei-projects
|
|
3
|
-
sonar.exclusions=**/*.js,test-data,dist,coverage, node_modules, __tests__, **/*.spec.ts, __mocks__
|
|
4
|
-
sonar.scm.provider=git
|
|
5
|
-
|
|
6
|
-
sonar.sources=src
|
|
7
|
-
sonar.test=__tests__
|
|
8
|
-
sonar.test.inclusions=src/**/*.spec.ts
|
|
9
|
-
|
|
10
|
-
sonar.javascript.lcov.reportPaths=./coverage/lcov.info
|
|
11
|
-
sonar.testExecutionReportPaths=coverage/test-report.xml
|
|
12
|
-
sonar.sourceEnconding=UTF-8
|
|
13
|
-
|
|
14
|
-
# This is the name and version displayed in the SonarCloud UI.
|
|
15
|
-
#sonar.projectName=sso
|
|
16
|
-
#sonar.projectVersion=1.0
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
# Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows.
|
|
20
|
-
#sonar.sources=.
|
|
21
|
-
|
|
22
|
-
# Encoding of the source code. Default is default system encoding
|
|
1
|
+
sonar.projectKey=all-tomei-projects_sso
|
|
2
|
+
sonar.organization=all-tomei-projects
|
|
3
|
+
sonar.exclusions=**/*.js,test-data,dist,coverage, node_modules, __tests__, **/*.spec.ts, __mocks__
|
|
4
|
+
sonar.scm.provider=git
|
|
5
|
+
|
|
6
|
+
sonar.sources=src
|
|
7
|
+
sonar.test=__tests__
|
|
8
|
+
sonar.test.inclusions=src/**/*.spec.ts
|
|
9
|
+
|
|
10
|
+
sonar.javascript.lcov.reportPaths=./coverage/lcov.info
|
|
11
|
+
sonar.testExecutionReportPaths=coverage/test-report.xml
|
|
12
|
+
sonar.sourceEnconding=UTF-8
|
|
13
|
+
|
|
14
|
+
# This is the name and version displayed in the SonarCloud UI.
|
|
15
|
+
#sonar.projectName=sso
|
|
16
|
+
#sonar.projectVersion=1.0
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
# Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows.
|
|
20
|
+
#sonar.sources=.
|
|
21
|
+
|
|
22
|
+
# Encoding of the source code. Default is default system encoding
|
|
23
23
|
#sonar.sourceEncoding=UTF-8
|
|
@@ -9,6 +9,9 @@ import { IUserAttr, IUserInfo } from './interfaces/user-info.interface';
|
|
|
9
9
|
import Staff from '../../models/staff.entity';
|
|
10
10
|
import UserModel from '../../models/user.entity';
|
|
11
11
|
import { createHash, randomBytes } from 'crypto';
|
|
12
|
+
import { UserGroupRepository } from '../user-group/user-group.repository';
|
|
13
|
+
import GroupSystemAccessModel from '../../models/group-system-access.entity';
|
|
14
|
+
import SystemModel from '../../models/system.entity';
|
|
12
15
|
|
|
13
16
|
export class LoginUser extends User implements ILoginUser {
|
|
14
17
|
session = {
|
|
@@ -219,11 +222,71 @@ export class LoginUser extends User implements ILoginUser {
|
|
|
219
222
|
UpdatedById: systemAccess[i].UpdatedById,
|
|
220
223
|
CreatedAt: systemAccess[i].CreatedAt,
|
|
221
224
|
UpdatedAt: systemAccess[i].UpdatedAt,
|
|
225
|
+
inheritedBy: ['OWN'],
|
|
222
226
|
System: system,
|
|
223
227
|
});
|
|
224
228
|
}
|
|
225
229
|
}
|
|
226
230
|
|
|
231
|
+
let userGroupRepository = new UserGroupRepository();
|
|
232
|
+
const userGroups = await userGroupRepository.findAll({
|
|
233
|
+
where: {
|
|
234
|
+
UserId: loginUser.UserId,
|
|
235
|
+
Status: 'Active',
|
|
236
|
+
},
|
|
237
|
+
include: [
|
|
238
|
+
{
|
|
239
|
+
model: GroupModel,
|
|
240
|
+
required: true,
|
|
241
|
+
where: {
|
|
242
|
+
Status: 'Active',
|
|
243
|
+
},
|
|
244
|
+
include: [
|
|
245
|
+
{
|
|
246
|
+
model: GroupSystemAccessModel,
|
|
247
|
+
where: {
|
|
248
|
+
Status: 'Active',
|
|
249
|
+
},
|
|
250
|
+
include: [
|
|
251
|
+
{
|
|
252
|
+
model: SystemModel,
|
|
253
|
+
},
|
|
254
|
+
],
|
|
255
|
+
},
|
|
256
|
+
],
|
|
257
|
+
},
|
|
258
|
+
],
|
|
259
|
+
transaction: dbTransaction,
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
if (userGroups) {
|
|
263
|
+
for (let i = 0; i < userGroups.length; i++) {
|
|
264
|
+
let systemAccessList = userGroups[i].Group.GroupSystemAccesses;
|
|
265
|
+
for (let j = 0; j < systemAccessList.length; j++) {
|
|
266
|
+
let systemDetails = systemAccessList[j];
|
|
267
|
+
let isFound = output.findIndex(
|
|
268
|
+
(e) => e.SystemCode === systemDetails.SystemCode,
|
|
269
|
+
);
|
|
270
|
+
if (isFound > -1) {
|
|
271
|
+
output[isFound].inheritedBy.push(userGroups[i].GroupCode);
|
|
272
|
+
} else {
|
|
273
|
+
output.push({
|
|
274
|
+
UserSystemAccessId: systemDetails.GroupSystemAccessId,
|
|
275
|
+
UserId: systemDetails.GroupSystemAccessId,
|
|
276
|
+
SystemCode: systemDetails.SystemCode,
|
|
277
|
+
Status: systemDetails.Status,
|
|
278
|
+
CreatedById: systemDetails.CreatedById,
|
|
279
|
+
UpdatedById: systemDetails.UpdatedById,
|
|
280
|
+
CreatedAt: systemDetails.CreatedAt,
|
|
281
|
+
UpdatedAt: systemDetails.UpdatedAt,
|
|
282
|
+
inheritedBy: [userGroups[i].GroupCode],
|
|
283
|
+
System: systemDetails.System,
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
|
|
227
290
|
// Part 3: Map Result to System Object
|
|
228
291
|
return output;
|
|
229
292
|
}
|
|
@@ -2132,25 +2132,26 @@ export class User extends UserBase {
|
|
|
2132
2132
|
DepartmentCode?: string;
|
|
2133
2133
|
ContactNo?: string;
|
|
2134
2134
|
IdNo?: string;
|
|
2135
|
+
FullName?: string;
|
|
2135
2136
|
},
|
|
2136
2137
|
loginUser: User,
|
|
2137
2138
|
dbTransaction: any,
|
|
2138
2139
|
) {
|
|
2139
2140
|
//Part 1: Privilege Checking
|
|
2140
|
-
const systemCode = ApplicationConfig.getComponentConfigValue('system-code');
|
|
2141
|
-
const isPrivileged = await loginUser.checkPrivileges(
|
|
2142
|
-
|
|
2143
|
-
|
|
2144
|
-
);
|
|
2145
|
-
|
|
2146
|
-
//If user does not have privilege to update user, throw a ClassError
|
|
2147
|
-
if (!isPrivileged) {
|
|
2148
|
-
|
|
2149
|
-
|
|
2150
|
-
|
|
2151
|
-
|
|
2152
|
-
|
|
2153
|
-
}
|
|
2141
|
+
// const systemCode = ApplicationConfig.getComponentConfigValue('system-code');
|
|
2142
|
+
// const isPrivileged = await loginUser.checkPrivileges(
|
|
2143
|
+
// systemCode,
|
|
2144
|
+
// 'User - Update',
|
|
2145
|
+
// );
|
|
2146
|
+
|
|
2147
|
+
// //If user does not have privilege to update user, throw a ClassError
|
|
2148
|
+
// if (!isPrivileged) {
|
|
2149
|
+
// throw new ClassError(
|
|
2150
|
+
// 'LoginUser',
|
|
2151
|
+
// 'LoginUserErrMsg0X',
|
|
2152
|
+
// 'You do not have the privilege to update user',
|
|
2153
|
+
// );
|
|
2154
|
+
// }
|
|
2154
2155
|
|
|
2155
2156
|
//Part 2: Validation
|
|
2156
2157
|
//Make sure UserId got values. If not, throw new ClassError
|
|
@@ -2422,6 +2423,7 @@ export class User extends UserBase {
|
|
|
2422
2423
|
|
|
2423
2424
|
//Update user record
|
|
2424
2425
|
this.UserName = data.UserName;
|
|
2426
|
+
this.FullName = data.FullName;
|
|
2425
2427
|
this.Email = data.Email;
|
|
2426
2428
|
this.Status = data.Status;
|
|
2427
2429
|
this.RecoveryEmail = data.RecoveryEmail;
|
|
@@ -2434,6 +2436,7 @@ export class User extends UserBase {
|
|
|
2434
2436
|
await User._Repository.update(
|
|
2435
2437
|
{
|
|
2436
2438
|
UserName: this.UserName,
|
|
2439
|
+
FullName: this.FullName,
|
|
2437
2440
|
Email: this.Email,
|
|
2438
2441
|
Status: this.Status,
|
|
2439
2442
|
RecoveryEmail: this.RecoveryEmail,
|
|
@@ -2499,22 +2502,22 @@ export class User extends UserBase {
|
|
|
2499
2502
|
dbTransaction: any,
|
|
2500
2503
|
UserId: string,
|
|
2501
2504
|
) {
|
|
2502
|
-
const systemCode = ApplicationConfig.getComponentConfigValue('system-code');
|
|
2503
|
-
if ('loginUser' in AuthContext) {
|
|
2504
|
-
|
|
2505
|
-
|
|
2506
|
-
|
|
2507
|
-
|
|
2508
|
-
|
|
2509
|
-
|
|
2510
|
-
|
|
2511
|
-
|
|
2512
|
-
|
|
2513
|
-
|
|
2514
|
-
|
|
2515
|
-
|
|
2516
|
-
|
|
2517
|
-
}
|
|
2505
|
+
// const systemCode = ApplicationConfig.getComponentConfigValue('system-code');
|
|
2506
|
+
// if ('loginUser' in AuthContext) {
|
|
2507
|
+
// const isPrivileged = await AuthContext.loginUser.checkPrivileges(
|
|
2508
|
+
// systemCode,
|
|
2509
|
+
// 'USER_VIEW',
|
|
2510
|
+
// );
|
|
2511
|
+
|
|
2512
|
+
// //If user does not have privilege to update user, throw a ClassError
|
|
2513
|
+
// if (!isPrivileged) {
|
|
2514
|
+
// throw new ClassError(
|
|
2515
|
+
// 'LoginUser',
|
|
2516
|
+
// 'LoginUserErrMsg0X',
|
|
2517
|
+
// 'You do not have the privilege to find user',
|
|
2518
|
+
// );
|
|
2519
|
+
// }
|
|
2520
|
+
// }
|
|
2518
2521
|
|
|
2519
2522
|
const user = await User._Repository.findOne({
|
|
2520
2523
|
where: {
|
|
@@ -2800,6 +2803,114 @@ export class User extends UserBase {
|
|
|
2800
2803
|
}
|
|
2801
2804
|
}
|
|
2802
2805
|
|
|
2806
|
+
async updatePassword(
|
|
2807
|
+
loginUser: User,
|
|
2808
|
+
oldPassword: string,
|
|
2809
|
+
newPassword: string,
|
|
2810
|
+
dbTransaction: any,
|
|
2811
|
+
) {
|
|
2812
|
+
try {
|
|
2813
|
+
const passwordHashService = new PasswordHashService();
|
|
2814
|
+
const isPasswordValid = await passwordHashService.verify(
|
|
2815
|
+
oldPassword,
|
|
2816
|
+
this.Password,
|
|
2817
|
+
);
|
|
2818
|
+
if (!isPasswordValid) {
|
|
2819
|
+
throw new Error(
|
|
2820
|
+
'The old password you entered is incorrect. Please try again.',
|
|
2821
|
+
);
|
|
2822
|
+
}
|
|
2823
|
+
|
|
2824
|
+
const passwordHash = await passwordHashService.hashPassword(newPassword);
|
|
2825
|
+
|
|
2826
|
+
const entityValueBefore: IUserAttr = {
|
|
2827
|
+
UserId: this.UserId,
|
|
2828
|
+
UserName: this.UserName,
|
|
2829
|
+
FullName: this.FullName,
|
|
2830
|
+
IDNo: this.IDNo,
|
|
2831
|
+
IDType: this.IDType,
|
|
2832
|
+
ContactNo: this.ContactNo,
|
|
2833
|
+
Email: this.Email,
|
|
2834
|
+
Password: this.Password,
|
|
2835
|
+
Status: this.Status,
|
|
2836
|
+
DefaultPasswordChangedYN: this.DefaultPasswordChangedYN,
|
|
2837
|
+
FirstLoginAt: this.FirstLoginAt,
|
|
2838
|
+
LastLoginAt: this.LastLoginAt,
|
|
2839
|
+
MFAEnabled: this.MFAEnabled,
|
|
2840
|
+
MFAConfig: this.MFAConfig,
|
|
2841
|
+
RecoveryEmail: this.RecoveryEmail,
|
|
2842
|
+
FailedLoginAttemptCount: this.FailedLoginAttemptCount,
|
|
2843
|
+
LastFailedLoginAt: this.LastFailedLoginAt,
|
|
2844
|
+
LastPasswordChangedAt: this.LastPasswordChangedAt,
|
|
2845
|
+
NeedToChangePasswordYN: this.NeedToChangePasswordYN,
|
|
2846
|
+
CreatedById: this.CreatedById,
|
|
2847
|
+
CreatedAt: this.CreatedAt,
|
|
2848
|
+
UpdatedById: this.UpdatedById,
|
|
2849
|
+
UpdatedAt: this.UpdatedAt,
|
|
2850
|
+
PasscodeHash: this.PasscodeHash,
|
|
2851
|
+
PasscodeUpdatedAt: this.PasscodeUpdatedAt,
|
|
2852
|
+
};
|
|
2853
|
+
|
|
2854
|
+
this.Password = passwordHash;
|
|
2855
|
+
this.LastPasswordChangedAt = new Date();
|
|
2856
|
+
|
|
2857
|
+
const entityValueAfter: IUserAttr = {
|
|
2858
|
+
UserId: this.UserId,
|
|
2859
|
+
UserName: this.UserName,
|
|
2860
|
+
FullName: this.FullName,
|
|
2861
|
+
IDNo: this.IDNo,
|
|
2862
|
+
IDType: this.IDType,
|
|
2863
|
+
ContactNo: this.ContactNo,
|
|
2864
|
+
Email: this.Email,
|
|
2865
|
+
Password: this.Password,
|
|
2866
|
+
Status: this.Status,
|
|
2867
|
+
DefaultPasswordChangedYN: this.DefaultPasswordChangedYN,
|
|
2868
|
+
FirstLoginAt: this.FirstLoginAt,
|
|
2869
|
+
LastLoginAt: this.LastLoginAt,
|
|
2870
|
+
MFAEnabled: this.MFAEnabled,
|
|
2871
|
+
MFAConfig: this.MFAConfig,
|
|
2872
|
+
RecoveryEmail: this.RecoveryEmail,
|
|
2873
|
+
FailedLoginAttemptCount: this.FailedLoginAttemptCount,
|
|
2874
|
+
LastFailedLoginAt: this.LastFailedLoginAt,
|
|
2875
|
+
LastPasswordChangedAt: this.LastPasswordChangedAt,
|
|
2876
|
+
NeedToChangePasswordYN: this.NeedToChangePasswordYN,
|
|
2877
|
+
CreatedById: this.CreatedById,
|
|
2878
|
+
CreatedAt: this.CreatedAt,
|
|
2879
|
+
UpdatedById: this.UpdatedById,
|
|
2880
|
+
UpdatedAt: this.UpdatedAt,
|
|
2881
|
+
PasscodeHash: this.PasscodeHash,
|
|
2882
|
+
PasscodeUpdatedAt: this.PasscodeUpdatedAt,
|
|
2883
|
+
};
|
|
2884
|
+
|
|
2885
|
+
await User._Repository.update(
|
|
2886
|
+
{
|
|
2887
|
+
Password: this.Password,
|
|
2888
|
+
LastPasswordChangedAt: this.LastPasswordChangedAt,
|
|
2889
|
+
},
|
|
2890
|
+
{
|
|
2891
|
+
where: {
|
|
2892
|
+
UserId: this.UserId,
|
|
2893
|
+
},
|
|
2894
|
+
transaction: dbTransaction,
|
|
2895
|
+
},
|
|
2896
|
+
);
|
|
2897
|
+
|
|
2898
|
+
// Record update activity using Activity class create method.
|
|
2899
|
+
const activity = new Activity();
|
|
2900
|
+
activity.ActivityId = activity.createId();
|
|
2901
|
+
activity.Action = ActionEnum.UPDATE;
|
|
2902
|
+
activity.Description = 'Update Password';
|
|
2903
|
+
activity.EntityType = 'LoginUser';
|
|
2904
|
+
activity.EntityId = this.UserId.toString();
|
|
2905
|
+
activity.EntityValueBefore = JSON.stringify(entityValueBefore);
|
|
2906
|
+
activity.EntityValueAfter = JSON.stringify(entityValueAfter);
|
|
2907
|
+
|
|
2908
|
+
await activity.create(loginUser.ObjectId, dbTransaction);
|
|
2909
|
+
} catch (error) {
|
|
2910
|
+
throw error;
|
|
2911
|
+
}
|
|
2912
|
+
}
|
|
2913
|
+
|
|
2803
2914
|
async verifyPasscode(passcode: string) {
|
|
2804
2915
|
try {
|
|
2805
2916
|
// Return error if this._Userid is empty "User is not created yet."
|
|
@@ -167,22 +167,25 @@ export class UserReportingHierarchy
|
|
|
167
167
|
}
|
|
168
168
|
|
|
169
169
|
//Check if one rank before the new rank is not already assigned to the user, if not throw an error
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
170
|
+
if (rank > 1) {
|
|
171
|
+
const userReportingHierarchyBefore =
|
|
172
|
+
await UserReportingHierarchy._Repo.findOne({
|
|
173
|
+
where: {
|
|
174
|
+
ReportingUserId: reportingUserId,
|
|
175
|
+
Rank: rank - 1,
|
|
176
|
+
},
|
|
177
|
+
transaction: dbTransaction,
|
|
178
|
+
});
|
|
177
179
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
180
|
+
if (!userReportingHierarchyBefore) {
|
|
181
|
+
throw new ClassError(
|
|
182
|
+
'UserReportingHierarchy',
|
|
183
|
+
'UserReportingHierarchyErrMsg05',
|
|
184
|
+
'Rank before the new rank is not yet assigned to the user',
|
|
185
|
+
'createUserReportingHierarchy',
|
|
186
|
+
400,
|
|
187
|
+
);
|
|
188
|
+
}
|
|
186
189
|
}
|
|
187
190
|
|
|
188
191
|
// Create ReportingUserHierarchy Entry
|
|
@@ -327,25 +330,27 @@ export class UserReportingHierarchy
|
|
|
327
330
|
}
|
|
328
331
|
|
|
329
332
|
//Check if rank before the new rank is not already assigned to the user
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
333
|
+
if (rank > 1) {
|
|
334
|
+
const userReportingRankBefore =
|
|
335
|
+
await UserReportingHierarchy._Repo.findOne({
|
|
336
|
+
where: {
|
|
337
|
+
ReportingUserId: reportingUserId,
|
|
338
|
+
Rank: rank - 1,
|
|
339
|
+
UserReportingHierarchyId: {
|
|
340
|
+
[Op.ne]: this.UserReportingHierarchyId,
|
|
341
|
+
},
|
|
337
342
|
},
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
});
|
|
343
|
+
transaction: dbTransaction,
|
|
344
|
+
});
|
|
341
345
|
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
346
|
+
if (!userReportingRankBefore) {
|
|
347
|
+
throw new ClassError(
|
|
348
|
+
'UserReportingHierarchy',
|
|
349
|
+
'UserReportingHierarchyErrMsg05',
|
|
350
|
+
'Rank before the new rank is not yet assigned to the user',
|
|
351
|
+
'updateUserReportingHierarchy',
|
|
352
|
+
);
|
|
353
|
+
}
|
|
349
354
|
}
|
|
350
355
|
|
|
351
356
|
// UPDATE ReportingUserHierarchy Entry
|
package/tsconfig.build.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
{
|
|
2
|
-
"extends": "./tsconfig.json",
|
|
3
|
-
"include": ["**/*.ts"],
|
|
4
|
-
"exclude": ["node_modules", "__tests__", "dist", "**/*spec.ts"]
|
|
5
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"extends": "./tsconfig.json",
|
|
3
|
+
"include": ["**/*.ts"],
|
|
4
|
+
"exclude": ["node_modules", "__tests__", "dist", "**/*spec.ts"]
|
|
5
|
+
}
|
|
6
6
|
|
package/tsconfig.json
CHANGED
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
{
|
|
2
|
-
"compilerOptions": {
|
|
3
|
-
"module": "commonjs",
|
|
4
|
-
"declaration": true,
|
|
5
|
-
"removeComments": true,
|
|
6
|
-
"emitDecoratorMetadata": true,
|
|
7
|
-
"experimentalDecorators": true,
|
|
8
|
-
"allowSyntheticDefaultImports": true,
|
|
9
|
-
"moduleResolution": "node",
|
|
10
|
-
"target": "es6",
|
|
11
|
-
"sourceMap": true,
|
|
12
|
-
"outDir": "./dist",
|
|
13
|
-
"baseUrl": "./src",
|
|
14
|
-
"rootDir": "./",
|
|
15
|
-
"incremental": true,
|
|
16
|
-
"skipLibCheck": true,
|
|
17
|
-
"noImplicitAny": false,
|
|
18
|
-
"strictBindCallApply": false,
|
|
19
|
-
"forceConsistentCasingInFileNames": false,
|
|
20
|
-
"noFallthroughCasesInSwitch": false,
|
|
21
|
-
"strictNullChecks": false,
|
|
22
|
-
},
|
|
23
|
-
"exclude": ["node_modules", "dist"]
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"module": "commonjs",
|
|
4
|
+
"declaration": true,
|
|
5
|
+
"removeComments": true,
|
|
6
|
+
"emitDecoratorMetadata": true,
|
|
7
|
+
"experimentalDecorators": true,
|
|
8
|
+
"allowSyntheticDefaultImports": true,
|
|
9
|
+
"moduleResolution": "node",
|
|
10
|
+
"target": "es6",
|
|
11
|
+
"sourceMap": true,
|
|
12
|
+
"outDir": "./dist",
|
|
13
|
+
"baseUrl": "./src",
|
|
14
|
+
"rootDir": "./",
|
|
15
|
+
"incremental": true,
|
|
16
|
+
"skipLibCheck": true,
|
|
17
|
+
"noImplicitAny": false,
|
|
18
|
+
"strictBindCallApply": false,
|
|
19
|
+
"forceConsistentCasingInFileNames": false,
|
|
20
|
+
"noFallthroughCasesInSwitch": false,
|
|
21
|
+
"strictNullChecks": false,
|
|
22
|
+
},
|
|
23
|
+
"exclude": ["node_modules", "dist"]
|
|
24
24
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
const group_privilege_1 = require("../../../../src/components/group-privilege/group-privilege");
|
|
13
|
-
const group_privilege_repository_1 = require("../../../../src/components/group-privilege/group-privilege.repository");
|
|
14
|
-
const general_1 = require("@tomei/general");
|
|
15
|
-
describe('GroupPrivilege', () => {
|
|
16
|
-
afterEach(() => {
|
|
17
|
-
jest.restoreAllMocks();
|
|
18
|
-
});
|
|
19
|
-
it('should initialize with GroupPrivilegeAttr', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
20
|
-
const mockGroupPrivilegeAttr = {
|
|
21
|
-
GroupPrivilegeId: 1,
|
|
22
|
-
GroupCode: 'group1',
|
|
23
|
-
PrivilegeCode: 'privilege1',
|
|
24
|
-
Status: 'active',
|
|
25
|
-
CreatedAt: new Date(),
|
|
26
|
-
UpdatedAt: new Date(),
|
|
27
|
-
CreatedById: 1,
|
|
28
|
-
UpdatedById: 1,
|
|
29
|
-
};
|
|
30
|
-
const findOneMock = jest
|
|
31
|
-
.spyOn(group_privilege_repository_1.GroupPrivilegeRepository.prototype, 'findOne')
|
|
32
|
-
.mockResolvedValueOnce({ get: jest.fn().mockReturnValue(mockGroupPrivilegeAttr) });
|
|
33
|
-
const groupPrivilege = yield group_privilege_1.GroupPrivilege.init(null, 1);
|
|
34
|
-
expect(findOneMock).toBeCalledWith({
|
|
35
|
-
where: { GroupPrivilegeId: 1 },
|
|
36
|
-
transaction: null,
|
|
37
|
-
});
|
|
38
|
-
expect(groupPrivilege).toBeInstanceOf(group_privilege_1.GroupPrivilege);
|
|
39
|
-
expect(groupPrivilege.GroupPrivilegeId).toEqual(mockGroupPrivilegeAttr.GroupPrivilegeId);
|
|
40
|
-
expect(groupPrivilege.GroupCode).toEqual(mockGroupPrivilegeAttr.GroupCode);
|
|
41
|
-
expect(groupPrivilege.PrivilegeCode).toEqual(mockGroupPrivilegeAttr.PrivilegeCode);
|
|
42
|
-
expect(groupPrivilege.Status).toEqual(mockGroupPrivilegeAttr.Status);
|
|
43
|
-
expect(groupPrivilege.CreatedAt).toEqual(mockGroupPrivilegeAttr.CreatedAt);
|
|
44
|
-
expect(groupPrivilege.UpdatedAt).toEqual(mockGroupPrivilegeAttr.UpdatedAt);
|
|
45
|
-
expect(groupPrivilege.CreatedById).toEqual(mockGroupPrivilegeAttr.CreatedById);
|
|
46
|
-
expect(groupPrivilege.UpdatedById).toEqual(mockGroupPrivilegeAttr.UpdatedById);
|
|
47
|
-
}));
|
|
48
|
-
it('should throw ClassError when GroupPrivilegeAttr is not found', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
49
|
-
const findOneMock = jest
|
|
50
|
-
.spyOn(group_privilege_repository_1.GroupPrivilegeRepository.prototype, 'findOne')
|
|
51
|
-
.mockResolvedValueOnce(null);
|
|
52
|
-
yield expect(group_privilege_1.GroupPrivilege.init(null, 1)).rejects.toThrow(general_1.ClassError);
|
|
53
|
-
expect(findOneMock).toBeCalledWith({
|
|
54
|
-
where: { GroupPrivilegeId: 1 },
|
|
55
|
-
transaction: null,
|
|
56
|
-
});
|
|
57
|
-
}));
|
|
58
|
-
it('should initialize with default values', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
59
|
-
const groupPrivilege = yield group_privilege_1.GroupPrivilege.init();
|
|
60
|
-
expect(groupPrivilege).toBeInstanceOf(group_privilege_1.GroupPrivilege);
|
|
61
|
-
expect(groupPrivilege.GroupPrivilegeId).toBeUndefined();
|
|
62
|
-
expect(groupPrivilege.GroupCode).toBeUndefined();
|
|
63
|
-
expect(groupPrivilege.PrivilegeCode).toBeUndefined();
|
|
64
|
-
expect(groupPrivilege.Status).toBeUndefined();
|
|
65
|
-
expect(groupPrivilege.CreatedAt).toBeUndefined();
|
|
66
|
-
expect(groupPrivilege.UpdatedAt).toBeUndefined();
|
|
67
|
-
expect(groupPrivilege.CreatedById).toBeUndefined();
|
|
68
|
-
expect(groupPrivilege.UpdatedById).toBeUndefined();
|
|
69
|
-
}));
|
|
70
|
-
});
|
|
71
|
-
//# sourceMappingURL=group-privilege.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"group-privilege.test.js","sourceRoot":"","sources":["../../../../../__tests__/unit/components/group-privilege/group-privilege.test.ts"],"names":[],"mappings":"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"}
|
|
File without changes
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"login-user.spec.js","sourceRoot":"","sources":["../../../../../__tests__/unit/components/login-user/login-user.spec.ts"],"names":[],"mappings":"AAuuBA,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACvB,EAAE,CAAC,gBAAgB,EAAE,GAAG,EAAE;QACxB,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|