@tomei/sso 0.40.4 → 0.41.1
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/.eslintrc +16 -16
- package/.eslintrc.js +35 -35
- 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/api-key/api-key.d.ts +7 -0
- package/dist/src/components/api-key/api-key.js +45 -0
- package/dist/src/components/api-key/api-key.js.map +1 -1
- package/dist/src/components/group/group.d.ts +1 -0
- package/dist/src/components/group/group.js +70 -0
- package/dist/src/components/group/group.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- 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 +75 -75
- package/migrations/20240528063003-create-group-privilege-table.js +85 -85
- package/migrations/20240528063051-create-group-object-privilege-table.js +84 -84
- package/migrations/20240528063107-create-user-object-privilege-table.js +83 -83
- package/migrations/20240528063108-create-api-key-table.js +78 -78
- package/package.json +89 -89
- package/sampledotenv +7 -7
- package/sonar-project.properties +22 -22
- package/src/components/api-key/api-key.ts +100 -0
- package/src/components/group/group.ts +120 -0
- package/tsconfig.build.json +5 -5
- package/tsconfig.json +22 -22
- 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/tomei-sso-0.33.2.tgz +0 -0
package/sampledotenv
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
DATABASE_URL=
|
|
2
|
-
SHADOW_DATABASE_URL=
|
|
3
|
-
REDIS_URL=
|
|
4
|
-
REDIS_PASSWORD=
|
|
5
|
-
SMTP_HOST=
|
|
6
|
-
SMTP_PORT=
|
|
7
|
-
EMAIL_SENDER=
|
|
1
|
+
DATABASE_URL=
|
|
2
|
+
SHADOW_DATABASE_URL=
|
|
3
|
+
REDIS_URL=
|
|
4
|
+
REDIS_PASSWORD=
|
|
5
|
+
SMTP_HOST=
|
|
6
|
+
SMTP_PORT=
|
|
7
|
+
EMAIL_SENDER=
|
|
8
8
|
EMAIL_PASSWORD=
|
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
|
|
@@ -328,4 +328,104 @@ export class APIKey extends ObjectBase {
|
|
|
328
328
|
throw error;
|
|
329
329
|
}
|
|
330
330
|
}
|
|
331
|
+
|
|
332
|
+
public async revoke(
|
|
333
|
+
apiKey: string,
|
|
334
|
+
loginUser: LoginUser,
|
|
335
|
+
dbTransaction: any,
|
|
336
|
+
reason?: string,
|
|
337
|
+
) {
|
|
338
|
+
try {
|
|
339
|
+
// Part 1: Prepare Required Params
|
|
340
|
+
// Ensure apiKey, loginUser, and dbTransaction are provided.
|
|
341
|
+
// Retrieve the existing API key record from the database using the provided apiKey.
|
|
342
|
+
const apiKeyRecord = await APIKey._Repo.findOne({
|
|
343
|
+
where: { ApiKey: apiKey },
|
|
344
|
+
transaction: dbTransaction,
|
|
345
|
+
});
|
|
346
|
+
if (!apiKeyRecord) {
|
|
347
|
+
throw new ClassError(
|
|
348
|
+
'APIKey',
|
|
349
|
+
'APIKeyErrMsgO3',
|
|
350
|
+
'API key not found.',
|
|
351
|
+
'revoke',
|
|
352
|
+
);
|
|
353
|
+
}
|
|
354
|
+
const EntityValueBefore = {
|
|
355
|
+
...apiKeyRecord.get({ plain: true }),
|
|
356
|
+
};
|
|
357
|
+
|
|
358
|
+
// Part 2: Revoke API Key
|
|
359
|
+
// Mark the API key as revoked:
|
|
360
|
+
// Set the Status to "Revoked".
|
|
361
|
+
apiKeyRecord.Status = APIKeyStatusEnum.REVOKED;
|
|
362
|
+
// Set the RevokedAt timestamp to the current date and time.\
|
|
363
|
+
apiKeyRecord.RevokedAt = new Date();
|
|
364
|
+
// Set the RevokedById to loginUser.UserId.
|
|
365
|
+
apiKeyRecord.RevokedById = loginUser.UserId;
|
|
366
|
+
// Optionally, set the revocation reason:
|
|
367
|
+
// If the reason parameter is provided, store it in the RevokedReason attribute.
|
|
368
|
+
if (reason) {
|
|
369
|
+
apiKeyRecord.RevokedReason = reason;
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
// Part 3: Save API Key to Database
|
|
373
|
+
// Call APIKey._Repo.update() by passing:
|
|
374
|
+
// The updated APIKey instance
|
|
375
|
+
// dbTransaction.
|
|
376
|
+
await APIKey._Repo.update(
|
|
377
|
+
{
|
|
378
|
+
...apiKeyRecord.get({ plain: true }),
|
|
379
|
+
},
|
|
380
|
+
{
|
|
381
|
+
where: { APIKeyId: apiKeyRecord.APIKeyId },
|
|
382
|
+
transaction: dbTransaction,
|
|
383
|
+
},
|
|
384
|
+
);
|
|
385
|
+
|
|
386
|
+
// Part 4: Record Update API Key Activity
|
|
387
|
+
// Initialise EntityValueBefore variable and set to empty object.
|
|
388
|
+
// Initialise EntityValueAfter variable and set to this APIKey instance.
|
|
389
|
+
const EntityValueAfter = {
|
|
390
|
+
...apiKeyRecord.get({ plain: true }),
|
|
391
|
+
};
|
|
392
|
+
// Instantiate new activity from Activity class, call createId() method, then set:
|
|
393
|
+
// Action: ActionEnum.Create
|
|
394
|
+
// Description: "Revoke API key."
|
|
395
|
+
// EntityType: "APIKey"
|
|
396
|
+
// EntityId: <this.APIKeyId>
|
|
397
|
+
// EntityValueBefore: EntityValueBefore
|
|
398
|
+
// EntityValueAfter: EntityValueAfter
|
|
399
|
+
const activity = new Activity();
|
|
400
|
+
activity.ActivityId = activity.createId();
|
|
401
|
+
activity.Action = ActionEnum.UPDATE;
|
|
402
|
+
activity.Description = 'Revoke API key.';
|
|
403
|
+
activity.EntityType = 'APIKey';
|
|
404
|
+
activity.EntityId = apiKeyRecord.APIKeyId.toString();
|
|
405
|
+
activity.EntityValueBefore = JSON.stringify(EntityValueBefore);
|
|
406
|
+
activity.EntityValueAfter = JSON.stringify(EntityValueAfter);
|
|
407
|
+
// Call new activity create method by passing:
|
|
408
|
+
// dbTransaction
|
|
409
|
+
// userId: loginUser.ObjectId
|
|
410
|
+
await activity.create(loginUser.ObjectId, dbTransaction);
|
|
411
|
+
|
|
412
|
+
// Part 5: Returns
|
|
413
|
+
// Translate the updated APIKey entity into an object and return the following fields:
|
|
414
|
+
// ApiKey
|
|
415
|
+
// Status: "Revoked"
|
|
416
|
+
// RevokedAt
|
|
417
|
+
// RevokedById
|
|
418
|
+
// RevokedByName
|
|
419
|
+
// RevokedReason
|
|
420
|
+
return {
|
|
421
|
+
ApiKey: apiKeyRecord.ApiKey,
|
|
422
|
+
Status: apiKeyRecord.Status,
|
|
423
|
+
RevokedAt: apiKeyRecord.RevokedAt,
|
|
424
|
+
RevokedById: apiKeyRecord.RevokedById,
|
|
425
|
+
RevokedReason: apiKeyRecord.RevokedReason,
|
|
426
|
+
};
|
|
427
|
+
} catch (error) {
|
|
428
|
+
throw error;
|
|
429
|
+
}
|
|
430
|
+
}
|
|
331
431
|
}
|
|
@@ -1780,4 +1780,124 @@ export class Group extends TreeNodeBase<Group> {
|
|
|
1780
1780
|
throw error;
|
|
1781
1781
|
}
|
|
1782
1782
|
}
|
|
1783
|
+
|
|
1784
|
+
public static async getHierarchy(
|
|
1785
|
+
loginUser: LoginUser,
|
|
1786
|
+
dbTransaction: any,
|
|
1787
|
+
Status?: string,
|
|
1788
|
+
Type?: GroupTypeEnum,
|
|
1789
|
+
ParentGroupCode?: string,
|
|
1790
|
+
) {
|
|
1791
|
+
// This method retrieves all group records from the sso_Group table in a hierarchical tree structure based on
|
|
1792
|
+
// the ParentGroupCode. The hierarchy respects any filtering options passed, such as status or group type, and
|
|
1793
|
+
// checks privileges of the requesting user.
|
|
1794
|
+
|
|
1795
|
+
// Part 1: Privilege Checking
|
|
1796
|
+
// Call loginUser.checkPrivileges() by passing:
|
|
1797
|
+
// - SystemCode: Retrieved from the system configuration.
|
|
1798
|
+
// - PrivilegeCode: 'GROUP_VIEW'.
|
|
1799
|
+
// Ensure the user has privileges to view group information.
|
|
1800
|
+
const systemCode = ApplicationConfig.getComponentConfigValue('system-code');
|
|
1801
|
+
const isPrivileged = await loginUser.checkPrivileges(
|
|
1802
|
+
systemCode,
|
|
1803
|
+
'GROUP_VIEW',
|
|
1804
|
+
);
|
|
1805
|
+
|
|
1806
|
+
if (!isPrivileged) {
|
|
1807
|
+
throw new ClassError(
|
|
1808
|
+
'Group',
|
|
1809
|
+
'GroupErrMsg04',
|
|
1810
|
+
'User is not privileged to view group',
|
|
1811
|
+
);
|
|
1812
|
+
}
|
|
1813
|
+
|
|
1814
|
+
// Part 2: Prepare Filters
|
|
1815
|
+
// Set the default filter for Status to "Active", unless specified.
|
|
1816
|
+
// Use optional filters such as Type and ParentGroupCode if provided.
|
|
1817
|
+
const queryObj: any = {};
|
|
1818
|
+
|
|
1819
|
+
let options: any = {
|
|
1820
|
+
transaction: dbTransaction,
|
|
1821
|
+
};
|
|
1822
|
+
|
|
1823
|
+
const search = {
|
|
1824
|
+
Status: Status ? Status : 'Active',
|
|
1825
|
+
Type: Type,
|
|
1826
|
+
ParentGroupCode: ParentGroupCode,
|
|
1827
|
+
};
|
|
1828
|
+
|
|
1829
|
+
if (search) {
|
|
1830
|
+
Object.entries(search).forEach(([key, value]) => {
|
|
1831
|
+
if (value) {
|
|
1832
|
+
queryObj[key] = {
|
|
1833
|
+
[Op.substring]: value,
|
|
1834
|
+
};
|
|
1835
|
+
}
|
|
1836
|
+
});
|
|
1837
|
+
|
|
1838
|
+
options = {
|
|
1839
|
+
...options,
|
|
1840
|
+
where: queryObj,
|
|
1841
|
+
};
|
|
1842
|
+
|
|
1843
|
+
// Part 3: Retrieve Group Data
|
|
1844
|
+
// Use Sequelize's findAll() method with the provided filters (status, type, and parentGroupCode) to query the sso_Group table.
|
|
1845
|
+
// Recursively build the group tree based on ParentGroupCode relationships.
|
|
1846
|
+
|
|
1847
|
+
const result = await Group._Repo.findAll(options);
|
|
1848
|
+
const data = result.map((group) => new Group(group.get({ plain: true })));
|
|
1849
|
+
|
|
1850
|
+
const generateTree = async (groups) => {
|
|
1851
|
+
// Create a map for easy lookup by code
|
|
1852
|
+
|
|
1853
|
+
const data = groups.map((group) => {
|
|
1854
|
+
return {
|
|
1855
|
+
GroupCode: group.ObjectId,
|
|
1856
|
+
Name: group.Name,
|
|
1857
|
+
Description: group.Description,
|
|
1858
|
+
Type: group.Type,
|
|
1859
|
+
ParentGroupCode: group.ParentGroupCode,
|
|
1860
|
+
InheritParentPrivilegeYN: group.InheritParentPrivilegeYN,
|
|
1861
|
+
InheritParentSystemAccessYN: group.InheritParentSystemAccessYN,
|
|
1862
|
+
Path: group._Path,
|
|
1863
|
+
Status: group.Status,
|
|
1864
|
+
CreatedById: group._CreatedById,
|
|
1865
|
+
CreatedAt: group._CreatedAt,
|
|
1866
|
+
UpdatedById: group._UpdatedById,
|
|
1867
|
+
UpdatedAt: group._UpdatedAt,
|
|
1868
|
+
childrens: [],
|
|
1869
|
+
};
|
|
1870
|
+
});
|
|
1871
|
+
const groupMap = {};
|
|
1872
|
+
data.forEach((group) => {
|
|
1873
|
+
group.childrens = [];
|
|
1874
|
+
groupMap[group.GroupCode] = group;
|
|
1875
|
+
});
|
|
1876
|
+
|
|
1877
|
+
// Initialize the root nodes (those without a parentCode)
|
|
1878
|
+
const tree = [];
|
|
1879
|
+
|
|
1880
|
+
data.forEach((group) => {
|
|
1881
|
+
if (group.ParentGroupCode) {
|
|
1882
|
+
// Add this group as a child of its parent
|
|
1883
|
+
const parent = groupMap[group.ParentGroupCode];
|
|
1884
|
+
if (parent) {
|
|
1885
|
+
parent.childrens.push(group);
|
|
1886
|
+
}
|
|
1887
|
+
} else {
|
|
1888
|
+
// If no parentCode, it's a root node
|
|
1889
|
+
tree.push(group);
|
|
1890
|
+
}
|
|
1891
|
+
});
|
|
1892
|
+
|
|
1893
|
+
return tree;
|
|
1894
|
+
};
|
|
1895
|
+
|
|
1896
|
+
const tree = await generateTree(data);
|
|
1897
|
+
|
|
1898
|
+
// Part 4: Return Results
|
|
1899
|
+
// Return the tree structure with child groups (under the childrens key) included only if a group has child groups.
|
|
1900
|
+
return tree;
|
|
1901
|
+
}
|
|
1902
|
+
}
|
|
1783
1903
|
}
|
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,23 +1,23 @@
|
|
|
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
|
-
},
|
|
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
23
|
}
|
|
@@ -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"}
|
package/tomei-sso-0.33.2.tgz
DELETED
|
Binary file
|