@tomei/sso 0.66.0 → 0.66.1-test.2

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 (96) hide show
  1. package/.commitlintrc.json +22 -22
  2. package/.gitlab-ci.yml +237 -16
  3. package/.husky/commit-msg +15 -15
  4. package/.husky/pre-commit +7 -7
  5. package/.prettierrc +4 -4
  6. package/Jenkinsfile +57 -57
  7. package/README.md +23 -23
  8. package/__tests__/unit/components/api-key/api-key.spec.ts +201 -0
  9. package/__tests__/unit/components/group/group.spec.ts +85 -79
  10. package/__tests__/unit/components/group-object-privilege/group-object-privilege.spec.ts +88 -88
  11. package/__tests__/unit/components/group-privilege/group-privilege.spec.ts +68 -68
  12. package/__tests__/unit/components/group-reporting-user/group-reporting-user.spec.ts +74 -66
  13. package/__tests__/unit/components/group-system-access/group-system-access.spec.ts +83 -83
  14. package/__tests__/unit/components/login-user/l.spec.ts +746 -746
  15. package/__tests__/unit/components/login-user/login.spec.ts +2358 -1164
  16. package/__tests__/unit/components/password-hash/password-hash.service.spec.ts +31 -31
  17. package/__tests__/unit/components/system/system.spec.ts +255 -254
  18. package/__tests__/unit/components/system-privilege/system-privilege.spec.ts +83 -83
  19. package/__tests__/unit/components/user-group/user-group.spec.ts +86 -86
  20. package/__tests__/unit/components/user-object-privilege/user-object-privilege.spec.ts +78 -78
  21. package/__tests__/unit/components/user-password-history/user-password-history.spec.ts +165 -0
  22. package/__tests__/unit/components/user-privilege/user-privilege.spec.ts +72 -72
  23. package/__tests__/unit/components/user-reporting-hierarchy/user-reporting-hierarchy.spec.ts +233 -0
  24. package/__tests__/unit/components/user-system-access/user-system-access.spec.ts +89 -89
  25. package/__tests__/unit/redis-client/redis.service.spec.ts +23 -23
  26. package/__tests__/unit/session/session.service.spec.ts +47 -47
  27. package/__tests__/unit/system-privilege/system-privilage.spec.ts +91 -91
  28. package/coverage/cobertura-coverage.xml +6837 -0
  29. package/coverage/test-report.xml +161 -0
  30. package/create-sso-user.sql +39 -39
  31. package/dist/__tests__/unit/components/{group-privilege/group-privilege.test.d.ts → api-key/api-key.spec.d.ts} +1 -1
  32. package/dist/__tests__/unit/components/api-key/api-key.spec.js +158 -0
  33. package/dist/__tests__/unit/components/api-key/api-key.spec.js.map +1 -0
  34. package/dist/__tests__/unit/components/group/group.spec.js +4 -0
  35. package/dist/__tests__/unit/components/group/group.spec.js.map +1 -1
  36. package/dist/__tests__/unit/components/group-reporting-user/group-reporting-user.spec.js +9 -1
  37. package/dist/__tests__/unit/components/group-reporting-user/group-reporting-user.spec.js.map +1 -1
  38. package/dist/__tests__/unit/components/login-user/login.spec.js +703 -0
  39. package/dist/__tests__/unit/components/login-user/login.spec.js.map +1 -1
  40. package/dist/__tests__/unit/components/system/system.spec.js +1 -0
  41. package/dist/__tests__/unit/components/system/system.spec.js.map +1 -1
  42. package/dist/__tests__/unit/components/user-password-history/user-password-history.spec.d.ts +1 -0
  43. package/dist/__tests__/unit/components/user-password-history/user-password-history.spec.js +138 -0
  44. package/dist/__tests__/unit/components/user-password-history/user-password-history.spec.js.map +1 -0
  45. package/dist/__tests__/unit/components/user-reporting-hierarchy/user-reporting-hierarchy.spec.d.ts +1 -0
  46. package/dist/__tests__/unit/components/user-reporting-hierarchy/user-reporting-hierarchy.spec.js +182 -0
  47. package/dist/__tests__/unit/components/user-reporting-hierarchy/user-reporting-hierarchy.spec.js.map +1 -0
  48. package/dist/src/components/login-user/login-user.js +64 -63
  49. package/dist/src/components/login-user/login-user.js.map +1 -1
  50. package/dist/src/components/login-user/user.d.ts +5 -0
  51. package/dist/src/components/login-user/user.js +39 -0
  52. package/dist/src/components/login-user/user.js.map +1 -1
  53. package/dist/src/components/user-password-history/user-password-history.d.ts +1 -0
  54. package/dist/src/components/user-password-history/user-password-history.js +41 -2
  55. package/dist/src/components/user-password-history/user-password-history.js.map +1 -1
  56. package/dist/src/index.d.ts +0 -1
  57. package/dist/src/index.js +0 -1
  58. package/dist/src/index.js.map +1 -1
  59. package/dist/tsconfig.tsbuildinfo +1 -1
  60. package/eslint.config.mjs +58 -58
  61. package/jest.config.js +16 -14
  62. package/migrations/20240314080602-create-user-table.js +124 -124
  63. package/migrations/20240314080603-create-user-group-table.js +85 -85
  64. package/migrations/20240314080604-create-user-user-group-table.js +55 -55
  65. package/migrations/20240314080605-create-login-history-table.js +53 -53
  66. package/migrations/20240527064925-create-system-table.js +78 -78
  67. package/migrations/20240527064926-create-system-privilege-table.js +71 -71
  68. package/migrations/20240527065342-create-group-table.js +93 -93
  69. package/migrations/20240527065633-create-group-reporting-user-table.js +76 -76
  70. package/migrations/20240528011551-create-group-system-access-table.js +72 -72
  71. package/migrations/20240528023018-user-system-access-table.js +75 -75
  72. package/migrations/20240528032229-user-privilege-table.js +76 -76
  73. package/migrations/20240528063003-create-group-privilege-table.js +76 -76
  74. package/migrations/20240528063051-create-group-object-privilege-table.js +84 -84
  75. package/migrations/20240528063107-create-user-object-privilege-table.js +84 -84
  76. package/migrations/20240528063108-create-api-key-table.js +85 -85
  77. package/migrations/20241104104802-create-building-table.js +95 -95
  78. package/migrations/20250108091132-add-area-manager-user-id-to-building-table.js +14 -14
  79. package/migrations/20250108091133-add-passcode-to-user-table.js +36 -36
  80. package/migrations/20250210115636-create-user-reporting-hierarchy.js +76 -76
  81. package/migrations/20250326043818-crate-user-password-history.js +42 -42
  82. package/migrations/20250610070720-added-MFBypassYN-to-sso-user.js +30 -30
  83. package/migrations/20250805085707-add-bulk-approval-code-to-sso-user.js +29 -0
  84. package/package.json +87 -90
  85. package/sampledotenv +7 -7
  86. package/src/components/login-user/login-user.ts +89 -90
  87. package/src/components/login-user/user.ts +68 -0
  88. package/src/components/user-password-history/user-password-history.ts +57 -6
  89. package/src/index.ts +0 -1
  90. package/tsconfig.build.json +5 -5
  91. package/tsconfig.json +23 -23
  92. package/dist/__tests__/unit/components/group-privilege/group-privilege.test.js +0 -71
  93. package/dist/__tests__/unit/components/group-privilege/group-privilege.test.js.map +0 -1
  94. package/dist/__tests__/unit/components/login-user/login-user.spec.d.ts +0 -0
  95. package/dist/__tests__/unit/components/login-user/login-user.spec.js +0 -6
  96. package/dist/__tests__/unit/components/login-user/login-user.spec.js.map +0 -1
@@ -1,42 +1,42 @@
1
- 'use strict';
2
-
3
- /** @type {import('sequelize-cli').Migration} */
4
- module.exports = {
5
- async up(queryInterface, Sequelize) {
6
- await queryInterface.createTable('sso_UserPasswordHistory', {
7
- HistoryId: {
8
- type: Sequelize.STRING(30),
9
- primaryKey: true,
10
- allowNull: false,
11
- onUpdate: 'CASCADE',
12
- onDelete: 'CASCADE',
13
- },
14
- UserId: {
15
- type: Sequelize.INTEGER,
16
- allowNull: false,
17
- references: {
18
- model: 'sso_User',
19
- key: 'UserId',
20
- },
21
- onUpdate: 'CASCADE',
22
- onDelete: 'CASCADE',
23
- },
24
- PasswordHash: {
25
- type: Sequelize.STRING(225),
26
- allowNull: false,
27
- },
28
- CreatedAt: {
29
- type: Sequelize.DATE,
30
- allowNull: false,
31
- },
32
- UpdatedAt: {
33
- type: Sequelize.DATE,
34
- allowNull: false,
35
- },
36
- });
37
- },
38
-
39
- async down(queryInterface, Sequelize) {
40
- await queryInterface.dropTable('sso_UserPasswordHistory');
41
- },
42
- };
1
+ 'use strict';
2
+
3
+ /** @type {import('sequelize-cli').Migration} */
4
+ module.exports = {
5
+ async up(queryInterface, Sequelize) {
6
+ await queryInterface.createTable('sso_UserPasswordHistory', {
7
+ HistoryId: {
8
+ type: Sequelize.STRING(30),
9
+ primaryKey: true,
10
+ allowNull: false,
11
+ onUpdate: 'CASCADE',
12
+ onDelete: 'CASCADE',
13
+ },
14
+ UserId: {
15
+ type: Sequelize.INTEGER,
16
+ allowNull: false,
17
+ references: {
18
+ model: 'sso_User',
19
+ key: 'UserId',
20
+ },
21
+ onUpdate: 'CASCADE',
22
+ onDelete: 'CASCADE',
23
+ },
24
+ PasswordHash: {
25
+ type: Sequelize.STRING(225),
26
+ allowNull: false,
27
+ },
28
+ CreatedAt: {
29
+ type: Sequelize.DATE,
30
+ allowNull: false,
31
+ },
32
+ UpdatedAt: {
33
+ type: Sequelize.DATE,
34
+ allowNull: false,
35
+ },
36
+ });
37
+ },
38
+
39
+ async down(queryInterface, Sequelize) {
40
+ await queryInterface.dropTable('sso_UserPasswordHistory');
41
+ },
42
+ };
@@ -1,30 +1,30 @@
1
- 'use strict';
2
-
3
- module.exports = {
4
- up: async (queryInterface, Sequelize) => {
5
- const transaction = await queryInterface.sequelize.transaction();
6
- try {
7
- await queryInterface.addColumn('sso_User', 'MFABypassYN', {
8
- type: Sequelize.CHAR(1),
9
- allowNull: false,
10
- defaultValue: 'N',
11
- });
12
-
13
- await transaction.commit();
14
- } catch (error) {
15
- await transaction.rollback();
16
- throw error;
17
- }
18
- },
19
-
20
- down: async (queryInterface, Sequelize) => {
21
- const transaction = await queryInterface.sequelize.transaction();
22
- try {
23
- await queryInterface.removeColumn('sso_User', 'MFABypassYN');
24
- await transaction.commit();
25
- } catch (error) {
26
- await transaction.rollback();
27
- throw error;
28
- }
29
- },
30
- };
1
+ 'use strict';
2
+
3
+ module.exports = {
4
+ up: async (queryInterface, Sequelize) => {
5
+ const transaction = await queryInterface.sequelize.transaction();
6
+ try {
7
+ await queryInterface.addColumn('sso_User', 'MFABypassYN', {
8
+ type: Sequelize.CHAR(1),
9
+ allowNull: false,
10
+ defaultValue: 'N',
11
+ });
12
+
13
+ await transaction.commit();
14
+ } catch (error) {
15
+ await transaction.rollback();
16
+ throw error;
17
+ }
18
+ },
19
+
20
+ down: async (queryInterface, Sequelize) => {
21
+ const transaction = await queryInterface.sequelize.transaction();
22
+ try {
23
+ await queryInterface.removeColumn('sso_User', 'MFABypassYN');
24
+ await transaction.commit();
25
+ } catch (error) {
26
+ await transaction.rollback();
27
+ throw error;
28
+ }
29
+ },
30
+ };
@@ -0,0 +1,29 @@
1
+ 'use strict';
2
+
3
+ module.exports = {
4
+ up: async (queryInterface, Sequelize) => {
5
+ const transaction = await queryInterface.sequelize.transaction();
6
+ try {
7
+ await queryInterface.addColumn('sso_User', 'BulkApprovalCode', {
8
+ type: Sequelize.STRING(100),
9
+ allowNull: true,
10
+ });
11
+
12
+ await transaction.commit();
13
+ } catch (error) {
14
+ await transaction.rollback();
15
+ throw error;
16
+ }
17
+ },
18
+
19
+ down: async (queryInterface, Sequelize) => {
20
+ const transaction = await queryInterface.sequelize.transaction();
21
+ try {
22
+ await queryInterface.removeColumn('sso_User', 'BulkApprovalCode');
23
+ await transaction.commit();
24
+ } catch (error) {
25
+ await transaction.rollback();
26
+ throw error;
27
+ }
28
+ },
29
+ };
package/package.json CHANGED
@@ -1,90 +1,87 @@
1
- {
2
- "name": "@tomei/sso",
3
- "version": "0.66.0",
4
- "description": "Tomei SSO Package",
5
- "main": "dist/index.js",
6
- "scripts": {
7
- "start:dev": "tsc -w",
8
- "build": "tsc",
9
- "prepare": "husky",
10
- "format": "prettier --write \"src/**/*.ts\"",
11
- "lint": "npx eslint . --fix",
12
- "test": "jest --forceExit --detectOpenHandles --coverage"
13
- },
14
- "repository": {
15
- "type": "git",
16
- "url": "git+ssh://git@gitlab.com/tomei-package/sso.git"
17
- },
18
- "keywords": [
19
- "tomei",
20
- "sso"
21
- ],
22
- "author": "Tomei",
23
- "license": "ISC",
24
- "bugs": {
25
- "url": "https://gitlab.com/tomei-package/sso/issues"
26
- },
27
- "homepage": "https://gitlab.com/tomei-package/sso#readme",
28
- "devDependencies": {
29
- "@commitlint/cli": "^19.8.1",
30
- "@commitlint/config-conventional": "^19.8.1",
31
- "@eslint/js": "^9.35.0",
32
- "@tsconfig/node18": "^18.2.4",
33
- "@types/bcrypt": "^6.0.0",
34
- "@types/jest": "^30.0.0",
35
- "@types/node": "^24.5.2",
36
- "@types/validator": "^13.15.3",
37
- "@typescript-eslint/eslint-plugin": "^8.44.0",
38
- "@typescript-eslint/parser": "^8.44.0",
39
- "cls-hooked": "^4.2.2",
40
- "dotenv": "^17.2.2",
41
- "eslint": "^9.35.0",
42
- "eslint-config-prettier": "^10.1.8",
43
- "eslint-plugin-import": "^2.32.0",
44
- "eslint-plugin-prettier": "^5.5.4",
45
- "globals": "^16.4.0",
46
- "husky": "^9.1.7",
47
- "jest": "^30.1.3",
48
- "jest-mock-extended": "^4.0.0",
49
- "jest-sonar-reporter": "^2.0.0",
50
- "lint-staged": "^16.1.6",
51
- "prettier": "^3.6.2",
52
- "redis-mock": "^0.56.3",
53
- "ts-jest": "^29.4.3",
54
- "ts-node": "^10.9.2",
55
- "tsc-watch": "^7.1.1",
56
- "tsconfig-paths": "^4.2.0",
57
- "typescript": "^5.9.2"
58
- },
59
- "publishConfig": {
60
- "access": "public"
61
- },
62
- "peerDependencies": {
63
- "@tomei/activity-history": "^0.4.4",
64
- "@tomei/config": "^0.3.22",
65
- "@tomei/general": "^0.21.10",
66
- "@tomei/mailer": "^0.6.2",
67
- "argon2": "^0.44.0",
68
- "redis": "^5.8.2",
69
- "reflect-metadata": "^0.2.2",
70
- "sequelize": "^6.37.7",
71
- "sequelize-cli": "^6.6.3",
72
- "sequelize-typescript": "^2.1.6",
73
- "speakeasy": "^2.0.0",
74
- "uuid": "^11.1.0"
75
- },
76
- "lint-staged": {
77
- "*/**/*.{js,ts,tsx}": [
78
- "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
79
- "eslint \"{src,apps,libs,test}/**/*.ts\" --fix"
80
- ]
81
- },
82
- "jestSonar": {
83
- "reportPath": "coverage",
84
- "reportFile": "test-report.xml",
85
- "indent": 2
86
- },
87
- "dependencies": {
88
- "axios": "^1.13.2"
89
- }
90
- }
1
+ {
2
+ "name": "@tomei/sso",
3
+ "version": "0.66.1-test.2",
4
+ "description": "Tomei SSO Package",
5
+ "main": "dist/index.js",
6
+ "scripts": {
7
+ "start:dev": "tsc -w",
8
+ "build": "tsc",
9
+ "prepare": "husky install || true",
10
+ "format": "prettier --write \"src/**/*.ts\"",
11
+ "lint": "npx eslint . --fix",
12
+ "test": "jest --forceExit --detectOpenHandles --coverage"
13
+ },
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "git+ssh://git@gitlab.com/tomei-package/sso.git"
17
+ },
18
+ "keywords": [
19
+ "tomei",
20
+ "sso"
21
+ ],
22
+ "author": "Tomei",
23
+ "license": "ISC",
24
+ "bugs": {
25
+ "url": "https://gitlab.com/tomei-package/sso/issues"
26
+ },
27
+ "homepage": "https://gitlab.com/tomei-package/sso#readme",
28
+ "devDependencies": {
29
+ "@commitlint/cli": "^19.8.1",
30
+ "@commitlint/config-conventional": "^19.8.1",
31
+ "@eslint/js": "^9.35.0",
32
+ "@tsconfig/node18": "^18.2.4",
33
+ "@types/bcrypt": "^6.0.0",
34
+ "@types/jest": "^30.0.0",
35
+ "@types/node": "^24.5.2",
36
+ "@types/validator": "^13.15.3",
37
+ "@typescript-eslint/eslint-plugin": "^8.44.0",
38
+ "@typescript-eslint/parser": "^8.44.0",
39
+ "cls-hooked": "^4.2.2",
40
+ "dotenv": "^17.2.2",
41
+ "eslint": "^9.35.0",
42
+ "eslint-config-prettier": "^10.1.8",
43
+ "eslint-plugin-import": "^2.32.0",
44
+ "eslint-plugin-prettier": "^5.5.4",
45
+ "globals": "^16.4.0",
46
+ "husky": "^9.1.7",
47
+ "jest": "^30.1.3",
48
+ "jest-mock-extended": "^4.0.0",
49
+ "jest-sonar-reporter": "^2.0.0",
50
+ "lint-staged": "^16.1.6",
51
+ "prettier": "^3.6.2",
52
+ "redis-mock": "^0.56.3",
53
+ "ts-jest": "^29.4.3",
54
+ "ts-node": "^10.9.2",
55
+ "tsc-watch": "^7.1.1",
56
+ "tsconfig-paths": "^4.2.0",
57
+ "typescript": "^5.9.2"
58
+ },
59
+ "publishConfig": {
60
+ "access": "public"
61
+ },
62
+ "peerDependencies": {
63
+ "@tomei/activity-history": "^0.4.4",
64
+ "@tomei/config": "^0.3.22",
65
+ "@tomei/general": "^0.21.10",
66
+ "@tomei/mailer": "^0.6.2",
67
+ "argon2": "^0.44.0",
68
+ "redis": "^5.8.2",
69
+ "reflect-metadata": "^0.2.2",
70
+ "sequelize": "^6.37.7",
71
+ "sequelize-cli": "^6.6.3",
72
+ "sequelize-typescript": "^2.1.6",
73
+ "speakeasy": "^2.0.0",
74
+ "uuid": "^11.1.0"
75
+ },
76
+ "lint-staged": {
77
+ "*/**/*.{js,ts,tsx}": [
78
+ "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
79
+ "eslint \"{src,apps,libs,test}/**/*.ts\" --fix"
80
+ ]
81
+ },
82
+ "jestSonar": {
83
+ "reportPath": "coverage",
84
+ "reportFile": "test-report.xml",
85
+ "indent": 2
86
+ }
87
+ }
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=
@@ -12,8 +12,7 @@ import { createHash, randomBytes, randomUUID } from 'crypto';
12
12
  import { UserGroupRepository } from '../user-group/user-group.repository';
13
13
  import GroupSystemAccessModel from '../../models/group-system-access.entity';
14
14
  import SystemModel from '../../models/system.entity';
15
- import { ApplicationConfig, ComponentConfig } from '@tomei/config';
16
- import axios from 'axios';
15
+ import { ApplicationConfig } from '@tomei/config';
17
16
 
18
17
  export class LoginUser extends User implements ILoginUser {
19
18
  session = {
@@ -27,24 +26,20 @@ export class LoginUser extends User implements ILoginUser {
27
26
  ): Promise<LoginUser> {
28
27
  User._RedisService = await RedisService.init();
29
28
  if (userId) {
30
- const loginApiEndpoint = ComponentConfig.getComponentConfigValue(
31
- '@tomei/sso',
32
- 'loginApiEndpoint',
33
- );
34
-
35
- let payload = { UserId: userId };
36
-
37
- const { data } = await axios.post(
38
- `${loginApiEndpoint.baseUrl}${loginApiEndpoint.getProfile}`,
39
- payload,
40
- {
41
- headers: {
42
- 'Content-Type': 'application/json',
43
- 'x-api-key': loginApiEndpoint.apiKey,
44
- },
29
+ if (dbTransaction) {
30
+ User._Repository = new UserRepository();
31
+ }
32
+ const user = await User._Repository.findOne({
33
+ where: {
34
+ UserId: userId,
45
35
  },
46
- );
47
- const user = data.loginUser;
36
+ include: [
37
+ {
38
+ model: Staff,
39
+ },
40
+ ],
41
+ transaction: dbTransaction,
42
+ });
48
43
 
49
44
  if (!user) {
50
45
  throw new Error('Invalid credentials.');
@@ -59,21 +54,21 @@ export class LoginUser extends User implements ILoginUser {
59
54
  IDType: user?.IdType || null,
60
55
  ContactNo: user?.ContactNo || null,
61
56
  Email: user.Email,
62
- Password: null,
57
+ Password: user.Password,
63
58
  Status: user.Status,
64
- DefaultPasswordChangedYN: null,
65
- FirstLoginAt: null,
66
- LastLoginAt: null,
67
- MFAEnabled: null,
68
- MFAConfig: null,
69
- MFABypassYN: null,
70
- RecoveryEmail: null,
71
- FailedLoginAttemptCount: null,
72
- LastFailedLoginAt: null,
73
- LastPasswordChangedAt: null,
74
- NeedToChangePasswordYN: null,
75
- PasscodeHash: null,
76
- PasscodeUpdatedAt: null,
59
+ DefaultPasswordChangedYN: user.DefaultPasswordChangedYN,
60
+ FirstLoginAt: user.FirstLoginAt,
61
+ LastLoginAt: user.LastLoginAt,
62
+ MFAEnabled: user.MFAEnabled,
63
+ MFAConfig: user.MFAConfig,
64
+ MFABypassYN: user.MFABypassYN,
65
+ RecoveryEmail: user.RecoveryEmail,
66
+ FailedLoginAttemptCount: user.FailedLoginAttemptCount,
67
+ LastFailedLoginAt: user.LastFailedLoginAt,
68
+ LastPasswordChangedAt: user.LastPasswordChangedAt,
69
+ NeedToChangePasswordYN: user.NeedToChangePasswordYN,
70
+ PasscodeHash: user.PasscodeHash,
71
+ PasscodeUpdatedAt: user.PasscodeUpdatedAt,
77
72
  CreatedById: user.CreatedById,
78
73
  CreatedAt: user.CreatedAt,
79
74
  UpdatedById: user.UpdatedById,
@@ -104,28 +99,21 @@ export class LoginUser extends User implements ILoginUser {
104
99
  throw new Error('Session name is not set');
105
100
  }
106
101
 
107
- const loginApiEndpoint = ComponentConfig.getComponentConfigValue(
108
- '@tomei/sso',
109
- 'loginApiEndpoint',
102
+ const userSession = await this._SessionService.retrieveUserSession(
103
+ this.ObjectId,
104
+ sessionName,
110
105
  );
111
- let payload = {
112
- SystemCode: systemCode,
113
- SessionName: sessionName,
114
- PrivilegeName: privilegeName,
115
- UserId: this.ObjectId,
116
- };
117
- const { data } = await axios.post(
118
- `${loginApiEndpoint.baseUrl}${loginApiEndpoint.checkPrivileges}`,
119
- payload,
120
- {
121
- headers: {
122
- 'Content-Type': 'application/json',
123
- 'x-api-key': loginApiEndpoint.apiKey,
124
- },
125
- },
106
+
107
+ const systemLogin = userSession.systemLogins.find(
108
+ (system) => system.code === systemCode,
126
109
  );
127
- const hasPrivilege = data.hasPrivilege;
128
110
 
111
+ if (!systemLogin) {
112
+ return false;
113
+ }
114
+
115
+ const privileges = systemLogin.privileges;
116
+ const hasPrivilege = privileges.includes(privilegeName);
129
117
  return hasPrivilege;
130
118
  } catch (error) {
131
119
  throw error;
@@ -143,27 +131,28 @@ export class LoginUser extends User implements ILoginUser {
143
131
  if (!sessionName) {
144
132
  throw new Error('Session name is not set');
145
133
  }
146
- const loginApiEndpoint = ComponentConfig.getComponentConfigValue(
147
- '@tomei/sso',
148
- 'loginApiEndpoint',
134
+ const userSession = await this._SessionService.retrieveUserSession(
135
+ userId,
136
+ sessionName,
149
137
  );
150
- let payload = {
151
- SystemCode: systemCode,
152
- SessionName: sessionName,
153
- SessionId: sessionId,
154
- UserId: userId,
155
- };
156
- const { data } = await axios.post(
157
- `${loginApiEndpoint.baseUrl}${loginApiEndpoint.checkSession}`,
158
- payload,
159
- {
160
- headers: {
161
- 'Content-Type': 'application/json',
162
- 'x-api-key': loginApiEndpoint.apiKey,
163
- },
164
- },
138
+
139
+ if (userSession.systemLogins.length === 0) {
140
+ throw new Error('Session expired.');
141
+ }
142
+
143
+ const systemLogin = userSession.systemLogins.find(
144
+ (sl) => sl.code === systemCode,
165
145
  );
166
- const systemLogin = data.systemLogin;
146
+
147
+ if (!systemLogin) {
148
+ throw new Error('Session expired.');
149
+ }
150
+
151
+ if (systemLogin.sessionId !== sessionId) {
152
+ throw new Error('Session expired.');
153
+ }
154
+
155
+ await this._SessionService.refreshDuration(userId, sessionName);
167
156
 
168
157
  return systemLogin;
169
158
  } catch (error) {
@@ -339,26 +328,36 @@ export class LoginUser extends User implements ILoginUser {
339
328
  throw new Error('Session name is not set in the configuration');
340
329
  }
341
330
 
342
- const loginApiEndpoint = ComponentConfig.getComponentConfigValue(
343
- '@tomei/sso',
344
- 'loginApiEndpoint',
331
+ const userSession = await this._SessionService.retrieveUserSession(
332
+ this.ObjectId,
333
+ sessionName,
345
334
  );
346
- let payload = {
347
- SystemCode: systemCode,
348
- SessionName: sessionName,
349
- SessionId: sessionId,
350
- UserId: this.ObjectId,
351
- };
352
-
353
- await axios.post(
354
- `${loginApiEndpoint.baseUrl}${loginApiEndpoint.setSession}`,
355
- payload,
356
- {
357
- headers: {
358
- 'Content-Type': 'application/json',
359
- 'x-api-key': loginApiEndpoint.apiKey,
360
- },
361
- },
335
+ const systemLogin = userSession.systemLogins.find(
336
+ (system) => system.code === systemCode,
337
+ );
338
+
339
+ if (systemLogin) {
340
+ const privileges = await this.getPrivileges(systemCode, dbTransaction);
341
+ systemLogin.sessionId = sessionId;
342
+ systemLogin.privileges = privileges;
343
+ userSession.systemLogins.map((system) =>
344
+ system.code === systemCode ? systemLogin : system,
345
+ );
346
+ } else {
347
+ // if not, add new system login into the userSession
348
+ const newLogin = {
349
+ id: systemCode,
350
+ code: systemCode,
351
+ sessionId: sessionId,
352
+ privileges: await this.getPrivileges(systemCode, dbTransaction),
353
+ };
354
+ userSession.systemLogins.push(newLogin);
355
+ }
356
+ // then update userSession inside the redis storage with 1 day duration of time-to-live
357
+ this._SessionService.setUserSession(
358
+ this.ObjectId,
359
+ userSession,
360
+ sessionName,
362
361
  );
363
362
  }
364
363
  }