@tomei/sso 0.62.0 → 0.64.0-dev.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.
Files changed (177) hide show
  1. package/.commitlintrc.json +22 -22
  2. package/.gitlab-ci.yml +16 -16
  3. package/.husky/commit-msg +9 -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/group/group.spec.ts +79 -79
  9. package/__tests__/unit/components/group-object-privilege/group-object-privilege.spec.ts +88 -88
  10. package/__tests__/unit/components/group-privilege/group-privilege.spec.ts +68 -68
  11. package/__tests__/unit/components/group-reporting-user/group-reporting-user.spec.ts +66 -66
  12. package/__tests__/unit/components/group-system-access/group-system-access.spec.ts +83 -83
  13. package/__tests__/unit/components/login-user/l.spec.ts +746 -746
  14. package/__tests__/unit/components/login-user/login.spec.ts +1164 -1164
  15. package/__tests__/unit/components/password-hash/password-hash.service.spec.ts +31 -31
  16. package/__tests__/unit/components/system/system.spec.ts +254 -254
  17. package/__tests__/unit/components/system-privilege/system-privilege.spec.ts +83 -83
  18. package/__tests__/unit/components/user-group/user-group.spec.ts +86 -86
  19. package/__tests__/unit/components/user-object-privilege/user-object-privilege.spec.ts +78 -78
  20. package/__tests__/unit/components/user-privilege/user-privilege.spec.ts +72 -72
  21. package/__tests__/unit/components/user-system-access/user-system-access.spec.ts +89 -89
  22. package/__tests__/unit/redis-client/redis.service.spec.ts +23 -23
  23. package/__tests__/unit/session/session.service.spec.ts +47 -47
  24. package/__tests__/unit/system-privilege/system-privilage.spec.ts +91 -91
  25. package/create-sso-user.sql +39 -39
  26. package/dist/__tests__/unit/components/group-object-privilege/group-object-privilege.spec.js +1 -1
  27. package/dist/__tests__/unit/components/group-object-privilege/group-object-privilege.spec.js.map +1 -1
  28. package/dist/__tests__/unit/components/group-privilege/group-privilege.spec.js +2 -2
  29. package/dist/__tests__/unit/components/group-privilege/group-privilege.spec.js.map +1 -1
  30. package/dist/__tests__/unit/components/group-privilege/group-privilege.test.d.ts +1 -0
  31. package/dist/__tests__/unit/components/group-privilege/group-privilege.test.js +71 -0
  32. package/dist/__tests__/unit/components/group-privilege/group-privilege.test.js.map +1 -0
  33. package/dist/__tests__/unit/components/group-reporting-user/group-reporting-user.spec.js +2 -2
  34. package/dist/__tests__/unit/components/group-reporting-user/group-reporting-user.spec.js.map +1 -1
  35. package/dist/__tests__/unit/components/login-user/login-user.spec.d.ts +0 -0
  36. package/dist/__tests__/unit/components/login-user/login-user.spec.js +6 -0
  37. package/dist/__tests__/unit/components/login-user/login-user.spec.js.map +1 -0
  38. package/dist/__tests__/unit/components/system/system.spec.js +4 -4
  39. package/dist/__tests__/unit/components/system/system.spec.js.map +1 -1
  40. package/dist/__tests__/unit/session/session.service.spec.js +2 -2
  41. package/dist/__tests__/unit/session/session.service.spec.js.map +1 -1
  42. package/dist/src/components/login-history/index.d.ts +1 -0
  43. package/dist/src/components/login-history/index.js +1 -0
  44. package/dist/src/components/login-history/index.js.map +1 -1
  45. package/dist/src/components/login-history/login-history.repository.d.ts +2 -2
  46. package/dist/src/components/login-history/login-history.repository.js.map +1 -1
  47. package/dist/src/components/login-user/interfaces/user-info.interface.d.ts +1 -0
  48. package/dist/src/components/login-user/login-user.js +1 -0
  49. package/dist/src/components/login-user/login-user.js.map +1 -1
  50. package/dist/src/components/login-user/user.d.ts +28 -3
  51. package/dist/src/components/login-user/user.js +363 -25
  52. package/dist/src/components/login-user/user.js.map +1 -1
  53. package/dist/src/components/user-system-access/user-system-access.js +1 -1
  54. package/dist/src/components/user-system-access/user-system-access.js.map +1 -1
  55. package/dist/src/models/login-history.entity.d.ts +2 -2
  56. package/dist/src/models/login-history.entity.js +13 -13
  57. package/dist/src/models/login-history.entity.js.map +1 -1
  58. package/dist/src/models/user.entity.d.ts +1 -0
  59. package/dist/src/models/user.entity.js +8 -0
  60. package/dist/src/models/user.entity.js.map +1 -1
  61. package/dist/tsconfig.tsbuildinfo +1 -1
  62. package/eslint.config.mjs +58 -58
  63. package/jest.config.js +14 -14
  64. package/migrations/20240314080602-create-user-table.js +124 -124
  65. package/migrations/20240314080603-create-user-group-table.js +85 -85
  66. package/migrations/20240314080604-create-user-user-group-table.js +55 -55
  67. package/migrations/20240314080605-create-login-history-table.js +53 -53
  68. package/migrations/20240527064925-create-system-table.js +78 -78
  69. package/migrations/20240527064926-create-system-privilege-table.js +71 -71
  70. package/migrations/20240527065342-create-group-table.js +93 -93
  71. package/migrations/20240527065633-create-group-reporting-user-table.js +76 -76
  72. package/migrations/20240528011551-create-group-system-access-table.js +72 -72
  73. package/migrations/20240528023018-user-system-access-table.js +75 -75
  74. package/migrations/20240528032229-user-privilege-table.js +76 -76
  75. package/migrations/20240528063003-create-group-privilege-table.js +76 -76
  76. package/migrations/20240528063051-create-group-object-privilege-table.js +84 -84
  77. package/migrations/20240528063107-create-user-object-privilege-table.js +84 -84
  78. package/migrations/20240528063108-create-api-key-table.js +85 -85
  79. package/migrations/20241104104802-create-building-table.js +95 -95
  80. package/migrations/20250108091132-add-area-manager-user-id-to-building-table.js +14 -14
  81. package/migrations/20250108091133-add-passcode-to-user-table.js +36 -36
  82. package/migrations/20250210115636-create-user-reporting-hierarchy.js +76 -76
  83. package/migrations/20250326043818-crate-user-password-history.js +42 -42
  84. package/migrations/20250610070720-added-MFBypassYN-to-sso-user.js +30 -0
  85. package/migrations/20250805085707-add-bulk-approval-code-to-sso-user.js +29 -0
  86. package/package.json +87 -90
  87. package/sampledotenv +7 -7
  88. package/src/components/login-history/index.ts +1 -0
  89. package/src/components/login-history/login-history.repository.ts +4 -4
  90. package/src/components/login-history/login-history.ts +124 -0
  91. package/src/components/login-user/interfaces/user-info.interface.ts +1 -0
  92. package/src/components/login-user/login-user.ts +1 -0
  93. package/src/components/login-user/user.ts +441 -27
  94. package/src/components/user-system-access/user-system-access.ts +1 -1
  95. package/src/interfaces/login-history-search-attr.interface.ts +8 -0
  96. package/src/interfaces/login-history.interface.ts +11 -0
  97. package/src/models/login-history.entity.ts +2 -2
  98. package/src/models/user.entity.ts +7 -0
  99. package/tsconfig.build.json +5 -5
  100. package/tsconfig.json +23 -23
  101. package/coverage/clover.xml +0 -1452
  102. package/coverage/coverage-final.json +0 -47
  103. package/coverage/lcov-report/base.css +0 -224
  104. package/coverage/lcov-report/block-navigation.js +0 -87
  105. package/coverage/lcov-report/components/group/group.repository.ts.html +0 -118
  106. package/coverage/lcov-report/components/group/group.ts.html +0 -328
  107. package/coverage/lcov-report/components/group/index.html +0 -131
  108. package/coverage/lcov-report/components/group-object-privilege/group-object-privilege.repository.ts.html +0 -118
  109. package/coverage/lcov-report/components/group-object-privilege/group-object-privilege.ts.html +0 -322
  110. package/coverage/lcov-report/components/group-object-privilege/index.html +0 -131
  111. package/coverage/lcov-report/components/group-privilege/group-privilege.repository.ts.html +0 -118
  112. package/coverage/lcov-report/components/group-privilege/group-privilege.ts.html +0 -304
  113. package/coverage/lcov-report/components/group-privilege/index.html +0 -131
  114. package/coverage/lcov-report/components/group-reporting-user/group-reporting-user.repository.ts.html +0 -118
  115. package/coverage/lcov-report/components/group-reporting-user/group-reporting-user.ts.html +0 -328
  116. package/coverage/lcov-report/components/group-reporting-user/index.html +0 -131
  117. package/coverage/lcov-report/components/group-system-access/group-system-access.repository.ts.html +0 -118
  118. package/coverage/lcov-report/components/group-system-access/group-system-access.ts.html +0 -310
  119. package/coverage/lcov-report/components/group-system-access/index.html +0 -131
  120. package/coverage/lcov-report/components/login-history/index.html +0 -116
  121. package/coverage/lcov-report/components/login-history/login-history.repository.ts.html +0 -118
  122. package/coverage/lcov-report/components/login-user/index.html +0 -131
  123. package/coverage/lcov-report/components/login-user/login-user.ts.html +0 -5008
  124. package/coverage/lcov-report/components/login-user/user.repository.ts.html +0 -118
  125. package/coverage/lcov-report/components/password-hash/index.html +0 -116
  126. package/coverage/lcov-report/components/password-hash/password-hash.service.ts.html +0 -127
  127. package/coverage/lcov-report/components/system/index.html +0 -131
  128. package/coverage/lcov-report/components/system/system.repository.ts.html +0 -118
  129. package/coverage/lcov-report/components/system/system.ts.html +0 -910
  130. package/coverage/lcov-report/components/system-privilege/index.html +0 -131
  131. package/coverage/lcov-report/components/system-privilege/system-privilege.repository.ts.html +0 -121
  132. package/coverage/lcov-report/components/system-privilege/system-privilege.ts.html +0 -391
  133. package/coverage/lcov-report/components/user-group/index.html +0 -131
  134. package/coverage/lcov-report/components/user-group/user-group.repository.ts.html +0 -118
  135. package/coverage/lcov-report/components/user-group/user-group.ts.html +0 -355
  136. package/coverage/lcov-report/components/user-object-privilege/index.html +0 -131
  137. package/coverage/lcov-report/components/user-object-privilege/user-object-privilege.repository.ts.html +0 -118
  138. package/coverage/lcov-report/components/user-object-privilege/user-object-privilege.ts.html +0 -313
  139. package/coverage/lcov-report/components/user-privilege/index.html +0 -131
  140. package/coverage/lcov-report/components/user-privilege/user-privilege.repository.ts.html +0 -118
  141. package/coverage/lcov-report/components/user-privilege/user-privilege.ts.html +0 -307
  142. package/coverage/lcov-report/components/user-system-access/index.html +0 -131
  143. package/coverage/lcov-report/components/user-system-access/user-system-access.repository.ts.html +0 -118
  144. package/coverage/lcov-report/components/user-system-access/user-system-access.ts.html +0 -313
  145. package/coverage/lcov-report/enum/group-type.enum.ts.html +0 -109
  146. package/coverage/lcov-report/enum/index.html +0 -161
  147. package/coverage/lcov-report/enum/index.ts.html +0 -94
  148. package/coverage/lcov-report/enum/user-status.enum.ts.html +0 -106
  149. package/coverage/lcov-report/enum/yn.enum.ts.html +0 -97
  150. package/coverage/lcov-report/favicon.png +0 -0
  151. package/coverage/lcov-report/index.html +0 -371
  152. package/coverage/lcov-report/models/group-object-privilege.entity.ts.html +0 -334
  153. package/coverage/lcov-report/models/group-privilege.entity.ts.html +0 -316
  154. package/coverage/lcov-report/models/group-reporting-user.entity.ts.html +0 -340
  155. package/coverage/lcov-report/models/group-system-access.entity.ts.html +0 -325
  156. package/coverage/lcov-report/models/group.entity.ts.html +0 -436
  157. package/coverage/lcov-report/models/index.html +0 -311
  158. package/coverage/lcov-report/models/login-history.entity.ts.html +0 -253
  159. package/coverage/lcov-report/models/staff.entity.ts.html +0 -412
  160. package/coverage/lcov-report/models/system-privilege.entity.ts.html +0 -355
  161. package/coverage/lcov-report/models/system.entity.ts.html +0 -424
  162. package/coverage/lcov-report/models/user-group.entity.ts.html +0 -355
  163. package/coverage/lcov-report/models/user-object-privilege.entity.ts.html +0 -331
  164. package/coverage/lcov-report/models/user-privilege.entity.ts.html +0 -316
  165. package/coverage/lcov-report/models/user-system-access.entity.ts.html +0 -316
  166. package/coverage/lcov-report/models/user.entity.ts.html +0 -523
  167. package/coverage/lcov-report/prettify.css +0 -1
  168. package/coverage/lcov-report/prettify.js +0 -2
  169. package/coverage/lcov-report/redis-client/index.html +0 -116
  170. package/coverage/lcov-report/redis-client/redis.service.ts.html +0 -241
  171. package/coverage/lcov-report/session/index.html +0 -116
  172. package/coverage/lcov-report/session/session.service.ts.html +0 -247
  173. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  174. package/coverage/lcov-report/sorter.js +0 -196
  175. package/coverage/lcov.info +0 -2490
  176. package/coverage/test-report.xml +0 -129
  177. package/sonar-project.properties +0 -23
@@ -1,22 +1,22 @@
1
- {
2
- "extends": [
3
- "@commitlint/config-conventional"
4
- ],
5
- "rules": {
6
- "header-max-length": [ 2, "always", 120 ],
7
- "type-enum": [
8
- 2,
9
- "always",
10
- [
11
- "breaking",
12
- "feat",
13
- "fix",
14
- "refactor",
15
- "config",
16
- "test",
17
- "docs",
18
- "chore"
19
- ]
20
- ]
21
- }
22
- }
1
+ {
2
+ "extends": [
3
+ "@commitlint/config-conventional"
4
+ ],
5
+ "rules": {
6
+ "header-max-length": [ 2, "always", 120 ],
7
+ "type-enum": [
8
+ 2,
9
+ "always",
10
+ [
11
+ "breaking",
12
+ "feat",
13
+ "fix",
14
+ "refactor",
15
+ "config",
16
+ "test",
17
+ "docs",
18
+ "chore"
19
+ ]
20
+ ]
21
+ }
22
+ }
package/.gitlab-ci.yml CHANGED
@@ -1,16 +1,16 @@
1
- variables:
2
- SONAR_USER_HOME: "${CI_PROJECT_DIR}/.sonar" # Defines the location of the analysis task cache
3
- GIT_DEPTH: "0" # Tells git to fetch all the branches of the project, required by the analysis task
4
- sonarcloud-check:
5
- image:
6
- name: sonarsource/sonar-scanner-cli:latest
7
- entrypoint: [""]
8
- cache:
9
- key: "${CI_JOB_NAME}"
10
- paths:
11
- - .sonar/cache
12
- script:
13
- - sonar-scanner
14
- only:
15
- - merge_requests
16
- - main
1
+ variables:
2
+ SONAR_USER_HOME: "${CI_PROJECT_DIR}/.sonar" # Defines the location of the analysis task cache
3
+ GIT_DEPTH: "0" # Tells git to fetch all the branches of the project, required by the analysis task
4
+ sonarcloud-check:
5
+ image:
6
+ name: sonarsource/sonar-scanner-cli:latest
7
+ entrypoint: [""]
8
+ cache:
9
+ key: "${CI_JOB_NAME}"
10
+ paths:
11
+ - .sonar/cache
12
+ script:
13
+ - sonar-scanner
14
+ only:
15
+ - merge_requests
16
+ - main
package/.husky/commit-msg CHANGED
@@ -1,16 +1,10 @@
1
- #!/usr/bin/env sh
2
- . "$(dirname -- "$0")/_/husky.sh"
3
-
4
- npx commitlint --edit $1
5
- message="$(cat $1)"
6
- echo "$message"
7
- a=($(echo "$message" | tr ':' '\n'))
8
- echo "${a[0]}"
9
- # if [ "${a[0]}" = "feat" ];
10
- # then
11
- # npm version --commit-hooks false --no-git-tag-version minor
12
- # else
13
- # npm version --commit-hooks false --no-git-tag-version patch
14
- # fi
15
- git add .
1
+ #!/usr/bin/env sh
2
+ . "$(dirname -- "$0")/_/husky.sh"
3
+
4
+ npx commitlint --edit $1
5
+ message="$(cat $1)"
6
+ echo "$message"
7
+ a=($(echo "$message" | tr ':' '\n'))
8
+ echo "${a[0]}"
9
+ git add .
16
10
  git commit -m "$message" --no-verify
package/.husky/pre-commit CHANGED
@@ -1,7 +1,7 @@
1
- #!/usr/bin/env sh
2
- . "$(dirname -- "$0")/_/husky.sh"
3
-
4
- npm run lint
5
- npm run format
6
- npm run build
7
- git add .
1
+ #!/usr/bin/env sh
2
+ . "$(dirname -- "$0")/_/husky.sh"
3
+
4
+ npm run lint
5
+ npm run format
6
+ npm run build
7
+ git add .
package/.prettierrc CHANGED
@@ -1,4 +1,4 @@
1
- {
2
- "singleQuote": true,
3
- "trailingComma": "all"
4
- }
1
+ {
2
+ "singleQuote": true,
3
+ "trailingComma": "all"
4
+ }
package/Jenkinsfile CHANGED
@@ -1,57 +1,57 @@
1
- pipeline {
2
- agent {
3
- kubernetes {
4
- label 'jenkins-agent'
5
- namespace 'devops-tools'
6
- }
7
- }
8
- tools {nodejs "node18"}
9
- stages {
10
- stage('Install') {
11
- steps {
12
- echo 'Install Dependencies..'
13
- sh 'npm install'
14
- }
15
- }
16
- stage('Test') {
17
- steps {
18
- echo 'Testing..'
19
- sh 'npm run test'
20
- }
21
- }
22
- stage('Build') {
23
- steps {
24
- echo 'Building..'
25
- sh 'npm run build'
26
- }
27
- }
28
- stage('Publish') {
29
- steps {
30
- echo 'Publish..'
31
- withCredentials([
32
- usernamePassword(credentialsId: 'npm-auth-token', usernameVariable: 'NPM_USERNAME', passwordVariable: 'AUTH_TOKEN')
33
- ]) {
34
- sh "npm set //registry.npmjs.org/:_authToken=$AUTH_TOKEN"
35
- sh "npm publish"
36
- }
37
- }
38
- }
39
- }
40
-
41
- post {
42
- success {
43
- script {
44
- def gitAuthor = sh(returnStdout: true, script: 'git log -1 --pretty=format:%an').trim()
45
- discordSend description: "Git Commit: ${env.GIT_COMMIT}\nGit Branch: ${env.GIT_BRANCH}\nGit URL: ${env.GIT_URL}\nGit Author: ${gitAuthor}", footer: '', image: '', link: env.BUILD_URL, result: 'SUCCESS', scmWebUrl: '', thumbnail: '', title: "${env.JOB_NAME} Build #${env.BUILD_NUMBER} Success", webhookURL: 'https://discord.com/api/webhooks/1117705705466642434/UWgw32kQerM5HOr-fcCYD2aQxE1koeN_4CSCEzDZz1EAI3vNaysAw0YU7YUrb4TozOw0'
46
- }
47
- }
48
-
49
- failure {
50
- script {
51
- def gitAuthor = sh(returnStdout: true, script: 'git log -1 --pretty=format:%an').trim()
52
- discordSend description: "Git Commit: ${env.GIT_COMMIT}\nGit Branch: ${env.GIT_BRANCH}\nGit URL: ${env.GIT_URL}\nGit Author: ${gitAuthor}", footer: '', image: '', link: env.BUILD_URL, result: 'FAILURE', scmWebUrl: '', thumbnail: '', title: "${env.JOB_NAME} Build #${env.BUILD_NUMBER} Failed", webhookURL: 'https://discord.com/api/webhooks/1117705705466642434/UWgw32kQerM5HOr-fcCYD2aQxE1koeN_4CSCEzDZz1EAI3vNaysAw0YU7YUrb4TozOw0'
53
- }
54
- }
55
- }
56
-
57
- }
1
+ pipeline {
2
+ agent {
3
+ kubernetes {
4
+ label 'jenkins-agent'
5
+ namespace 'devops-tools'
6
+ }
7
+ }
8
+ tools {nodejs "node18"}
9
+ stages {
10
+ stage('Install') {
11
+ steps {
12
+ echo 'Install Dependencies..'
13
+ sh 'npm install'
14
+ }
15
+ }
16
+ stage('Test') {
17
+ steps {
18
+ echo 'Testing..'
19
+ sh 'npm run test'
20
+ }
21
+ }
22
+ stage('Build') {
23
+ steps {
24
+ echo 'Building..'
25
+ sh 'npm run build'
26
+ }
27
+ }
28
+ stage('Publish') {
29
+ steps {
30
+ echo 'Publish..'
31
+ withCredentials([
32
+ usernamePassword(credentialsId: 'npm-auth-token', usernameVariable: 'NPM_USERNAME', passwordVariable: 'AUTH_TOKEN')
33
+ ]) {
34
+ sh "npm set //registry.npmjs.org/:_authToken=$AUTH_TOKEN"
35
+ sh "npm publish"
36
+ }
37
+ }
38
+ }
39
+ }
40
+
41
+ post {
42
+ success {
43
+ script {
44
+ def gitAuthor = sh(returnStdout: true, script: 'git log -1 --pretty=format:%an').trim()
45
+ discordSend description: "Git Commit: ${env.GIT_COMMIT}\nGit Branch: ${env.GIT_BRANCH}\nGit URL: ${env.GIT_URL}\nGit Author: ${gitAuthor}", footer: '', image: '', link: env.BUILD_URL, result: 'SUCCESS', scmWebUrl: '', thumbnail: '', title: "${env.JOB_NAME} Build #${env.BUILD_NUMBER} Success", webhookURL: 'https://discord.com/api/webhooks/1117705705466642434/UWgw32kQerM5HOr-fcCYD2aQxE1koeN_4CSCEzDZz1EAI3vNaysAw0YU7YUrb4TozOw0'
46
+ }
47
+ }
48
+
49
+ failure {
50
+ script {
51
+ def gitAuthor = sh(returnStdout: true, script: 'git log -1 --pretty=format:%an').trim()
52
+ discordSend description: "Git Commit: ${env.GIT_COMMIT}\nGit Branch: ${env.GIT_BRANCH}\nGit URL: ${env.GIT_URL}\nGit Author: ${gitAuthor}", footer: '', image: '', link: env.BUILD_URL, result: 'FAILURE', scmWebUrl: '', thumbnail: '', title: "${env.JOB_NAME} Build #${env.BUILD_NUMBER} Failed", webhookURL: 'https://discord.com/api/webhooks/1117705705466642434/UWgw32kQerM5HOr-fcCYD2aQxE1koeN_4CSCEzDZz1EAI3vNaysAw0YU7YUrb4TozOw0'
53
+ }
54
+ }
55
+ }
56
+
57
+ }
package/README.md CHANGED
@@ -1,23 +1,23 @@
1
- ## SSO Package
2
-
3
- ### How to use
4
- - run `npm i`
5
- - Make sure you set the environment in .sampledotenv in your project `.env` file
6
- - run `npm run start:dev`
7
-
8
- ### How create a new migration
9
- - Make sure you have `DATABASE_URL` and `SHADOW_DATABASE_URL` in your project `.env` file
10
- - create a new empty database. dont do migration on it and set the `SHADOW_DATABASE_URL` to it
11
- - Create a database user
12
- - Grant the above user privileges to alter sso tables and shadow database. The user should have access to the sso table and shadow database only. Use `create-sso-user.sql` as an example to create the user and grant privileges
13
- - Make changes to the `schema.prisma` file
14
- - Run `npx prisma migrate dev --name <migration-name> --preview-feature --create-only` to create the migration. The migration will be created in the `migrations` folder.
15
- - open the newly created migration. review the migration and make changes if necessary.
16
-
17
- notes:
18
- - if you create a new table, after migration has been created, change the default character set to `latin1` from `utf8mb4` and remove COLLATE phrase.please also add it to the `create-sso-user.sql` file for references
19
-
20
- ### How to run migration
21
- - run `npx prisma migrate deploy` to run the migration
22
- - run `npx prisma generate` to generate the prisma client
23
-
1
+ ## SSO Package
2
+
3
+ ### How to use
4
+ - run `npm i`
5
+ - Make sure you set the environment in .sampledotenv in your project `.env` file
6
+ - run `npm run start:dev`
7
+
8
+ ### How create a new migration
9
+ - Make sure you have `DATABASE_URL` and `SHADOW_DATABASE_URL` in your project `.env` file
10
+ - create a new empty database. dont do migration on it and set the `SHADOW_DATABASE_URL` to it
11
+ - Create a database user
12
+ - Grant the above user privileges to alter sso tables and shadow database. The user should have access to the sso table and shadow database only. Use `create-sso-user.sql` as an example to create the user and grant privileges
13
+ - Make changes to the `schema.prisma` file
14
+ - Run `npx prisma migrate dev --name <migration-name> --preview-feature --create-only` to create the migration. The migration will be created in the `migrations` folder.
15
+ - open the newly created migration. review the migration and make changes if necessary.
16
+
17
+ notes:
18
+ - if you create a new table, after migration has been created, change the default character set to `latin1` from `utf8mb4` and remove COLLATE phrase.please also add it to the `create-sso-user.sql` file for references
19
+
20
+ ### How to run migration
21
+ - run `npx prisma migrate deploy` to run the migration
22
+ - run `npx prisma generate` to generate the prisma client
23
+
@@ -1,80 +1,80 @@
1
- import { Group } from '../../../../src/components/group/group';
2
- import { GroupRepository } from '../../../../src/components/group/group.repository';
3
- import { ClassError } from '@tomei/general';
4
- import { GroupTypeEnum } from '../../../../src/enum/group-type.enum';
5
-
6
-
7
- describe('Group', () => {
8
- afterEach(() => {
9
- jest.clearAllMocks();
10
- });
11
-
12
- it('should initialize a group with valid GroupCode', async () => {
13
- const groupAttr = {
14
- GroupCode: 'group1',
15
- Name: 'Group 1',
16
- Description: 'This is Group 1',
17
- Type: GroupTypeEnum.ROLE,
18
- ParentGroupCode: 'parentGroup1',
19
- InheritParentPrivilegeYN: 'Y',
20
- InheritParentSystemAccessYN: 'N',
21
- Status: 'Active',
22
- CreatedById: 1,
23
- CreatedAt: new Date(),
24
- UpdatedById: 2,
25
- UpdatedAt: new Date(),
26
- };
27
-
28
- const groupRepositoryMock = jest.spyOn(GroupRepository.prototype, 'findByPk').mockResolvedValueOnce({
29
- ...groupAttr,
30
- get: () => groupAttr,
31
- } as any);
32
-
33
- const result = await Group.init(null, 'group1');
34
-
35
- expect(result).toBeInstanceOf(Group);
36
- expect(result.GroupCode).toBe(groupAttr.GroupCode);
37
- expect(result.Name).toBe(groupAttr.Name);
38
- expect(result.Description).toBe(groupAttr.Description);
39
- expect(result.Type).toBe(groupAttr.Type);
40
- expect(result.ParentGroupCode).toBe(groupAttr.ParentGroupCode);
41
- expect(result.InheritParentPrivilegeYN).toBe(groupAttr.InheritParentPrivilegeYN);
42
- expect(result.InheritParentSystemAccessYN).toBe(groupAttr.InheritParentSystemAccessYN);
43
- expect(result.Status).toBe(groupAttr.Status);
44
- expect(result.CreatedById).toBe(groupAttr.CreatedById);
45
- expect(result.CreatedAt).toBe(groupAttr.CreatedAt);
46
- expect(result.UpdatedById).toBe(groupAttr.UpdatedById);
47
- expect(result.UpdatedAt).toBe(groupAttr.UpdatedAt);
48
-
49
- expect(groupRepositoryMock).toHaveBeenCalledTimes(1);
50
- expect(groupRepositoryMock).toHaveBeenCalledWith('group1', {
51
- transaction: null,
52
- });
53
- });
54
-
55
- it('should throw an error when initializing a group with invalid GroupCode', async () => {
56
- const groupRepositoryMock = jest.spyOn(GroupRepository.prototype, 'findByPk').mockResolvedValueOnce(null);
57
-
58
- await expect(Group.init(null, 'invalidGroupCode')).rejects.toThrow(
59
- new ClassError('Group', 'GroupErrMsg01', 'Failed To Initialize Group')
60
- );
61
-
62
- expect(groupRepositoryMock).toHaveBeenCalledTimes(1);
63
- expect(groupRepositoryMock).toHaveBeenCalledWith('invalidGroupCode', {
64
- transaction: null,
65
- });
66
- });
67
-
68
- it('should throw an error when initializing a group with an error', async () => {
69
- const groupRepositoryMock = jest.spyOn(GroupRepository.prototype, 'findByPk').mockRejectedValueOnce(new Error('Database error'));
70
-
71
- await expect(Group.init(null, 'group1')).rejects.toThrow(
72
- new ClassError('Group', 'GroupErrMsg01', 'Failed To Initialize Group')
73
- );
74
-
75
- expect(groupRepositoryMock).toHaveBeenCalledTimes(1);
76
- expect(groupRepositoryMock).toHaveBeenCalledWith('group1', {
77
- transaction: null,
78
- });
79
- });
1
+ import { Group } from '../../../../src/components/group/group';
2
+ import { GroupRepository } from '../../../../src/components/group/group.repository';
3
+ import { ClassError } from '@tomei/general';
4
+ import { GroupTypeEnum } from '../../../../src/enum/group-type.enum';
5
+
6
+
7
+ describe('Group', () => {
8
+ afterEach(() => {
9
+ jest.clearAllMocks();
10
+ });
11
+
12
+ it('should initialize a group with valid GroupCode', async () => {
13
+ const groupAttr = {
14
+ GroupCode: 'group1',
15
+ Name: 'Group 1',
16
+ Description: 'This is Group 1',
17
+ Type: GroupTypeEnum.ROLE,
18
+ ParentGroupCode: 'parentGroup1',
19
+ InheritParentPrivilegeYN: 'Y',
20
+ InheritParentSystemAccessYN: 'N',
21
+ Status: 'Active',
22
+ CreatedById: 1,
23
+ CreatedAt: new Date(),
24
+ UpdatedById: 2,
25
+ UpdatedAt: new Date(),
26
+ };
27
+
28
+ const groupRepositoryMock = jest.spyOn(GroupRepository.prototype, 'findByPk').mockResolvedValueOnce({
29
+ ...groupAttr,
30
+ get: () => groupAttr,
31
+ } as any);
32
+
33
+ const result = await Group.init(null, 'group1');
34
+
35
+ expect(result).toBeInstanceOf(Group);
36
+ expect(result.GroupCode).toBe(groupAttr.GroupCode);
37
+ expect(result.Name).toBe(groupAttr.Name);
38
+ expect(result.Description).toBe(groupAttr.Description);
39
+ expect(result.Type).toBe(groupAttr.Type);
40
+ expect(result.ParentGroupCode).toBe(groupAttr.ParentGroupCode);
41
+ expect(result.InheritParentPrivilegeYN).toBe(groupAttr.InheritParentPrivilegeYN);
42
+ expect(result.InheritParentSystemAccessYN).toBe(groupAttr.InheritParentSystemAccessYN);
43
+ expect(result.Status).toBe(groupAttr.Status);
44
+ expect(result.CreatedById).toBe(groupAttr.CreatedById);
45
+ expect(result.CreatedAt).toBe(groupAttr.CreatedAt);
46
+ expect(result.UpdatedById).toBe(groupAttr.UpdatedById);
47
+ expect(result.UpdatedAt).toBe(groupAttr.UpdatedAt);
48
+
49
+ expect(groupRepositoryMock).toHaveBeenCalledTimes(1);
50
+ expect(groupRepositoryMock).toHaveBeenCalledWith('group1', {
51
+ transaction: null,
52
+ });
53
+ });
54
+
55
+ it('should throw an error when initializing a group with invalid GroupCode', async () => {
56
+ const groupRepositoryMock = jest.spyOn(GroupRepository.prototype, 'findByPk').mockResolvedValueOnce(null);
57
+
58
+ await expect(Group.init(null, 'invalidGroupCode')).rejects.toThrow(
59
+ new ClassError('Group', 'GroupErrMsg01', 'Failed To Initialize Group')
60
+ );
61
+
62
+ expect(groupRepositoryMock).toHaveBeenCalledTimes(1);
63
+ expect(groupRepositoryMock).toHaveBeenCalledWith('invalidGroupCode', {
64
+ transaction: null,
65
+ });
66
+ });
67
+
68
+ it('should throw an error when initializing a group with an error', async () => {
69
+ const groupRepositoryMock = jest.spyOn(GroupRepository.prototype, 'findByPk').mockRejectedValueOnce(new Error('Database error'));
70
+
71
+ await expect(Group.init(null, 'group1')).rejects.toThrow(
72
+ new ClassError('Group', 'GroupErrMsg01', 'Failed To Initialize Group')
73
+ );
74
+
75
+ expect(groupRepositoryMock).toHaveBeenCalledTimes(1);
76
+ expect(groupRepositoryMock).toHaveBeenCalledWith('group1', {
77
+ transaction: null,
78
+ });
79
+ });
80
80
  });
@@ -1,89 +1,89 @@
1
- import { GroupObjectPrivilegeRepository } from '../../../../src/components/group-object-privilege/group-object-privilege.repository';
2
- import { GroupObjectPrivilege } from '../../../../src/components/group-object-privilege/group-object-privilege';
3
-
4
- describe('GroupObjectPrivilege', () => {
5
- let groupObjectPrivilege: GroupObjectPrivilege;
6
-
7
- beforeEach(() => {
8
- groupObjectPrivilege = new GroupObjectPrivilege();
9
- });
10
-
11
- it('should create an instance of GroupObjectPrivilege', () => {
12
- expect(groupObjectPrivilege).toBeInstanceOf(GroupObjectPrivilege);
13
- });
14
-
15
- it('should have the correct TableName', () => {
16
- expect(groupObjectPrivilege.TableName).toBe('sso_GroupObjectPrivilege');
17
- });
18
-
19
- it('should have the correct properties', () => {
20
- expect(groupObjectPrivilege.ObjectName).toBeUndefined();
21
- expect(groupObjectPrivilege.GroupObjectPrivilegeId).toBeUndefined();
22
- expect(groupObjectPrivilege.GroupCode).toBeUndefined();
23
- expect(groupObjectPrivilege.SystemPrivilegeId).toBeUndefined();
24
- expect(groupObjectPrivilege.ObjectId).toBeUndefined();
25
- expect(groupObjectPrivilege.ObjectType).toBeUndefined();
26
- expect(groupObjectPrivilege.CreatedAt).toBeUndefined();
27
- expect(groupObjectPrivilege.UpdatedAt).toBeUndefined();
28
- expect(groupObjectPrivilege.CreatedById).toBeUndefined();
29
- expect(groupObjectPrivilege.UpdatedById).toBeUndefined();
30
- });
31
-
32
- describe('init', () => {
33
- it('should return an instance of GroupObjectPrivilege when GroupObjectPrivilegeId is provided', async () => {
34
- const GroupObjectPrivilegeId = 1;
35
- const mockGroupObjectPrivilegeAttr = {
36
- GroupObjectPrivilegeId,
37
- GroupCode: 'groupCode',
38
- SystemPrivilegeId: 'SystemPrivilegeId',
39
- ObjectId: 'objectId',
40
- ObjectType: 'objectType',
41
- CreatedAt: new Date(),
42
- UpdatedAt: new Date(),
43
- CreatedById: 1,
44
- UpdatedById: 2,
45
- };
46
-
47
- jest.spyOn(GroupObjectPrivilegeRepository.prototype, 'findOne').mockResolvedValueOnce({
48
- get: () => mockGroupObjectPrivilegeAttr,
49
- } as any);
50
-
51
- const result = await GroupObjectPrivilege.init(null, GroupObjectPrivilegeId);
52
-
53
- expect(result).toBeInstanceOf(GroupObjectPrivilege);
54
- expect(result.GroupObjectPrivilegeId).toBe(GroupObjectPrivilegeId);
55
- expect(result.GroupCode).toBe(mockGroupObjectPrivilegeAttr.GroupCode);
56
- expect(result.SystemPrivilegeId).toBe(mockGroupObjectPrivilegeAttr.SystemPrivilegeId);
57
- expect(result.ObjectId).toBe(mockGroupObjectPrivilegeAttr.ObjectId);
58
- expect(result.ObjectType).toBe(mockGroupObjectPrivilegeAttr.ObjectType);
59
- expect(result.CreatedAt).toBe(mockGroupObjectPrivilegeAttr.CreatedAt);
60
- expect(result.UpdatedAt).toBe(mockGroupObjectPrivilegeAttr.UpdatedAt);
61
- expect(result.CreatedById).toBe(mockGroupObjectPrivilegeAttr.CreatedById);
62
- expect(result.UpdatedById).toBe(mockGroupObjectPrivilegeAttr.UpdatedById);
63
- });
64
-
65
- it('should throw an error when GroupObjectPrivilegeId is provided but no GroupObjectPrivilege is found', async () => {
66
- const GroupObjectPrivilegeId = 1;
67
- jest.spyOn(GroupObjectPrivilegeRepository.prototype, 'findOne').mockResolvedValueOnce(null);
68
-
69
- await expect(GroupObjectPrivilege.init(null, GroupObjectPrivilegeId)).rejects.toThrowError(
70
- 'GroupObjectPrivilege not found',
71
- );
72
- });
73
-
74
- it('should return a new instance of GroupObjectPrivilege when GroupObjectPrivilegeId is not provided', async () => {
75
- const result = await GroupObjectPrivilege.init();
76
-
77
- expect(result).toBeInstanceOf(GroupObjectPrivilege);
78
- expect(result.GroupObjectPrivilegeId).toBeUndefined();
79
- expect(result.GroupCode).toBeUndefined();
80
- expect(result.SystemPrivilegeId).toBeUndefined();
81
- expect(result.ObjectId).toBeUndefined();
82
- expect(result.ObjectType).toBeUndefined();
83
- expect(result.CreatedAt).toBeUndefined();
84
- expect(result.UpdatedAt).toBeUndefined();
85
- expect(result.CreatedById).toBeUndefined();
86
- expect(result.UpdatedById).toBeUndefined();
87
- });
88
- });
1
+ import { GroupObjectPrivilegeRepository } from '../../../../src/components/group-object-privilege/group-object-privilege.repository';
2
+ import { GroupObjectPrivilege } from '../../../../src/components/group-object-privilege/group-object-privilege';
3
+
4
+ describe('GroupObjectPrivilege', () => {
5
+ let groupObjectPrivilege: GroupObjectPrivilege;
6
+
7
+ beforeEach(() => {
8
+ groupObjectPrivilege = new GroupObjectPrivilege();
9
+ });
10
+
11
+ it('should create an instance of GroupObjectPrivilege', () => {
12
+ expect(groupObjectPrivilege).toBeInstanceOf(GroupObjectPrivilege);
13
+ });
14
+
15
+ it('should have the correct TableName', () => {
16
+ expect(groupObjectPrivilege.TableName).toBe('sso_GroupObjectPrivilege');
17
+ });
18
+
19
+ it('should have the correct properties', () => {
20
+ expect(groupObjectPrivilege.ObjectName).toBeUndefined();
21
+ expect(groupObjectPrivilege.GroupObjectPrivilegeId).toBeUndefined();
22
+ expect(groupObjectPrivilege.GroupCode).toBeUndefined();
23
+ expect(groupObjectPrivilege.SystemPrivilegeId).toBeUndefined();
24
+ expect(groupObjectPrivilege.ObjectId).toBeUndefined();
25
+ expect(groupObjectPrivilege.ObjectType).toBeUndefined();
26
+ expect(groupObjectPrivilege.CreatedAt).toBeUndefined();
27
+ expect(groupObjectPrivilege.UpdatedAt).toBeUndefined();
28
+ expect(groupObjectPrivilege.CreatedById).toBeUndefined();
29
+ expect(groupObjectPrivilege.UpdatedById).toBeUndefined();
30
+ });
31
+
32
+ describe('init', () => {
33
+ it('should return an instance of GroupObjectPrivilege when GroupObjectPrivilegeId is provided', async () => {
34
+ const GroupObjectPrivilegeId = 1;
35
+ const mockGroupObjectPrivilegeAttr = {
36
+ GroupObjectPrivilegeId,
37
+ GroupCode: 'groupCode',
38
+ SystemPrivilegeId: 'SystemPrivilegeId',
39
+ ObjectId: 'objectId',
40
+ ObjectType: 'objectType',
41
+ CreatedAt: new Date(),
42
+ UpdatedAt: new Date(),
43
+ CreatedById: 1,
44
+ UpdatedById: 2,
45
+ };
46
+
47
+ jest.spyOn(GroupObjectPrivilegeRepository.prototype, 'findOne').mockResolvedValueOnce({
48
+ get: () => mockGroupObjectPrivilegeAttr,
49
+ } as any);
50
+
51
+ const result = await GroupObjectPrivilege.init(null, GroupObjectPrivilegeId);
52
+
53
+ expect(result).toBeInstanceOf(GroupObjectPrivilege);
54
+ expect(result.GroupObjectPrivilegeId).toBe(GroupObjectPrivilegeId);
55
+ expect(result.GroupCode).toBe(mockGroupObjectPrivilegeAttr.GroupCode);
56
+ expect(result.SystemPrivilegeId).toBe(mockGroupObjectPrivilegeAttr.SystemPrivilegeId);
57
+ expect(result.ObjectId).toBe(mockGroupObjectPrivilegeAttr.ObjectId);
58
+ expect(result.ObjectType).toBe(mockGroupObjectPrivilegeAttr.ObjectType);
59
+ expect(result.CreatedAt).toBe(mockGroupObjectPrivilegeAttr.CreatedAt);
60
+ expect(result.UpdatedAt).toBe(mockGroupObjectPrivilegeAttr.UpdatedAt);
61
+ expect(result.CreatedById).toBe(mockGroupObjectPrivilegeAttr.CreatedById);
62
+ expect(result.UpdatedById).toBe(mockGroupObjectPrivilegeAttr.UpdatedById);
63
+ });
64
+
65
+ it('should throw an error when GroupObjectPrivilegeId is provided but no GroupObjectPrivilege is found', async () => {
66
+ const GroupObjectPrivilegeId = 1;
67
+ jest.spyOn(GroupObjectPrivilegeRepository.prototype, 'findOne').mockResolvedValueOnce(null);
68
+
69
+ await expect(GroupObjectPrivilege.init(null, GroupObjectPrivilegeId)).rejects.toThrow(
70
+ 'GroupObjectPrivilege not found',
71
+ );
72
+ });
73
+
74
+ it('should return a new instance of GroupObjectPrivilege when GroupObjectPrivilegeId is not provided', async () => {
75
+ const result = await GroupObjectPrivilege.init();
76
+
77
+ expect(result).toBeInstanceOf(GroupObjectPrivilege);
78
+ expect(result.GroupObjectPrivilegeId).toBeUndefined();
79
+ expect(result.GroupCode).toBeUndefined();
80
+ expect(result.SystemPrivilegeId).toBeUndefined();
81
+ expect(result.ObjectId).toBeUndefined();
82
+ expect(result.ObjectType).toBeUndefined();
83
+ expect(result.CreatedAt).toBeUndefined();
84
+ expect(result.UpdatedAt).toBeUndefined();
85
+ expect(result.CreatedById).toBeUndefined();
86
+ expect(result.UpdatedById).toBeUndefined();
87
+ });
88
+ });
89
89
  });