@tomei/sso 0.26.9 → 0.28.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (113) 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 +1064 -1064
  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 -86
  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/create-sso-user.sql +39 -39
  28. package/dist/__tests__/unit/components/login-user/login-user.spec.js +0 -5
  29. package/dist/__tests__/unit/components/login-user/login-user.spec.js.map +1 -1
  30. package/dist/__tests__/unit/components/system-privilege/system-privilege.spec.js +0 -3
  31. package/dist/__tests__/unit/components/system-privilege/system-privilege.spec.js.map +1 -1
  32. package/dist/src/components/group-object-privilege/group-object-privilege.d.ts +2 -0
  33. package/dist/src/components/group-object-privilege/group-object-privilege.js +1 -0
  34. package/dist/src/components/group-object-privilege/group-object-privilege.js.map +1 -1
  35. package/dist/src/components/login-user/interfaces/check-user-info-duplicated.interface.d.ts +1 -0
  36. package/dist/src/components/login-user/interfaces/user-info.interface.d.ts +1 -0
  37. package/dist/src/components/login-user/login-user.d.ts +5 -3
  38. package/dist/src/components/login-user/login-user.js +33 -7
  39. package/dist/src/components/login-user/login-user.js.map +1 -1
  40. package/dist/src/components/system-privilege/system-privilege.d.ts +0 -2
  41. package/dist/src/components/system-privilege/system-privilege.js +0 -8
  42. package/dist/src/components/system-privilege/system-privilege.js.map +1 -1
  43. package/dist/src/components/user-object-privilege/user-object-privilege.d.ts +2 -0
  44. package/dist/src/components/user-object-privilege/user-object-privilege.js +1 -0
  45. package/dist/src/components/user-object-privilege/user-object-privilege.js.map +1 -1
  46. package/dist/src/enum/index.d.ts +2 -0
  47. package/dist/src/enum/index.js +2 -0
  48. package/dist/src/enum/index.js.map +1 -1
  49. package/dist/src/enum/login-status.enum.d.ts +4 -0
  50. package/dist/src/enum/login-status.enum.js +9 -0
  51. package/dist/src/enum/login-status.enum.js.map +1 -0
  52. package/dist/src/enum/object-status.enum.d.ts +4 -0
  53. package/dist/src/enum/object-status.enum.js +9 -0
  54. package/dist/src/enum/object-status.enum.js.map +1 -0
  55. package/dist/src/interfaces/group-object-privilege.interface.d.ts +2 -0
  56. package/dist/src/interfaces/system-privilege.interface.d.ts +0 -1
  57. package/dist/src/interfaces/user-object-privilege.interface.d.ts +2 -0
  58. package/dist/src/models/group-object-privilege.entity.d.ts +2 -0
  59. package/dist/src/models/group-object-privilege.entity.js +8 -0
  60. package/dist/src/models/group-object-privilege.entity.js.map +1 -1
  61. package/dist/src/models/login-history.entity.d.ts +2 -0
  62. package/dist/src/models/login-history.entity.js +8 -0
  63. package/dist/src/models/login-history.entity.js.map +1 -1
  64. package/dist/src/models/system-privilege.entity.d.ts +0 -1
  65. package/dist/src/models/system-privilege.entity.js +1 -9
  66. package/dist/src/models/system-privilege.entity.js.map +1 -1
  67. package/dist/src/models/user-object-privilege.entity.d.ts +2 -0
  68. package/dist/src/models/user-object-privilege.entity.js +8 -0
  69. package/dist/src/models/user-object-privilege.entity.js.map +1 -1
  70. package/dist/src/models/user.entity.d.ts +1 -0
  71. package/dist/src/models/user.entity.js +7 -0
  72. package/dist/src/models/user.entity.js.map +1 -1
  73. package/dist/tsconfig.tsbuildinfo +1 -1
  74. package/jest.config.js +14 -14
  75. package/migrations/20240314080602-create-user-table.js +108 -104
  76. package/migrations/20240314080603-create-user-group-table.js +85 -85
  77. package/migrations/20240314080604-create-user-user-group-table.js +55 -55
  78. package/migrations/20240314080605-create-login-history-table.js +53 -49
  79. package/migrations/20240527064925-create-system-table.js +78 -78
  80. package/migrations/20240527064926-create-system-privilege-table.js +67 -71
  81. package/migrations/20240527065342-create-group-table.js +89 -89
  82. package/migrations/20240527065633-create-group-reporting-user-table.js +76 -76
  83. package/migrations/20240528011551-create-group-system-access-table.js +72 -72
  84. package/migrations/20240528023018-user-system-access-table.js +1 -1
  85. package/migrations/20240528032229-user-privilege-table.js +1 -1
  86. package/migrations/20240528063003-create-group-privilege-table.js +1 -1
  87. package/migrations/20240528063051-create-group-object-privilege-table.js +84 -79
  88. package/migrations/20240528063107-create-user-object-privilege-table.js +5 -0
  89. package/package.json +88 -88
  90. package/sampledotenv +7 -7
  91. package/sonar-project.properties +22 -22
  92. package/src/components/group-object-privilege/group-object-privilege.ts +3 -0
  93. package/src/components/login-user/interfaces/check-user-info-duplicated.interface.ts +1 -0
  94. package/src/components/login-user/interfaces/user-info.interface.ts +1 -0
  95. package/src/components/login-user/login-user.ts +39 -8
  96. package/src/components/system-privilege/system-privilege.ts +0 -10
  97. package/src/components/user-object-privilege/user-object-privilege.ts +3 -0
  98. package/src/enum/index.ts +2 -0
  99. package/src/enum/login-status.enum.ts +4 -0
  100. package/src/enum/object-status.enum.ts +4 -0
  101. package/src/interfaces/group-object-privilege.interface.ts +3 -0
  102. package/src/interfaces/system-privilege.interface.ts +0 -1
  103. package/src/interfaces/user-object-privilege.interface.ts +3 -0
  104. package/src/models/group-object-privilege.entity.ts +7 -0
  105. package/src/models/login-history.entity.ts +7 -0
  106. package/src/models/system-privilege.entity.ts +1 -8
  107. package/src/models/user-object-privilege.entity.ts +7 -0
  108. package/src/models/user.entity.ts +6 -0
  109. package/tsconfig.build.json +5 -5
  110. package/tsconfig.json +22 -22
  111. package/dist/__tests__/unit/components/group-privilege/group-privilege.test.d.ts +0 -1
  112. package/dist/__tests__/unit/components/group-privilege/group-privilege.test.js +0 -71
  113. package/dist/__tests__/unit/components/group-privilege/group-privilege.test.js.map +0 -1
@@ -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/.eslintrc CHANGED
@@ -1,16 +1,16 @@
1
- {
2
- "parser": "@typescript-eslint/parser",
3
- "parserOptions": {
4
- "ecmaVersion": "latest",
5
- "sourceType": "module" // Allows for the use of imports
6
- },
7
- "extends": ["plugin:@typescript-eslint/recommended"],
8
- "env": {
9
- "node": true // Enable Node.js global variables
10
- },
11
- "rules": {
12
- "no-console": "off",
13
- "import/prefer-default-export": "off",
14
- "@typescript-eslint/no-unused-vars": "warn"
15
- }
16
- }
1
+ {
2
+ "parser": "@typescript-eslint/parser",
3
+ "parserOptions": {
4
+ "ecmaVersion": "latest",
5
+ "sourceType": "module" // Allows for the use of imports
6
+ },
7
+ "extends": ["plugin:@typescript-eslint/recommended"],
8
+ "env": {
9
+ "node": true // Enable Node.js global variables
10
+ },
11
+ "rules": {
12
+ "no-console": "off",
13
+ "import/prefer-default-export": "off",
14
+ "@typescript-eslint/no-unused-vars": "warn"
15
+ }
16
+ }
package/.eslintrc.js CHANGED
@@ -1,35 +1,35 @@
1
- module.exports = {
2
- parser: "@typescript-eslint/parser",
3
- plugins: ["@typescript-eslint"],
4
-
5
- parserOptions: {
6
- ecmaVersion: "latest", // Allows the use of modern ECMAScript features
7
- sourceType: "module", // Allows for the use of imports
8
- },
9
-
10
- extends: ["eslint:recommended", "plugin:@typescript-eslint/recommended"],
11
- env: {
12
- node: true, // Enable Node.js global variables
13
- },
14
- rules: {
15
- "no-console": "off",
16
- "@typescript-eslint/no-explicit-any": "off",
17
- "@typescript-eslint/no-var-requires": "off",
18
- "@typescript-eslint/explicit-module-boundary-types": "off",
19
- "import/prefer-default-export": "off",
20
- "@typescript-eslint/no-unused-vars": "warn",
21
- "no-useless-catch": "off",
22
- "@typescript-eslint/no-non-null-assertion": "off",
23
- "@typescript-eslint/no-empty-function": "off",
24
- "@typescript-eslint/no-empty-interface": "off",
25
- "@typescript-eslint/no-inferrable-types": "off",
26
- "@typescript-eslint/no-namespace": "off",
27
- "@typescript-eslint/no-use-before-define": "off",
28
- "@typescript-eslint/no-unsafe-assignment": "off",
29
- "@typescript-eslint/no-unsafe-call": "off",
30
- "@typescript-eslint/no-unsafe-member-access": "off",
31
- "@typescript-eslint/no-unsafe-return": "off",
32
- "@typescript-eslint/restrict-template-expressions": "off",
33
- "no-useless-escape": "off",
34
- },
35
- };
1
+ module.exports = {
2
+ parser: "@typescript-eslint/parser",
3
+ plugins: ["@typescript-eslint"],
4
+
5
+ parserOptions: {
6
+ ecmaVersion: "latest", // Allows the use of modern ECMAScript features
7
+ sourceType: "module", // Allows for the use of imports
8
+ },
9
+
10
+ extends: ["eslint:recommended", "plugin:@typescript-eslint/recommended"],
11
+ env: {
12
+ node: true, // Enable Node.js global variables
13
+ },
14
+ rules: {
15
+ "no-console": "off",
16
+ "@typescript-eslint/no-explicit-any": "off",
17
+ "@typescript-eslint/no-var-requires": "off",
18
+ "@typescript-eslint/explicit-module-boundary-types": "off",
19
+ "import/prefer-default-export": "off",
20
+ "@typescript-eslint/no-unused-vars": "warn",
21
+ "no-useless-catch": "off",
22
+ "@typescript-eslint/no-non-null-assertion": "off",
23
+ "@typescript-eslint/no-empty-function": "off",
24
+ "@typescript-eslint/no-empty-interface": "off",
25
+ "@typescript-eslint/no-inferrable-types": "off",
26
+ "@typescript-eslint/no-namespace": "off",
27
+ "@typescript-eslint/no-use-before-define": "off",
28
+ "@typescript-eslint/no-unsafe-assignment": "off",
29
+ "@typescript-eslint/no-unsafe-call": "off",
30
+ "@typescript-eslint/no-unsafe-member-access": "off",
31
+ "@typescript-eslint/no-unsafe-return": "off",
32
+ "@typescript-eslint/restrict-template-expressions": "off",
33
+ "no-useless-escape": "off",
34
+ },
35
+ };
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,16 @@
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
+ 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 .
16
16
  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
  });