@tomei/sso 0.60.4-dev.5 → 0.60.4-dev.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.commitlintrc.json +22 -22
- package/.gitlab-ci.yml +16 -16
- package/.husky/commit-msg +9 -9
- package/.husky/pre-commit +7 -7
- package/.prettierrc +4 -4
- package/Jenkinsfile +57 -57
- package/README.md +23 -23
- package/__tests__/unit/components/group/group.spec.ts +79 -79
- package/__tests__/unit/components/group-object-privilege/group-object-privilege.spec.ts +88 -88
- package/__tests__/unit/components/group-privilege/group-privilege.spec.ts +68 -68
- package/__tests__/unit/components/group-reporting-user/group-reporting-user.spec.ts +66 -66
- package/__tests__/unit/components/group-system-access/group-system-access.spec.ts +83 -83
- package/__tests__/unit/components/login-user/l.spec.ts +746 -746
- package/__tests__/unit/components/login-user/login.spec.ts +1164 -1164
- package/__tests__/unit/components/password-hash/password-hash.service.spec.ts +31 -31
- package/__tests__/unit/components/system/system.spec.ts +254 -254
- package/__tests__/unit/components/system-privilege/system-privilege.spec.ts +83 -83
- package/__tests__/unit/components/user-group/user-group.spec.ts +86 -86
- package/__tests__/unit/components/user-object-privilege/user-object-privilege.spec.ts +78 -78
- package/__tests__/unit/components/user-privilege/user-privilege.spec.ts +72 -72
- package/__tests__/unit/components/user-system-access/user-system-access.spec.ts +89 -89
- package/__tests__/unit/redis-client/redis.service.spec.ts +23 -23
- package/__tests__/unit/session/session.service.spec.ts +47 -47
- package/__tests__/unit/system-privilege/system-privilage.spec.ts +91 -91
- package/coverage/clover.xml +1452 -1452
- package/coverage/coverage-final.json +47 -47
- package/coverage/lcov-report/base.css +224 -224
- package/coverage/lcov-report/block-navigation.js +87 -87
- package/coverage/lcov-report/components/group/group.repository.ts.html +117 -117
- package/coverage/lcov-report/components/group/group.ts.html +327 -327
- package/coverage/lcov-report/components/group/index.html +130 -130
- package/coverage/lcov-report/components/group-object-privilege/group-object-privilege.repository.ts.html +117 -117
- package/coverage/lcov-report/components/group-object-privilege/group-object-privilege.ts.html +321 -321
- package/coverage/lcov-report/components/group-object-privilege/index.html +130 -130
- package/coverage/lcov-report/components/group-privilege/group-privilege.repository.ts.html +117 -117
- package/coverage/lcov-report/components/group-privilege/group-privilege.ts.html +303 -303
- package/coverage/lcov-report/components/group-privilege/index.html +130 -130
- package/coverage/lcov-report/components/group-reporting-user/group-reporting-user.repository.ts.html +117 -117
- package/coverage/lcov-report/components/group-reporting-user/group-reporting-user.ts.html +327 -327
- package/coverage/lcov-report/components/group-reporting-user/index.html +130 -130
- package/coverage/lcov-report/components/group-system-access/group-system-access.repository.ts.html +117 -117
- package/coverage/lcov-report/components/group-system-access/group-system-access.ts.html +309 -309
- package/coverage/lcov-report/components/group-system-access/index.html +130 -130
- package/coverage/lcov-report/components/login-history/index.html +115 -115
- package/coverage/lcov-report/components/login-history/login-history.repository.ts.html +117 -117
- package/coverage/lcov-report/components/login-user/index.html +130 -130
- package/coverage/lcov-report/components/login-user/login-user.ts.html +5007 -5007
- package/coverage/lcov-report/components/login-user/user.repository.ts.html +117 -117
- package/coverage/lcov-report/components/password-hash/index.html +115 -115
- package/coverage/lcov-report/components/password-hash/password-hash.service.ts.html +126 -126
- package/coverage/lcov-report/components/system/index.html +130 -130
- package/coverage/lcov-report/components/system/system.repository.ts.html +117 -117
- package/coverage/lcov-report/components/system/system.ts.html +909 -909
- package/coverage/lcov-report/components/system-privilege/index.html +130 -130
- package/coverage/lcov-report/components/system-privilege/system-privilege.repository.ts.html +120 -120
- package/coverage/lcov-report/components/system-privilege/system-privilege.ts.html +390 -390
- package/coverage/lcov-report/components/user-group/index.html +130 -130
- package/coverage/lcov-report/components/user-group/user-group.repository.ts.html +117 -117
- package/coverage/lcov-report/components/user-group/user-group.ts.html +354 -354
- package/coverage/lcov-report/components/user-object-privilege/index.html +130 -130
- package/coverage/lcov-report/components/user-object-privilege/user-object-privilege.repository.ts.html +117 -117
- package/coverage/lcov-report/components/user-object-privilege/user-object-privilege.ts.html +312 -312
- package/coverage/lcov-report/components/user-privilege/index.html +130 -130
- package/coverage/lcov-report/components/user-privilege/user-privilege.repository.ts.html +117 -117
- package/coverage/lcov-report/components/user-privilege/user-privilege.ts.html +306 -306
- package/coverage/lcov-report/components/user-system-access/index.html +130 -130
- package/coverage/lcov-report/components/user-system-access/user-system-access.repository.ts.html +117 -117
- package/coverage/lcov-report/components/user-system-access/user-system-access.ts.html +312 -312
- package/coverage/lcov-report/enum/group-type.enum.ts.html +108 -108
- package/coverage/lcov-report/enum/index.html +160 -160
- package/coverage/lcov-report/enum/index.ts.html +93 -93
- package/coverage/lcov-report/enum/user-status.enum.ts.html +105 -105
- package/coverage/lcov-report/enum/yn.enum.ts.html +96 -96
- package/coverage/lcov-report/index.html +370 -370
- package/coverage/lcov-report/models/group-object-privilege.entity.ts.html +333 -333
- package/coverage/lcov-report/models/group-privilege.entity.ts.html +315 -315
- package/coverage/lcov-report/models/group-reporting-user.entity.ts.html +339 -339
- package/coverage/lcov-report/models/group-system-access.entity.ts.html +324 -324
- package/coverage/lcov-report/models/group.entity.ts.html +435 -435
- package/coverage/lcov-report/models/index.html +310 -310
- package/coverage/lcov-report/models/login-history.entity.ts.html +252 -252
- package/coverage/lcov-report/models/staff.entity.ts.html +411 -411
- package/coverage/lcov-report/models/system-privilege.entity.ts.html +354 -354
- package/coverage/lcov-report/models/system.entity.ts.html +423 -423
- package/coverage/lcov-report/models/user-group.entity.ts.html +354 -354
- package/coverage/lcov-report/models/user-object-privilege.entity.ts.html +330 -330
- package/coverage/lcov-report/models/user-privilege.entity.ts.html +315 -315
- package/coverage/lcov-report/models/user-system-access.entity.ts.html +315 -315
- package/coverage/lcov-report/models/user.entity.ts.html +522 -522
- package/coverage/lcov-report/prettify.css +1 -1
- package/coverage/lcov-report/prettify.js +2 -2
- package/coverage/lcov-report/redis-client/index.html +115 -115
- package/coverage/lcov-report/redis-client/redis.service.ts.html +240 -240
- package/coverage/lcov-report/session/index.html +115 -115
- package/coverage/lcov-report/session/session.service.ts.html +246 -246
- package/coverage/lcov-report/sorter.js +196 -196
- package/coverage/lcov.info +2490 -2490
- package/coverage/test-report.xml +128 -128
- package/create-sso-user.sql +39 -39
- package/dist/__tests__/unit/components/group-privilege/group-privilege.test.d.ts +1 -0
- package/dist/__tests__/unit/components/group-privilege/group-privilege.test.js +71 -0
- package/dist/__tests__/unit/components/group-privilege/group-privilege.test.js.map +1 -0
- package/dist/__tests__/unit/components/login-user/login-user.spec.d.ts +0 -0
- package/dist/__tests__/unit/components/login-user/login-user.spec.js +6 -0
- package/dist/__tests__/unit/components/login-user/login-user.spec.js.map +1 -0
- package/dist/src/components/login-history/login-history.js +4 -0
- package/dist/src/components/login-history/login-history.js.map +1 -1
- package/dist/src/components/user-system-access/user-system-access.js +1 -1
- package/dist/src/components/user-system-access/user-system-access.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/eslint.config.mjs +58 -58
- package/jest.config.js +14 -14
- package/migrations/20240314080602-create-user-table.js +124 -124
- package/migrations/20240314080603-create-user-group-table.js +85 -85
- package/migrations/20240314080604-create-user-user-group-table.js +55 -55
- package/migrations/20240314080605-create-login-history-table.js +53 -53
- package/migrations/20240527064925-create-system-table.js +78 -78
- package/migrations/20240527064926-create-system-privilege-table.js +71 -71
- package/migrations/20240527065342-create-group-table.js +93 -93
- package/migrations/20240527065633-create-group-reporting-user-table.js +76 -76
- package/migrations/20240528011551-create-group-system-access-table.js +72 -72
- package/migrations/20240528023018-user-system-access-table.js +75 -75
- package/migrations/20240528032229-user-privilege-table.js +76 -76
- package/migrations/20240528063003-create-group-privilege-table.js +76 -76
- package/migrations/20240528063051-create-group-object-privilege-table.js +84 -84
- package/migrations/20240528063107-create-user-object-privilege-table.js +84 -84
- package/migrations/20240528063108-create-api-key-table.js +85 -85
- package/migrations/20241104104802-create-building-table.js +95 -95
- package/migrations/20250108091132-add-area-manager-user-id-to-building-table.js +14 -14
- package/migrations/20250108091133-add-passcode-to-user-table.js +36 -36
- package/migrations/20250210115636-create-user-reporting-hierarchy.js +76 -76
- package/migrations/20250326043818-crate-user-password-history.js +42 -42
- package/package.json +90 -90
- package/sampledotenv +7 -7
- package/sonar-project.properties +22 -22
- package/src/components/login-history/login-history.ts +5 -0
- package/src/components/user-system-access/user-system-access.ts +1 -1
- package/tsconfig.build.json +5 -5
- package/tsconfig.json +23 -23
package/.commitlintrc.json
CHANGED
@@ -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,10 +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
|
-
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 .
|
10
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.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
|
+
});
|
89
89
|
});
|