@urbansolv/create-nestjs-app 1.0.2 → 1.2.0
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/dist/templates/nestjs-app/.editorconfig +12 -12
- package/dist/templates/nestjs-app/.env.example +24 -24
- package/dist/templates/nestjs-app/.eslintrc.js +25 -25
- package/dist/templates/nestjs-app/package.json +40 -30
- package/dist/templates/nestjs-app/prisma/schema.prisma +79 -79
- package/dist/templates/nestjs-app/prisma/seed.ts +153 -154
- package/dist/templates/nestjs-app/src/app.module.ts +68 -68
- package/dist/templates/nestjs-app/src/common/constants/permissions.constant.ts +27 -27
- package/dist/templates/nestjs-app/src/common/decorators/api-response.decorator.ts +44 -44
- package/dist/templates/nestjs-app/src/common/decorators/get-user.decorator.ts +11 -11
- package/dist/templates/nestjs-app/src/common/decorators/permissions.decorator.ts +5 -5
- package/dist/templates/nestjs-app/src/common/decorators/public.decorator.ts +4 -4
- package/dist/templates/nestjs-app/src/common/dto/api-response.dto.ts +21 -21
- package/dist/templates/nestjs-app/src/common/dto/pagination.dto.ts +33 -33
- package/dist/templates/nestjs-app/src/common/filters/http-exception.filter.ts +56 -56
- package/dist/templates/nestjs-app/src/common/guards/jwt-auth.guard.ts +32 -32
- package/dist/templates/nestjs-app/src/common/guards/permissions.guard.ts +53 -53
- package/dist/templates/nestjs-app/src/common/interceptors/logging.interceptor.ts +37 -37
- package/dist/templates/nestjs-app/src/common/interceptors/transform.interceptor.ts +55 -55
- package/dist/templates/nestjs-app/src/common/prisma/prisma.module.ts +9 -9
- package/dist/templates/nestjs-app/src/common/prisma/prisma.service.ts +46 -46
- package/dist/templates/nestjs-app/src/common/utils/password.util.ts +13 -13
- package/dist/templates/nestjs-app/src/config/app.config.ts +10 -10
- package/dist/templates/nestjs-app/src/config/database.config.ts +5 -5
- package/dist/templates/nestjs-app/src/config/env.validation.ts +30 -30
- package/dist/templates/nestjs-app/src/config/jwt.config.ts +8 -8
- package/dist/templates/nestjs-app/src/config/swagger.config.ts +6 -6
- package/dist/templates/nestjs-app/src/main.ts +94 -91
- package/dist/templates/nestjs-app/src/modules/auth/auth.module.ts +28 -27
- package/dist/templates/nestjs-app/src/modules/auth/auth.service.ts +180 -54
- package/dist/templates/nestjs-app/src/modules/auth/controllers/v1/auth.controller.ts +33 -33
- package/dist/templates/nestjs-app/src/modules/auth/{dto → core/dto}/auth-response.dto.ts +19 -19
- package/dist/templates/nestjs-app/src/modules/auth/core/dto/login-response.dto.ts +10 -0
- package/dist/templates/nestjs-app/src/modules/auth/{dto → core/dto}/login.dto.ts +15 -15
- package/dist/templates/nestjs-app/src/modules/auth/{dto → core/dto}/register.dto.ts +30 -30
- package/dist/templates/nestjs-app/src/modules/auth/{interfaces → core/interfaces}/jwt-payload.interface.ts +7 -7
- package/dist/templates/nestjs-app/src/modules/auth/{strategies → core/strategies}/jwt.strategy.ts +54 -54
- package/dist/templates/nestjs-app/src/modules/health/health.controller.ts +29 -29
- package/dist/templates/nestjs-app/src/modules/health/health.module.ts +7 -7
- package/dist/templates/nestjs-app/src/modules/users/controllers/v1/users.controller.ts +118 -114
- package/dist/templates/nestjs-app/src/modules/users/core/dto/change-position.dto.ts +9 -9
- package/dist/templates/nestjs-app/src/modules/users/core/dto/create-user.dto.ts +35 -35
- package/dist/templates/nestjs-app/src/modules/users/core/dto/manage-permissions.dto.ts +13 -13
- package/dist/templates/nestjs-app/src/modules/users/core/dto/update-user.dto.ts +30 -30
- package/dist/templates/nestjs-app/src/modules/users/core/dto/user-query.dto.ts +22 -22
- package/dist/templates/nestjs-app/src/modules/users/core/dto/user-response.dto.ts +32 -0
- package/dist/templates/nestjs-app/src/modules/users/core/entities/user.entity.ts +45 -45
- package/dist/templates/nestjs-app/src/modules/users/core/helpers/user-transform.helper.ts +31 -31
- package/dist/templates/nestjs-app/src/modules/users/users.module.ts +10 -10
- package/dist/templates/nestjs-app/src/modules/users/users.service.ts +340 -340
- package/package.json +2 -2
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
root = true
|
|
2
|
-
|
|
3
|
-
[*]
|
|
4
|
-
charset = utf-8
|
|
5
|
-
indent_style = space
|
|
6
|
-
indent_size = 2
|
|
7
|
-
end_of_line = lf
|
|
8
|
-
insert_final_newline = true
|
|
9
|
-
trim_trailing_whitespace = true
|
|
10
|
-
|
|
11
|
-
[*.md]
|
|
12
|
-
trim_trailing_whitespace = false
|
|
1
|
+
root = true
|
|
2
|
+
|
|
3
|
+
[*]
|
|
4
|
+
charset = utf-8
|
|
5
|
+
indent_style = space
|
|
6
|
+
indent_size = 2
|
|
7
|
+
end_of_line = lf
|
|
8
|
+
insert_final_newline = true
|
|
9
|
+
trim_trailing_whitespace = true
|
|
10
|
+
|
|
11
|
+
[*.md]
|
|
12
|
+
trim_trailing_whitespace = false
|
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
# Application
|
|
2
|
-
NODE_ENV=development
|
|
3
|
-
PORT=3000
|
|
4
|
-
APP_NAME=__PROJECT_NAME__
|
|
5
|
-
|
|
6
|
-
# Database
|
|
7
|
-
DATABASE_URL="postgresql://username:password@localhost:5432/__DATABASE_NAME__?schema=public"
|
|
8
|
-
|
|
9
|
-
# JWT
|
|
10
|
-
JWT_SECRET=your-super-secret-jwt-key-change-this-in-production
|
|
11
|
-
JWT_EXPIRATION=7d
|
|
12
|
-
JWT_REFRESH_SECRET=your-super-secret-refresh-key-change-this-in-production
|
|
13
|
-
JWT_REFRESH_EXPIRATION=30d
|
|
14
|
-
|
|
15
|
-
# CORS
|
|
16
|
-
CORS_ORIGIN=http://localhost:3001
|
|
17
|
-
|
|
18
|
-
# API
|
|
19
|
-
API_PREFIX=api
|
|
20
|
-
API_VERSION=v1
|
|
21
|
-
|
|
22
|
-
# Swagger
|
|
23
|
-
SWAGGER_ENABLED=true
|
|
24
|
-
SWAGGER_PATH=
|
|
1
|
+
# Application
|
|
2
|
+
NODE_ENV=development
|
|
3
|
+
PORT=3000
|
|
4
|
+
APP_NAME=__PROJECT_NAME__
|
|
5
|
+
|
|
6
|
+
# Database
|
|
7
|
+
DATABASE_URL="postgresql://username:password@localhost:5432/__DATABASE_NAME__?schema=public"
|
|
8
|
+
|
|
9
|
+
# JWT
|
|
10
|
+
JWT_SECRET=your-super-secret-jwt-key-change-this-in-production
|
|
11
|
+
JWT_EXPIRATION=7d
|
|
12
|
+
JWT_REFRESH_SECRET=your-super-secret-refresh-key-change-this-in-production
|
|
13
|
+
JWT_REFRESH_EXPIRATION=30d
|
|
14
|
+
|
|
15
|
+
# CORS
|
|
16
|
+
CORS_ORIGIN=http://localhost:3001
|
|
17
|
+
|
|
18
|
+
# API
|
|
19
|
+
API_PREFIX=api
|
|
20
|
+
API_VERSION=v1
|
|
21
|
+
|
|
22
|
+
# Swagger
|
|
23
|
+
SWAGGER_ENABLED=true
|
|
24
|
+
SWAGGER_PATH=docs
|
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
module.exports = {
|
|
2
|
-
parser: '@typescript-eslint/parser',
|
|
3
|
-
parserOptions: {
|
|
4
|
-
project: 'tsconfig.json',
|
|
5
|
-
tsconfigRootDir: __dirname,
|
|
6
|
-
sourceType: 'module',
|
|
7
|
-
},
|
|
8
|
-
plugins: ['@typescript-eslint/eslint-plugin'],
|
|
9
|
-
extends: [
|
|
10
|
-
'plugin:@typescript-eslint/recommended',
|
|
11
|
-
'plugin:prettier/recommended',
|
|
12
|
-
],
|
|
13
|
-
root: true,
|
|
14
|
-
env: {
|
|
15
|
-
node: true,
|
|
16
|
-
jest: true,
|
|
17
|
-
},
|
|
18
|
-
ignorePatterns: ['.eslintrc.js'],
|
|
19
|
-
rules: {
|
|
20
|
-
'@typescript-eslint/interface-name-prefix': 'off',
|
|
21
|
-
'@typescript-eslint/explicit-function-return-type': 'off',
|
|
22
|
-
'@typescript-eslint/explicit-module-boundary-types': 'off',
|
|
23
|
-
'@typescript-eslint/no-explicit-any': 'off',
|
|
24
|
-
},
|
|
25
|
-
};
|
|
1
|
+
module.exports = {
|
|
2
|
+
parser: '@typescript-eslint/parser',
|
|
3
|
+
parserOptions: {
|
|
4
|
+
project: 'tsconfig.json',
|
|
5
|
+
tsconfigRootDir: __dirname,
|
|
6
|
+
sourceType: 'module',
|
|
7
|
+
},
|
|
8
|
+
plugins: ['@typescript-eslint/eslint-plugin'],
|
|
9
|
+
extends: [
|
|
10
|
+
'plugin:@typescript-eslint/recommended',
|
|
11
|
+
'plugin:prettier/recommended',
|
|
12
|
+
],
|
|
13
|
+
root: true,
|
|
14
|
+
env: {
|
|
15
|
+
node: true,
|
|
16
|
+
jest: true,
|
|
17
|
+
},
|
|
18
|
+
ignorePatterns: ['.eslintrc.js'],
|
|
19
|
+
rules: {
|
|
20
|
+
'@typescript-eslint/interface-name-prefix': 'off',
|
|
21
|
+
'@typescript-eslint/explicit-function-return-type': 'off',
|
|
22
|
+
'@typescript-eslint/explicit-module-boundary-types': 'off',
|
|
23
|
+
'@typescript-eslint/no-explicit-any': 'off',
|
|
24
|
+
},
|
|
25
|
+
};
|
|
@@ -1,86 +1,96 @@
|
|
|
1
1
|
{
|
|
2
|
-
"name": "
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "
|
|
5
|
-
"author": "
|
|
2
|
+
"name": "product-2025-11-arbas-be",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "",
|
|
5
|
+
"author": "",
|
|
6
6
|
"private": true,
|
|
7
7
|
"license": "UNLICENSED",
|
|
8
8
|
"scripts": {
|
|
9
|
-
"build": "
|
|
10
|
-
"clean": "rm -rf dist",
|
|
11
|
-
"copy-templates": "cp -r templates dist/",
|
|
12
|
-
"dev": "ts-node src/cli.ts",
|
|
13
|
-
"prepublishOnly": "npm run build",
|
|
9
|
+
"build": "nest build",
|
|
14
10
|
"format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
|
|
11
|
+
"lf": "prettier --write .",
|
|
15
12
|
"start": "nest start",
|
|
16
13
|
"start:dev": "nest start --watch",
|
|
17
14
|
"start:debug": "nest start --debug --watch",
|
|
18
|
-
"start:prod": "node dist/main",
|
|
15
|
+
"start:prod": "node dist/src/main",
|
|
19
16
|
"lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
|
|
20
|
-
"test": "
|
|
17
|
+
"test": "jest",
|
|
21
18
|
"test:watch": "jest --watch",
|
|
22
19
|
"test:cov": "jest --coverage",
|
|
23
20
|
"test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
|
|
24
21
|
"test:e2e": "jest --config ./test/jest-e2e.json",
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"prisma:studio": "prisma studio",
|
|
28
|
-
"prisma:seed": "ts-node prisma/seed.ts"
|
|
22
|
+
"seed": "ts-node prisma/seed/main.ts",
|
|
23
|
+
"seed:locations": "ts-node prisma/seed/seed-locations-postgis.ts"
|
|
29
24
|
},
|
|
30
25
|
"dependencies": {
|
|
31
26
|
"@nestjs/common": "^11.0.1",
|
|
32
27
|
"@nestjs/config": "^4.0.2",
|
|
33
28
|
"@nestjs/core": "^11.0.1",
|
|
29
|
+
"@nestjs/mapped-types": "*",
|
|
34
30
|
"@nestjs/passport": "^11.0.5",
|
|
35
31
|
"@nestjs/platform-express": "^11.0.1",
|
|
36
32
|
"@nestjs/swagger": "^11.2.3",
|
|
37
33
|
"@prisma/client": "^6.19.0",
|
|
34
|
+
"adm-zip": "^0.5.16",
|
|
38
35
|
"bcryptjs": "^3.0.3",
|
|
39
36
|
"class-transformer": "^0.5.1",
|
|
40
|
-
"class-validator": "^0.14.
|
|
41
|
-
"
|
|
37
|
+
"class-validator": "^0.14.2",
|
|
38
|
+
"cloudinary": "^1.41.3",
|
|
39
|
+
"cookie-parser": "^1.4.7",
|
|
40
|
+
"jsonwebtoken": "^9.0.2",
|
|
41
|
+
"multer": "^2.0.2",
|
|
42
|
+
"multer-storage-cloudinary": "^4.0.0",
|
|
42
43
|
"passport": "^0.7.0",
|
|
43
44
|
"passport-jwt": "^4.0.1",
|
|
45
|
+
"prisma": "^6.19.0",
|
|
46
|
+
"proj4": "^2.20.2",
|
|
47
|
+
"puppeteer": "^24.36.0",
|
|
44
48
|
"reflect-metadata": "^0.2.2",
|
|
45
|
-
"rxjs": "^7.8.1"
|
|
49
|
+
"rxjs": "^7.8.1",
|
|
50
|
+
"shapefile": "^0.6.6",
|
|
51
|
+
"swagger-ui-express": "^5.0.1"
|
|
46
52
|
},
|
|
47
53
|
"devDependencies": {
|
|
54
|
+
"@eslint/eslintrc": "^3.2.0",
|
|
55
|
+
"@eslint/js": "^9.18.0",
|
|
48
56
|
"@nestjs/cli": "^11.0.0",
|
|
49
57
|
"@nestjs/schematics": "^11.0.0",
|
|
50
58
|
"@nestjs/testing": "^11.0.1",
|
|
51
|
-
"@types/bcrypt": "^6.0.0",
|
|
52
59
|
"@types/express": "^5.0.5",
|
|
53
60
|
"@types/jest": "^30.0.0",
|
|
61
|
+
"@types/multer": "^2.0.0",
|
|
54
62
|
"@types/node": "^22.10.7",
|
|
55
|
-
"@types/passport-jwt": "^4.0.1",
|
|
56
63
|
"@types/supertest": "^6.0.2",
|
|
57
|
-
"
|
|
58
|
-
"@typescript-eslint/parser": "^8.54.0",
|
|
64
|
+
"dotenv": "^17.2.3",
|
|
59
65
|
"eslint": "^9.18.0",
|
|
60
66
|
"eslint-config-prettier": "^10.0.1",
|
|
61
67
|
"eslint-plugin-prettier": "^5.2.2",
|
|
68
|
+
"globals": "^16.0.0",
|
|
62
69
|
"jest": "^30.0.0",
|
|
63
|
-
"prettier": "
|
|
64
|
-
"prisma": "^6.19.0",
|
|
70
|
+
"prettier": "3.4.2",
|
|
65
71
|
"source-map-support": "^0.5.21",
|
|
66
72
|
"supertest": "^7.0.0",
|
|
67
73
|
"ts-jest": "^29.2.5",
|
|
68
74
|
"ts-loader": "^9.5.2",
|
|
69
75
|
"ts-node": "^10.9.2",
|
|
70
76
|
"tsconfig-paths": "^4.2.0",
|
|
71
|
-
"typescript": "^5.7.3"
|
|
72
|
-
|
|
73
|
-
"prisma": {
|
|
74
|
-
"seed": "ts-node prisma/seed.ts"
|
|
77
|
+
"typescript": "^5.7.3",
|
|
78
|
+
"typescript-eslint": "^8.20.0"
|
|
75
79
|
},
|
|
76
80
|
"jest": {
|
|
77
|
-
"moduleFileExtensions": [
|
|
81
|
+
"moduleFileExtensions": [
|
|
82
|
+
"js",
|
|
83
|
+
"json",
|
|
84
|
+
"ts"
|
|
85
|
+
],
|
|
78
86
|
"rootDir": "src",
|
|
79
87
|
"testRegex": ".*\\.spec\\.ts$",
|
|
80
88
|
"transform": {
|
|
81
89
|
"^.+\\.(t|j)s$": "ts-jest"
|
|
82
90
|
},
|
|
83
|
-
"collectCoverageFrom": [
|
|
91
|
+
"collectCoverageFrom": [
|
|
92
|
+
"**/*.(t|j)s"
|
|
93
|
+
],
|
|
84
94
|
"coverageDirectory": "../coverage",
|
|
85
95
|
"testEnvironment": "node"
|
|
86
96
|
}
|
|
@@ -1,79 +1,79 @@
|
|
|
1
|
-
// This is your Prisma schema file,
|
|
2
|
-
// learn more about it in the docs: https://pris.ly/d/prisma-schema
|
|
3
|
-
|
|
4
|
-
generator client {
|
|
5
|
-
provider = "prisma-client-js"
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
datasource db {
|
|
9
|
-
provider = "postgresql"
|
|
10
|
-
url = env("DATABASE_URL")
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
// ============================================
|
|
14
|
-
// RBAC Schema
|
|
15
|
-
// ============================================
|
|
16
|
-
|
|
17
|
-
model User {
|
|
18
|
-
id Int @id @default(autoincrement())
|
|
19
|
-
email String @unique
|
|
20
|
-
password String
|
|
21
|
-
first_name String
|
|
22
|
-
last_name String
|
|
23
|
-
is_active Boolean @default(true)
|
|
24
|
-
created_at DateTime @default(now())
|
|
25
|
-
updated_at DateTime @updatedAt
|
|
26
|
-
deleted_at DateTime?
|
|
27
|
-
|
|
28
|
-
// Relations
|
|
29
|
-
position_id Int
|
|
30
|
-
position Position @relation(fields: [position_id], references: [id])
|
|
31
|
-
|
|
32
|
-
@@map("users")
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
model Position {
|
|
36
|
-
id Int @id @default(autoincrement())
|
|
37
|
-
name String @unique
|
|
38
|
-
description String?
|
|
39
|
-
is_active Boolean @default(true)
|
|
40
|
-
created_at DateTime @default(now())
|
|
41
|
-
updated_at DateTime @updatedAt
|
|
42
|
-
deleted_at DateTime?
|
|
43
|
-
|
|
44
|
-
// Relations
|
|
45
|
-
users User[]
|
|
46
|
-
position_permissions PositionPermission[]
|
|
47
|
-
|
|
48
|
-
@@map("positions")
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
model Permission {
|
|
52
|
-
id Int @id @default(autoincrement())
|
|
53
|
-
name String @unique
|
|
54
|
-
description String?
|
|
55
|
-
resource String // e.g., 'USER', 'TRANSACTION', 'REPORT'
|
|
56
|
-
action String // e.g., 'VIEW', 'ADD', 'UPDATE', 'DELETE'
|
|
57
|
-
created_at DateTime @default(now())
|
|
58
|
-
updated_at DateTime @updatedAt
|
|
59
|
-
deleted_at DateTime?
|
|
60
|
-
|
|
61
|
-
// Relations
|
|
62
|
-
position_permissions PositionPermission[]
|
|
63
|
-
|
|
64
|
-
@@map("permissions")
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
model PositionPermission {
|
|
68
|
-
id Int @id @default(autoincrement())
|
|
69
|
-
position_id Int
|
|
70
|
-
permission_id Int
|
|
71
|
-
created_at DateTime @default(now())
|
|
72
|
-
|
|
73
|
-
// Relations
|
|
74
|
-
position Position @relation(fields: [position_id], references: [id], onDelete: Cascade)
|
|
75
|
-
permission Permission @relation(fields: [permission_id], references: [id], onDelete: Cascade)
|
|
76
|
-
|
|
77
|
-
@@unique([position_id, permission_id])
|
|
78
|
-
@@map("position_permissions")
|
|
79
|
-
}
|
|
1
|
+
// This is your Prisma schema file,
|
|
2
|
+
// learn more about it in the docs: https://pris.ly/d/prisma-schema
|
|
3
|
+
|
|
4
|
+
generator client {
|
|
5
|
+
provider = "prisma-client-js"
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
datasource db {
|
|
9
|
+
provider = "postgresql"
|
|
10
|
+
url = env("DATABASE_URL")
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
// ============================================
|
|
14
|
+
// RBAC Schema
|
|
15
|
+
// ============================================
|
|
16
|
+
|
|
17
|
+
model User {
|
|
18
|
+
id Int @id @default(autoincrement())
|
|
19
|
+
email String @unique
|
|
20
|
+
password String
|
|
21
|
+
first_name String
|
|
22
|
+
last_name String
|
|
23
|
+
is_active Boolean @default(true)
|
|
24
|
+
created_at DateTime @default(now())
|
|
25
|
+
updated_at DateTime @updatedAt
|
|
26
|
+
deleted_at DateTime?
|
|
27
|
+
|
|
28
|
+
// Relations
|
|
29
|
+
position_id Int
|
|
30
|
+
position Position @relation(fields: [position_id], references: [id])
|
|
31
|
+
|
|
32
|
+
@@map("users")
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
model Position {
|
|
36
|
+
id Int @id @default(autoincrement())
|
|
37
|
+
name String @unique
|
|
38
|
+
description String?
|
|
39
|
+
is_active Boolean @default(true)
|
|
40
|
+
created_at DateTime @default(now())
|
|
41
|
+
updated_at DateTime @updatedAt
|
|
42
|
+
deleted_at DateTime?
|
|
43
|
+
|
|
44
|
+
// Relations
|
|
45
|
+
users User[]
|
|
46
|
+
position_permissions PositionPermission[]
|
|
47
|
+
|
|
48
|
+
@@map("positions")
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
model Permission {
|
|
52
|
+
id Int @id @default(autoincrement())
|
|
53
|
+
name String @unique
|
|
54
|
+
description String?
|
|
55
|
+
resource String // e.g., 'USER', 'TRANSACTION', 'REPORT'
|
|
56
|
+
action String // e.g., 'VIEW', 'ADD', 'UPDATE', 'DELETE'
|
|
57
|
+
created_at DateTime @default(now())
|
|
58
|
+
updated_at DateTime @updatedAt
|
|
59
|
+
deleted_at DateTime?
|
|
60
|
+
|
|
61
|
+
// Relations
|
|
62
|
+
position_permissions PositionPermission[]
|
|
63
|
+
|
|
64
|
+
@@map("permissions")
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
model PositionPermission {
|
|
68
|
+
id Int @id @default(autoincrement())
|
|
69
|
+
position_id Int
|
|
70
|
+
permission_id Int
|
|
71
|
+
created_at DateTime @default(now())
|
|
72
|
+
|
|
73
|
+
// Relations
|
|
74
|
+
position Position @relation(fields: [position_id], references: [id], onDelete: Cascade)
|
|
75
|
+
permission Permission @relation(fields: [permission_id], references: [id], onDelete: Cascade)
|
|
76
|
+
|
|
77
|
+
@@unique([position_id, permission_id])
|
|
78
|
+
@@map("position_permissions")
|
|
79
|
+
}
|