@tomei/sso 0.46.6 → 0.46.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.
Files changed (137) hide show
  1. package/.commitlintrc.json +22 -22
  2. package/.eslintrc +16 -16
  3. package/.eslintrc.js +35 -35
  4. package/.gitlab-ci.yml +16 -16
  5. package/.husky/commit-msg +15 -15
  6. package/.husky/pre-commit +7 -7
  7. package/.prettierrc +4 -4
  8. package/Jenkinsfile +57 -57
  9. package/README.md +23 -23
  10. package/__tests__/unit/components/group/group.spec.ts +79 -79
  11. package/__tests__/unit/components/group-object-privilege/group-object-privilege.spec.ts +88 -88
  12. package/__tests__/unit/components/group-privilege/group-privilege.spec.ts +68 -68
  13. package/__tests__/unit/components/group-reporting-user/group-reporting-user.spec.ts +66 -66
  14. package/__tests__/unit/components/group-system-access/group-system-access.spec.ts +83 -83
  15. package/__tests__/unit/components/login-user/l.spec.ts +746 -746
  16. package/__tests__/unit/components/login-user/login.spec.ts +1164 -1164
  17. package/__tests__/unit/components/password-hash/password-hash.service.spec.ts +31 -31
  18. package/__tests__/unit/components/system/system.spec.ts +254 -254
  19. package/__tests__/unit/components/system-privilege/system-privilege.spec.ts +83 -83
  20. package/__tests__/unit/components/user-group/user-group.spec.ts +86 -86
  21. package/__tests__/unit/components/user-object-privilege/user-object-privilege.spec.ts +78 -78
  22. package/__tests__/unit/components/user-privilege/user-privilege.spec.ts +72 -72
  23. package/__tests__/unit/components/user-system-access/user-system-access.spec.ts +89 -89
  24. package/__tests__/unit/redis-client/redis.service.spec.ts +23 -23
  25. package/__tests__/unit/session/session.service.spec.ts +47 -47
  26. package/__tests__/unit/system-privilege/system-privilage.spec.ts +91 -91
  27. package/coverage/clover.xml +1452 -1452
  28. package/coverage/coverage-final.json +47 -47
  29. package/coverage/lcov-report/base.css +224 -224
  30. package/coverage/lcov-report/block-navigation.js +87 -87
  31. package/coverage/lcov-report/components/group/group.repository.ts.html +117 -117
  32. package/coverage/lcov-report/components/group/group.ts.html +327 -327
  33. package/coverage/lcov-report/components/group/index.html +130 -130
  34. package/coverage/lcov-report/components/group-object-privilege/group-object-privilege.repository.ts.html +117 -117
  35. package/coverage/lcov-report/components/group-object-privilege/group-object-privilege.ts.html +321 -321
  36. package/coverage/lcov-report/components/group-object-privilege/index.html +130 -130
  37. package/coverage/lcov-report/components/group-privilege/group-privilege.repository.ts.html +117 -117
  38. package/coverage/lcov-report/components/group-privilege/group-privilege.ts.html +303 -303
  39. package/coverage/lcov-report/components/group-privilege/index.html +130 -130
  40. package/coverage/lcov-report/components/group-reporting-user/group-reporting-user.repository.ts.html +117 -117
  41. package/coverage/lcov-report/components/group-reporting-user/group-reporting-user.ts.html +327 -327
  42. package/coverage/lcov-report/components/group-reporting-user/index.html +130 -130
  43. package/coverage/lcov-report/components/group-system-access/group-system-access.repository.ts.html +117 -117
  44. package/coverage/lcov-report/components/group-system-access/group-system-access.ts.html +309 -309
  45. package/coverage/lcov-report/components/group-system-access/index.html +130 -130
  46. package/coverage/lcov-report/components/login-history/index.html +115 -115
  47. package/coverage/lcov-report/components/login-history/login-history.repository.ts.html +117 -117
  48. package/coverage/lcov-report/components/login-user/index.html +130 -130
  49. package/coverage/lcov-report/components/login-user/login-user.ts.html +5007 -5007
  50. package/coverage/lcov-report/components/login-user/user.repository.ts.html +117 -117
  51. package/coverage/lcov-report/components/password-hash/index.html +115 -115
  52. package/coverage/lcov-report/components/password-hash/password-hash.service.ts.html +126 -126
  53. package/coverage/lcov-report/components/system/index.html +130 -130
  54. package/coverage/lcov-report/components/system/system.repository.ts.html +117 -117
  55. package/coverage/lcov-report/components/system/system.ts.html +909 -909
  56. package/coverage/lcov-report/components/system-privilege/index.html +130 -130
  57. package/coverage/lcov-report/components/system-privilege/system-privilege.repository.ts.html +120 -120
  58. package/coverage/lcov-report/components/system-privilege/system-privilege.ts.html +390 -390
  59. package/coverage/lcov-report/components/user-group/index.html +130 -130
  60. package/coverage/lcov-report/components/user-group/user-group.repository.ts.html +117 -117
  61. package/coverage/lcov-report/components/user-group/user-group.ts.html +354 -354
  62. package/coverage/lcov-report/components/user-object-privilege/index.html +130 -130
  63. package/coverage/lcov-report/components/user-object-privilege/user-object-privilege.repository.ts.html +117 -117
  64. package/coverage/lcov-report/components/user-object-privilege/user-object-privilege.ts.html +312 -312
  65. package/coverage/lcov-report/components/user-privilege/index.html +130 -130
  66. package/coverage/lcov-report/components/user-privilege/user-privilege.repository.ts.html +117 -117
  67. package/coverage/lcov-report/components/user-privilege/user-privilege.ts.html +306 -306
  68. package/coverage/lcov-report/components/user-system-access/index.html +130 -130
  69. package/coverage/lcov-report/components/user-system-access/user-system-access.repository.ts.html +117 -117
  70. package/coverage/lcov-report/components/user-system-access/user-system-access.ts.html +312 -312
  71. package/coverage/lcov-report/enum/group-type.enum.ts.html +108 -108
  72. package/coverage/lcov-report/enum/index.html +160 -160
  73. package/coverage/lcov-report/enum/index.ts.html +93 -93
  74. package/coverage/lcov-report/enum/user-status.enum.ts.html +105 -105
  75. package/coverage/lcov-report/enum/yn.enum.ts.html +96 -96
  76. package/coverage/lcov-report/index.html +370 -370
  77. package/coverage/lcov-report/models/group-object-privilege.entity.ts.html +333 -333
  78. package/coverage/lcov-report/models/group-privilege.entity.ts.html +315 -315
  79. package/coverage/lcov-report/models/group-reporting-user.entity.ts.html +339 -339
  80. package/coverage/lcov-report/models/group-system-access.entity.ts.html +324 -324
  81. package/coverage/lcov-report/models/group.entity.ts.html +435 -435
  82. package/coverage/lcov-report/models/index.html +310 -310
  83. package/coverage/lcov-report/models/login-history.entity.ts.html +252 -252
  84. package/coverage/lcov-report/models/staff.entity.ts.html +411 -411
  85. package/coverage/lcov-report/models/system-privilege.entity.ts.html +354 -354
  86. package/coverage/lcov-report/models/system.entity.ts.html +423 -423
  87. package/coverage/lcov-report/models/user-group.entity.ts.html +354 -354
  88. package/coverage/lcov-report/models/user-object-privilege.entity.ts.html +330 -330
  89. package/coverage/lcov-report/models/user-privilege.entity.ts.html +315 -315
  90. package/coverage/lcov-report/models/user-system-access.entity.ts.html +315 -315
  91. package/coverage/lcov-report/models/user.entity.ts.html +522 -522
  92. package/coverage/lcov-report/prettify.css +1 -1
  93. package/coverage/lcov-report/prettify.js +2 -2
  94. package/coverage/lcov-report/redis-client/index.html +115 -115
  95. package/coverage/lcov-report/redis-client/redis.service.ts.html +240 -240
  96. package/coverage/lcov-report/session/index.html +115 -115
  97. package/coverage/lcov-report/session/session.service.ts.html +246 -246
  98. package/coverage/lcov-report/sorter.js +196 -196
  99. package/coverage/lcov.info +2490 -2490
  100. package/coverage/test-report.xml +128 -128
  101. package/create-sso-user.sql +39 -39
  102. package/dist/src/components/user-system-access/user-system-access.d.ts +12 -0
  103. package/dist/src/components/user-system-access/user-system-access.js +148 -0
  104. package/dist/src/components/user-system-access/user-system-access.js.map +1 -1
  105. package/dist/src/components/user-system-access/user-system-access.repository.d.ts +1 -0
  106. package/dist/src/components/user-system-access/user-system-access.repository.js +25 -0
  107. package/dist/src/components/user-system-access/user-system-access.repository.js.map +1 -1
  108. package/dist/tsconfig.tsbuildinfo +1 -1
  109. package/jest.config.js +14 -14
  110. package/migrations/20240314080602-create-user-table.js +124 -124
  111. package/migrations/20240314080603-create-user-group-table.js +85 -85
  112. package/migrations/20240314080604-create-user-user-group-table.js +55 -55
  113. package/migrations/20240314080605-create-login-history-table.js +53 -53
  114. package/migrations/20240527064925-create-system-table.js +78 -78
  115. package/migrations/20240527064926-create-system-privilege-table.js +71 -71
  116. package/migrations/20240527065342-create-group-table.js +93 -93
  117. package/migrations/20240527065633-create-group-reporting-user-table.js +76 -76
  118. package/migrations/20240528011551-create-group-system-access-table.js +72 -72
  119. package/migrations/20240528023018-user-system-access-table.js +75 -75
  120. package/migrations/20240528032229-user-privilege-table.js +75 -75
  121. package/migrations/20240528063003-create-group-privilege-table.js +85 -85
  122. package/migrations/20240528063051-create-group-object-privilege-table.js +84 -84
  123. package/migrations/20240528063107-create-user-object-privilege-table.js +83 -83
  124. package/migrations/20240528063108-create-api-key-table.js +85 -85
  125. package/package.json +89 -89
  126. package/sampledotenv +7 -7
  127. package/sonar-project.properties +22 -22
  128. package/src/components/user-system-access/user-system-access.repository.ts +14 -0
  129. package/src/components/user-system-access/user-system-access.ts +298 -0
  130. package/tsconfig.build.json +5 -5
  131. package/tsconfig.json +22 -22
  132. package/dist/__tests__/unit/components/group-privilege/group-privilege.test.d.ts +0 -1
  133. package/dist/__tests__/unit/components/group-privilege/group-privilege.test.js +0 -71
  134. package/dist/__tests__/unit/components/group-privilege/group-privilege.test.js.map +0 -1
  135. package/dist/__tests__/unit/components/login-user/login-user.spec.d.ts +0 -0
  136. package/dist/__tests__/unit/components/login-user/login-user.spec.js +0 -6
  137. package/dist/__tests__/unit/components/login-user/login-user.spec.js.map +0 -1
package/package.json CHANGED
@@ -1,89 +1,89 @@
1
- {
2
- "name": "@tomei/sso",
3
- "version": "0.46.6",
4
- "description": "Tomei SSO Package",
5
- "main": "dist/index.js",
6
- "scripts": {
7
- "start:dev": "tsc -w",
8
- "build": "tsc",
9
- "prepare": "husky install",
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": "^17.6.3",
30
- "@commitlint/config-conventional": "^17.6.3",
31
- "@tsconfig/node18": "^2.0.1",
32
- "@types/bcrypt": "^5.0.0",
33
- "@types/jest": "^29.5.2",
34
- "@types/node": "^18.17.5",
35
- "@types/redis": "^4.0.11",
36
- "@types/validator": "^13.11.1",
37
- "@typescript-eslint/eslint-plugin": "^5.33.0",
38
- "@typescript-eslint/parser": "^5.0.0",
39
- "dotenv": "^16.1.4",
40
- "eslint": "^8.40.0",
41
- "eslint-config-prettier": "^8.5.0",
42
- "eslint-plugin-prettier": "^4.2.1",
43
- "husky": "^8.0.3",
44
- "jest": "^29.5.0",
45
- "jest-mock-extended": "^3.0.4",
46
- "jest-sonar-reporter": "^2.0.0",
47
- "lint-staged": "^13.2.2",
48
- "prettier": "^2.7.1",
49
- "prisma": "^4.14.0",
50
- "redis-mock": "^0.56.3",
51
- "sequelize-cli": "^6.6.2",
52
- "ts-jest": "^29.1.0",
53
- "ts-node": "^10.9.1",
54
- "tsc-watch": "^5.0.3",
55
- "tsconfig-paths": "^4.0.0",
56
- "tslint": "^6.1.3",
57
- "typescript": "^4.7.4"
58
- },
59
- "publishConfig": {
60
- "access": "public"
61
- },
62
- "peerDependencies": {
63
- "@tomei/activity-history": "^0.2.19",
64
- "@tomei/config": "^0.3.12",
65
- "@tomei/general": "^0.15.2",
66
- "@tomei/mailer": "^0.5.15",
67
- "argon2": "^0.30.3",
68
- "cls-hooked": "^4.2.2",
69
- "cuid": "^3.0.0",
70
- "nodemailer": "^6.9.3",
71
- "redis": "^4.6.7",
72
- "reflect-metadata": "^0.1.13",
73
- "sequelize": "^6.37.3",
74
- "sequelize-typescript": "^2.1.6",
75
- "speakeasy": "^2.0.0",
76
- "uuid": "^10.0.0"
77
- },
78
- "lint-staged": {
79
- "*/**/*.{js,ts,tsx}": [
80
- "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
81
- "eslint \"{src,apps,libs,test}/**/*.ts\" --fix"
82
- ]
83
- },
84
- "jestSonar": {
85
- "reportPath": "coverage",
86
- "reportFile": "test-report.xml",
87
- "indent": 2
88
- }
89
- }
1
+ {
2
+ "name": "@tomei/sso",
3
+ "version": "0.46.8",
4
+ "description": "Tomei SSO Package",
5
+ "main": "dist/index.js",
6
+ "scripts": {
7
+ "start:dev": "tsc -w",
8
+ "build": "tsc",
9
+ "prepare": "husky install",
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": "^17.6.3",
30
+ "@commitlint/config-conventional": "^17.6.3",
31
+ "@tsconfig/node18": "^2.0.1",
32
+ "@types/bcrypt": "^5.0.0",
33
+ "@types/jest": "^29.5.2",
34
+ "@types/node": "^18.17.5",
35
+ "@types/redis": "^4.0.11",
36
+ "@types/validator": "^13.11.1",
37
+ "@typescript-eslint/eslint-plugin": "^5.33.0",
38
+ "@typescript-eslint/parser": "^5.0.0",
39
+ "dotenv": "^16.1.4",
40
+ "eslint": "^8.40.0",
41
+ "eslint-config-prettier": "^8.5.0",
42
+ "eslint-plugin-prettier": "^4.2.1",
43
+ "husky": "^8.0.3",
44
+ "jest": "^29.5.0",
45
+ "jest-mock-extended": "^3.0.4",
46
+ "jest-sonar-reporter": "^2.0.0",
47
+ "lint-staged": "^13.2.2",
48
+ "prettier": "^2.7.1",
49
+ "prisma": "^4.14.0",
50
+ "redis-mock": "^0.56.3",
51
+ "sequelize-cli": "^6.6.2",
52
+ "ts-jest": "^29.1.0",
53
+ "ts-node": "^10.9.1",
54
+ "tsc-watch": "^5.0.3",
55
+ "tsconfig-paths": "^4.0.0",
56
+ "tslint": "^6.1.3",
57
+ "typescript": "^4.7.4"
58
+ },
59
+ "publishConfig": {
60
+ "access": "public"
61
+ },
62
+ "peerDependencies": {
63
+ "@tomei/activity-history": "^0.2.19",
64
+ "@tomei/config": "^0.3.12",
65
+ "@tomei/general": "^0.15.2",
66
+ "@tomei/mailer": "^0.5.15",
67
+ "argon2": "^0.30.3",
68
+ "cls-hooked": "^4.2.2",
69
+ "cuid": "^3.0.0",
70
+ "nodemailer": "^6.9.3",
71
+ "redis": "^4.6.7",
72
+ "reflect-metadata": "^0.1.13",
73
+ "sequelize": "^6.37.3",
74
+ "sequelize-typescript": "^2.1.6",
75
+ "speakeasy": "^2.0.0",
76
+ "uuid": "^10.0.0"
77
+ },
78
+ "lint-staged": {
79
+ "*/**/*.{js,ts,tsx}": [
80
+ "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
81
+ "eslint \"{src,apps,libs,test}/**/*.ts\" --fix"
82
+ ]
83
+ },
84
+ "jestSonar": {
85
+ "reportPath": "coverage",
86
+ "reportFile": "test-report.xml",
87
+ "indent": 2
88
+ }
89
+ }
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=
@@ -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
@@ -8,4 +8,18 @@ export class UserSystemAccessRepository
8
8
  constructor() {
9
9
  super(UserSystemAccessModel);
10
10
  }
11
+
12
+ async delete(UserSystemAccessId: number, dbTransaction?: any) {
13
+ try {
14
+ const options = {
15
+ where: {
16
+ UserSystemAccessId: UserSystemAccessId,
17
+ },
18
+ transaction: dbTransaction,
19
+ };
20
+ await UserSystemAccessModel.destroy(options);
21
+ } catch (error) {
22
+ throw new Error(`An Error occured when delete : ${error.message}`);
23
+ }
24
+ }
11
25
  }
@@ -6,6 +6,8 @@ import { System } from '../system/system';
6
6
  import { ApplicationConfig } from '@tomei/config';
7
7
  import SystemModel from '../../models/system.entity';
8
8
  import UserModel from '../../models/user.entity';
9
+ import { ActionEnum, Activity } from '@tomei/activity-history';
10
+ import { Op } from 'sequelize';
9
11
 
10
12
  export class UserSystemAccess extends ObjectBase {
11
13
  ObjectType = 'UserSystemAccess';
@@ -85,6 +87,7 @@ export class UserSystemAccess extends ObjectBase {
85
87
  whereOption: {
86
88
  //An object containing filter criteria, specifically:
87
89
  UserId: number; //The ID of the user whose system access records are to be retrieved.
90
+ SystemCode?: string;
88
91
  },
89
92
  pagination: {
90
93
  //An object containing pagination parameters:
@@ -159,6 +162,7 @@ export class UserSystemAccess extends ObjectBase {
159
162
  return {
160
163
  records: userSystemAccesses.rows.map((userSystemAccess) => {
161
164
  return {
165
+ UserSystemAccessId: userSystemAccess.UserSystemAccessId,
162
166
  SystemName: userSystemAccess.System.Name,
163
167
  SystemCode: userSystemAccess.System.SystemCode,
164
168
  Status: userSystemAccess.Status,
@@ -178,4 +182,298 @@ export class UserSystemAccess extends ObjectBase {
178
182
  throw error;
179
183
  }
180
184
  }
185
+
186
+ public static async createAccess(
187
+ loginUser: User, //The currently logged-in user initiating the request.
188
+ dbTransaction: any, //The active database transaction to ensure consistency during the query.
189
+ UserId: string, //The user ID for whom system access is being created.
190
+ SystemCode: string, //The system code for which access is being granted.
191
+ Status: string, //The status of access ('Active' or 'Inactive').
192
+ ) {
193
+ try {
194
+ // Part 1: Privilege Checking:
195
+ // Call loginUser.checkPrivileges() method by passing:
196
+ // SystemCode: Retrieve from app config.
197
+ // PrivilegeCode: 'USER_SYSTEM_ACCESS_CREATE'.
198
+ const systemCode =
199
+ ApplicationConfig.getComponentConfigValue('system-code');
200
+ const privilegeCode = 'USER_SYSTEM_ACCESS_CREATE';
201
+ const isPrivileged = await loginUser.checkPrivileges(
202
+ systemCode,
203
+ privilegeCode,
204
+ );
205
+ if (!isPrivileged) {
206
+ throw new ClassError(
207
+ 'UserSystemAccess',
208
+ 'UserSystemAccessErrMsg01',
209
+ 'You do not have permission to access this resource.',
210
+ );
211
+ }
212
+ // Part 2: Validation for Existing Access
213
+ // Use the UserSystemAccess.findAll() method to check if the user already has access to the specified system:
214
+ // Pass the following parameters:
215
+ // loginUser
216
+ // dbTransaction
217
+ // whereOption: set to UserId = UserId and SystemCode = SystemCode.
218
+ // If a record is found, throw an error indicating that access for this user and system already exists.
219
+
220
+ const isExist = await UserSystemAccess._Repository.findAll({
221
+ where: { [Op.and]: [{ UserId: UserId }, { SystemCode: SystemCode }] },
222
+ transaction: dbTransaction,
223
+ });
224
+
225
+ if (isExist?.length > 0) {
226
+ throw new ClassError(
227
+ 'UserSystemAccess',
228
+ 'UserSystemAccessErrMsg01',
229
+ 'User already have access to this system',
230
+ );
231
+ }
232
+
233
+ // Part 3: Insert System Access Record
234
+ // After successful validation, create a new instance of UserSystemAccess with the following fields:
235
+ // - UserId: set to the UserId parameter.
236
+ // - SystemCode: set to the SystemCode parameter.
237
+ // - Status: set to the Status parameter.
238
+ // - CreatedById: set to loginUser.UserId.
239
+ // - CreatedAt: set to the current timestamp.
240
+ // - UpdatedById: set to loginUser.UserId.
241
+ // - UpdatedAt: set to the current timestamp (same as CreatedAt).
242
+ // Save the new UserSystemAccess instance in the database within the dbTransaction.
243
+
244
+ const newUserSystemAccess = new UserSystemAccess();
245
+ newUserSystemAccess.UserId = parseInt(UserId);
246
+ newUserSystemAccess.SystemCode = SystemCode;
247
+ newUserSystemAccess.Status = Status;
248
+ newUserSystemAccess._CreatedById = loginUser.UserId;
249
+ newUserSystemAccess._CreatedAt = new Date();
250
+ newUserSystemAccess._UpdatedById = loginUser.UserId;
251
+ newUserSystemAccess._UpdatedAt = new Date();
252
+
253
+ const payload = {
254
+ UserId: newUserSystemAccess.UserId,
255
+ SystemCode: newUserSystemAccess.SystemCode,
256
+ Status: newUserSystemAccess.Status,
257
+ CreatedById: newUserSystemAccess.CreatedById,
258
+ CreatedAt: newUserSystemAccess.CreatedAt,
259
+ UpdatedById: newUserSystemAccess.UpdatedById,
260
+ UpdatedAt: newUserSystemAccess.UpdatedAt,
261
+ };
262
+
263
+ const systemAccess = await UserSystemAccess._Repository.create(payload, {
264
+ transaction: dbTransaction,
265
+ });
266
+
267
+ // Part 4: Record Activity History
268
+ // Initialize an empty object ({}) as EntityValueBefore.
269
+ // Set EntityValueAfter to the stringified version of the newly created UserSystemAccess instance.
270
+ // Create a new activity log entry:
271
+ // ActivityId: auto-generated by calling activity.createId().
272
+ // Action: set to ActionEnum.Create.
273
+ // Description: set to "Create User System Access".
274
+ // EntityType: set to UserSystemAccess.
275
+ // EntityId: set to the newly created UserSystemAccess.UserSystemAccessId.
276
+ // EntityValueBefore: set to {} (empty).
277
+ // EntityValueAfter: set to the stringified version of the new access record.
278
+ // Call the activity.create() method, passing:
279
+ // dbTransaction
280
+ // userId: set to loginUser.UserId.
281
+
282
+ const entityValueBefore = {};
283
+
284
+ //Instantiate new activity
285
+ const activity = new Activity();
286
+ activity.ActivityId = activity.createId();
287
+ activity.Action = ActionEnum.CREATE;
288
+ activity.Description = 'Create User System Access';
289
+ activity.EntityType = 'UserSystemAccess';
290
+ activity.EntityId = systemAccess.UserSystemAccessId?.toString();
291
+ activity.EntityValueBefore = JSON.stringify(entityValueBefore);
292
+ activity.EntityValueAfter = JSON.stringify(payload);
293
+
294
+ //Call Activity.create method
295
+ await activity.create(loginUser.ObjectId, dbTransaction);
296
+
297
+ // Part 5: Return Newly Created Record
298
+ // Return the newly created UserSystemAccess instance with all relevant fields, including UserSystemAccessId, SystemCode, Status, CreatedAt, and CreatedById.
299
+ newUserSystemAccess.UserSystemAccessId = systemAccess.UserSystemAccessId;
300
+ return newUserSystemAccess;
301
+ } catch (error) {
302
+ throw error;
303
+ }
304
+ }
305
+
306
+ public async update(
307
+ loginUser: User, //The user object representing the currently logged-in user.
308
+ dbTransaction: any, //The database transaction instance for managing the transaction scope.
309
+ Status: string, //The new access status (Active/Inactive) for the user system access.
310
+ ) {
311
+ try {
312
+ // Part 1: Update Access
313
+ // Call the UserSystemAccess._Repo.update() method to perform the update operation, passing:
314
+ // - Status: The new access status.
315
+ // - UpdatedById: loginUser.UserId (to indicate who updated the record).
316
+ // - UpdatedAt: Set to the current date and time.
317
+ // - dbTransaction: The database transaction instance.
318
+
319
+ const entityValueBefore = {
320
+ UserId: this.UserId,
321
+ SystemCode: this.SystemCode,
322
+ Status: this.Status,
323
+ CreatedById: this.CreatedById,
324
+ CreatedAt: this.CreatedAt,
325
+ UpdatedById: this.UpdatedById,
326
+ UpdatedAt: this.UpdatedAt,
327
+ };
328
+ await UserSystemAccess._Repository.update(
329
+ {
330
+ Status: Status,
331
+ UpdatedById: loginUser.UserId,
332
+ UpdatedAt: new Date(),
333
+ },
334
+ {
335
+ where: {
336
+ UserSystemAccessId: this.UserSystemAccessId,
337
+ },
338
+ transaction: dbTransaction,
339
+ },
340
+ );
341
+
342
+ const entityValueAfter = {
343
+ UserId: this.UserId,
344
+ SystemCode: this.SystemCode,
345
+ Status: Status,
346
+ CreatedById: this.CreatedById,
347
+ CreatedAt: this.CreatedAt,
348
+ UpdatedById: loginUser.UserId,
349
+ UpdatedAt: new Date(),
350
+ };
351
+
352
+ // Part 2: Record Activity History
353
+ // Initialize a variable entityValueBefore to store the current state of the user system access record before the update.
354
+ // Create an instance of the Activity class and set the following properties:
355
+ // - ActivityId: Call activity.createId().
356
+ // - Action: Set to ActionEnum.Update.
357
+ // - Description: Set to Update User System Access.
358
+ // - EntityType: Set to UserSystemAccess.
359
+ // - EntityId: Use the ID of the updated user system access record.
360
+ // - EntityValueBefore: Stringify entityValueBefore to capture the state before the update.
361
+ // - EntityValueAfter: Stringify the updated user system access record to capture the new state after the update.
362
+ // Call the activity create method with the following parameters:
363
+ // - dbTransaction
364
+ // - userId: loginUser.UserId
365
+ const activity = new Activity();
366
+ activity.ActivityId = activity.createId();
367
+ activity.Action = ActionEnum.UPDATE;
368
+ activity.Description = 'Update User System Access';
369
+ activity.EntityType = 'UserSystemAccess';
370
+ activity.EntityId = this.UserSystemAccessId + '';
371
+ activity.EntityValueBefore = JSON.stringify(entityValueBefore);
372
+ activity.EntityValueAfter = JSON.stringify(entityValueAfter);
373
+ await activity.create(loginUser.ObjectId, dbTransaction);
374
+
375
+ // Part 3: Return Updated Record
376
+ // Retrieve the updated user system access record from the database or return the updated instance as needed.
377
+
378
+ // Part 5: Return Newly Created Record
379
+ // Return the newly created UserSystemAccess instance with all relevant fields, including UserSystemAccessId, SystemCode, Status, CreatedAt, and CreatedById.
380
+ return entityValueAfter;
381
+ } catch (error) {
382
+ throw error;
383
+ }
384
+ }
385
+
386
+ public static async remove(
387
+ loginUser: User, //The currently logged-in user initiating the request.
388
+ dbTransaction: any, //The active database transaction to ensure consistency during the query.
389
+ UserSystemAccessId: number, //The unique identifier of the User System Access record to be deleted.
390
+ ) {
391
+ try {
392
+ // Part 1: Privilege Checking
393
+ // Call loginUser.checkPrivileges() method by passing:
394
+ // - SystemCode: Retrieve from app config.
395
+ // - PrivilegeCode: 'USER_SYSTEM_ACCESS_REMOVE'.
396
+ // If the user does not have the required privileges, throw an appropriate exception.
397
+ const systemCode =
398
+ ApplicationConfig.getComponentConfigValue('system-code');
399
+ const privilegeCode = 'USER_SYSTEM_ACCESS_REMOVE';
400
+ const isPrivileged = await loginUser.checkPrivileges(
401
+ systemCode,
402
+ privilegeCode,
403
+ );
404
+ if (!isPrivileged) {
405
+ throw new ClassError(
406
+ 'UserSystemAccess',
407
+ 'UserSystemAccessErrMsg01',
408
+ 'You do not have permission to access this resource.',
409
+ );
410
+ }
411
+
412
+ // Part 2: Retrieve Record
413
+ // Use the UserSystemAccessRepo.findById(UserSystemAccessId) method to retrieve the record.
414
+ // If the record does not exist, throw an exception indicating the record was not found.
415
+
416
+ const userSystemAccess = await UserSystemAccess._Repository.findOne({
417
+ where: {
418
+ UserSystemAccessId: UserSystemAccessId,
419
+ },
420
+ transaction: dbTransaction,
421
+ });
422
+
423
+ if (!userSystemAccess) {
424
+ throw new ClassError(
425
+ 'UserSystemAccess',
426
+ 'UserSystemAccessErrMsg02',
427
+ 'User System Access not Found',
428
+ );
429
+ }
430
+
431
+ // Part 3: Delete Record
432
+ // Call the UserSystemAccess._Repo.delete() method, passing:
433
+ // - UserSystemAccessId
434
+ // dbTransaction to permanently delete the record from the database.
435
+ await UserSystemAccess._Repository.delete(
436
+ UserSystemAccessId,
437
+ dbTransaction,
438
+ );
439
+
440
+ const entityValueBefore = {
441
+ UserId: userSystemAccess.UserId,
442
+ SystemCode: userSystemAccess.SystemCode,
443
+ Status: userSystemAccess.Status,
444
+ CreatedById: userSystemAccess.CreatedById,
445
+ CreatedAt: userSystemAccess.CreatedAt,
446
+ UpdatedById: userSystemAccess.UpdatedById,
447
+ UpdatedAt: userSystemAccess.UpdatedAt,
448
+ };
449
+
450
+ // Part 4: Record Activity History
451
+ // Instantiate a new activity from the Activity class, and set:
452
+ // - ActivityId: activity.createId()
453
+ // - Action: ActionEnum.Delete
454
+ // - Description: Delete User System Access
455
+ // - EntityType: UserSystemAccess
456
+ // - EntityId: UserSystemAccessId
457
+ // - EntityValueBefore: Stringified representation of the record before deletion.
458
+ // - EntityValueAfter: null.
459
+ // Call the activity.create() method by passing:
460
+ // - dbTransaction
461
+ // - userId: loginUser.UserId.
462
+
463
+ //Instantiate new activity
464
+ const activity = new Activity();
465
+ activity.ActivityId = activity.createId();
466
+ activity.Action = ActionEnum.DELETE;
467
+ activity.Description = 'Delete User System Access';
468
+ activity.EntityType = 'UserSystemAccess';
469
+ activity.EntityId = UserSystemAccessId?.toString();
470
+ activity.EntityValueBefore = JSON.stringify(entityValueBefore);
471
+ activity.EntityValueAfter = JSON.stringify({});
472
+
473
+ //Call Activity.create method
474
+ await activity.create(loginUser.ObjectId, dbTransaction);
475
+ } catch (error) {
476
+ throw error;
477
+ }
478
+ }
181
479
  }
@@ -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
  }