lapeh 2.2.6 → 2.2.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.
Files changed (52) hide show
  1. package/api-testing-sepuluh/.env.example +19 -0
  2. package/api-testing-sepuluh/doc/ARCHITECTURE_GUIDE.md +73 -0
  3. package/api-testing-sepuluh/doc/CHANGELOG.md +77 -0
  4. package/api-testing-sepuluh/doc/CHEATSHEET.md +94 -0
  5. package/api-testing-sepuluh/doc/CLI.md +106 -0
  6. package/api-testing-sepuluh/doc/CONTRIBUTING.md +105 -0
  7. package/api-testing-sepuluh/doc/DEPLOYMENT.md +122 -0
  8. package/api-testing-sepuluh/doc/FAQ.md +81 -0
  9. package/api-testing-sepuluh/doc/FEATURES.md +165 -0
  10. package/api-testing-sepuluh/doc/GETTING_STARTED.md +108 -0
  11. package/api-testing-sepuluh/doc/INTRODUCTION.md +60 -0
  12. package/api-testing-sepuluh/doc/PACKAGES.md +66 -0
  13. package/api-testing-sepuluh/doc/PERFORMANCE.md +91 -0
  14. package/api-testing-sepuluh/doc/ROADMAP.md +93 -0
  15. package/api-testing-sepuluh/doc/SECURITY.md +93 -0
  16. package/api-testing-sepuluh/doc/STRUCTURE.md +90 -0
  17. package/api-testing-sepuluh/doc/TUTORIAL.md +192 -0
  18. package/api-testing-sepuluh/docker-compose.yml +24 -0
  19. package/api-testing-sepuluh/eslint.config.mjs +26 -0
  20. package/api-testing-sepuluh/framework.md +168 -0
  21. package/api-testing-sepuluh/nodemon.json +6 -0
  22. package/api-testing-sepuluh/package-lock.json +5539 -0
  23. package/api-testing-sepuluh/package.json +103 -0
  24. package/api-testing-sepuluh/prisma/base.prisma.template +7 -0
  25. package/api-testing-sepuluh/prisma/migrations/20251227034737_init_setup/migration.sql +248 -0
  26. package/api-testing-sepuluh/prisma/migrations/migration_lock.toml +3 -0
  27. package/api-testing-sepuluh/prisma/schema.prisma +183 -0
  28. package/api-testing-sepuluh/prisma/seed.ts +411 -0
  29. package/api-testing-sepuluh/prisma.config.ts +15 -0
  30. package/api-testing-sepuluh/readme.md +414 -0
  31. package/api-testing-sepuluh/scripts/check-update.js +92 -0
  32. package/api-testing-sepuluh/scripts/compile-schema.js +29 -0
  33. package/api-testing-sepuluh/scripts/config-clear.js +45 -0
  34. package/api-testing-sepuluh/scripts/generate-jwt-secret.js +38 -0
  35. package/api-testing-sepuluh/scripts/init-project.js +178 -0
  36. package/api-testing-sepuluh/scripts/make-controller.js +205 -0
  37. package/api-testing-sepuluh/scripts/make-model.js +42 -0
  38. package/api-testing-sepuluh/scripts/make-module.js +158 -0
  39. package/api-testing-sepuluh/scripts/verify-rbac-functional.js +187 -0
  40. package/api-testing-sepuluh/src/controllers/authController.ts +469 -0
  41. package/api-testing-sepuluh/src/controllers/petController.ts +194 -0
  42. package/api-testing-sepuluh/src/controllers/rbacController.ts +478 -0
  43. package/api-testing-sepuluh/src/models/core.prisma +163 -0
  44. package/api-testing-sepuluh/src/models/pets.prisma +9 -0
  45. package/api-testing-sepuluh/src/routes/auth.ts +74 -0
  46. package/api-testing-sepuluh/src/routes/index.ts +10 -0
  47. package/api-testing-sepuluh/src/routes/pets.ts +13 -0
  48. package/api-testing-sepuluh/src/routes/rbac.ts +42 -0
  49. package/api-testing-sepuluh/storage/logs/.gitkeep +0 -0
  50. package/api-testing-sepuluh/tsconfig.json +39 -0
  51. package/bin/index.js +68 -13
  52. package/package.json +1 -1
@@ -0,0 +1,103 @@
1
+ {
2
+ "name": "api-testing-sepuluh",
3
+ "version": "1.0.0",
4
+ "description": "Generated by lapeh",
5
+ "main": "index.js",
6
+ "homepage": "https://github.com/robyajo/lapeh#readme",
7
+ "bugs": {
8
+ "url": "https://github.com/robyajo/lapeh/issues"
9
+ },
10
+ "types": "dist/src/index.d.ts",
11
+ "scripts": {
12
+ "dev": "lapeh dev",
13
+ "first": "node scripts/init-project.js",
14
+ "prebuild": "npm run prisma:generate",
15
+ "build": "lapeh build",
16
+ "prestart": "npm run prisma:generate",
17
+ "start": "lapeh start",
18
+ "prestart:prod": "npm run prisma:generate",
19
+ "start:prod": "lapeh start",
20
+ "typecheck": "tsc --noEmit",
21
+ "lint": "eslint .",
22
+ "lint:fix": "eslint . --fix",
23
+ "prisma:generate": "node scripts/compile-schema.js && prisma generate",
24
+ "prisma:migrate": "node scripts/compile-schema.js && prisma migrate dev",
25
+ "prisma:deploy": "node scripts/compile-schema.js && prisma migrate deploy",
26
+ "db:seed": "prisma db seed",
27
+ "db:reset": "prisma migrate reset",
28
+ "db:rs": "prisma migrate reset --force && prisma db seed",
29
+ "db:studio": "prisma studio",
30
+ "generate:jwt": "node scripts/generate-jwt-secret.js",
31
+ "make:module": "node scripts/make-module.js",
32
+ "make:model": "node scripts/make-model.js",
33
+ "make:controller": "node scripts/make-controller.js",
34
+ "config:clear": "node scripts/config-clear.js"
35
+ },
36
+ "keywords": [
37
+ "nodejs-framework",
38
+ "typescript-framework",
39
+ "express-framework",
40
+ "backend-framework",
41
+ "rest-api",
42
+ "prisma-orm",
43
+ "production-ready",
44
+ "api-generator",
45
+ "boilerplate",
46
+ "starter-kit",
47
+ "mvc",
48
+ "cli",
49
+ "lapeh",
50
+ "roby-ajo",
51
+ "ajo-roby",
52
+ "roby-karti-s",
53
+ "lapeh"
54
+ ],
55
+ "author": "Roby Karti S <robyfull.dev@gmail.com>",
56
+ "license": "MIT",
57
+ "type": "commonjs",
58
+ "dependencies": {
59
+ "@prisma/adapter-mariadb": "7.2.0",
60
+ "@prisma/adapter-pg": "7.2.0",
61
+ "@prisma/client": "7.2.0",
62
+ "bcryptjs": "3.0.3",
63
+ "compression": "^1.8.1",
64
+ "cors": "2.8.5",
65
+ "dotenv": "17.2.3",
66
+ "express": "5.2.1",
67
+ "express-rate-limit": "8.2.1",
68
+ "fast-json-stringify": "^6.1.1",
69
+ "helmet": "8.1.0",
70
+ "ioredis": "5.8.2",
71
+ "ioredis-mock": "^8.13.1",
72
+ "jsonwebtoken": "9.0.3",
73
+ "multer": "2.0.2",
74
+ "pg": "8.16.3",
75
+ "slugify": "1.6.6",
76
+ "socket.io": "4.8.3",
77
+ "ts-node": "^10.9.2",
78
+ "tsconfig-paths": "^4.2.0",
79
+ "typescript": "^5.9.3",
80
+ "uuid": "13.0.0",
81
+ "winston": "^3.19.0",
82
+ "winston-daily-rotate-file": "^5.0.0",
83
+ "zod": "3.23.8",
84
+ "prisma": "7.2.0",
85
+ "lapeh": "file:../"
86
+ },
87
+ "devDependencies": {
88
+ "@eslint/js": "^9.39.2",
89
+ "@types/bcryptjs": "2.4.6",
90
+ "@types/compression": "^1.7.5",
91
+ "@types/cors": "2.8.19",
92
+ "@types/express": "^5.0.0",
93
+ "@types/jsonwebtoken": "9.0.10",
94
+ "@types/multer": "^2.0.0",
95
+ "@types/node": "25.0.3",
96
+ "@types/pg": "8.16.0",
97
+ "@types/uuid": "10.0.0",
98
+ "eslint": "^9.39.2",
99
+ "globals": "^16.5.0",
100
+ "typescript-eslint": "^8.50.1",
101
+ "prisma": "7.2.0"
102
+ }
103
+ }
@@ -0,0 +1,7 @@
1
+ generator client {
2
+ provider = "prisma-client-js"
3
+ }
4
+
5
+ datasource db {
6
+ provider = "postgresql"
7
+ }
@@ -0,0 +1,248 @@
1
+ -- CreateTable
2
+ CREATE TABLE "cache" (
3
+ "key" TEXT NOT NULL,
4
+ "value" TEXT NOT NULL,
5
+ "expiration" INTEGER NOT NULL,
6
+
7
+ CONSTRAINT "cache_pkey" PRIMARY KEY ("key")
8
+ );
9
+
10
+ -- CreateTable
11
+ CREATE TABLE "cache_locks" (
12
+ "key" TEXT NOT NULL,
13
+ "owner" TEXT NOT NULL,
14
+ "expiration" INTEGER NOT NULL,
15
+
16
+ CONSTRAINT "cache_locks_pkey" PRIMARY KEY ("key")
17
+ );
18
+
19
+ -- CreateTable
20
+ CREATE TABLE "failed_jobs" (
21
+ "id" BIGSERIAL NOT NULL,
22
+ "uuid" TEXT NOT NULL,
23
+ "connection" TEXT NOT NULL,
24
+ "queue" TEXT NOT NULL,
25
+ "payload" TEXT NOT NULL,
26
+ "exception" TEXT NOT NULL,
27
+ "failed_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
28
+
29
+ CONSTRAINT "failed_jobs_pkey" PRIMARY KEY ("id")
30
+ );
31
+
32
+ -- CreateTable
33
+ CREATE TABLE "job_batches" (
34
+ "id" TEXT NOT NULL,
35
+ "name" TEXT NOT NULL,
36
+ "total_jobs" INTEGER NOT NULL,
37
+ "pending_jobs" INTEGER NOT NULL,
38
+ "failed_jobs" INTEGER NOT NULL,
39
+ "failed_job_ids" TEXT NOT NULL,
40
+ "options" TEXT,
41
+ "cancelled_at" INTEGER,
42
+ "created_at" INTEGER NOT NULL,
43
+ "finished_at" INTEGER,
44
+
45
+ CONSTRAINT "job_batches_pkey" PRIMARY KEY ("id")
46
+ );
47
+
48
+ -- CreateTable
49
+ CREATE TABLE "jobs" (
50
+ "id" BIGSERIAL NOT NULL,
51
+ "queue" TEXT NOT NULL,
52
+ "payload" TEXT NOT NULL,
53
+ "attempts" INTEGER NOT NULL,
54
+ "reserved_at" INTEGER,
55
+ "available_at" INTEGER NOT NULL,
56
+ "created_at" INTEGER NOT NULL,
57
+
58
+ CONSTRAINT "jobs_pkey" PRIMARY KEY ("id")
59
+ );
60
+
61
+ -- CreateTable
62
+ CREATE TABLE "migrations" (
63
+ "id" SERIAL NOT NULL,
64
+ "migration" TEXT NOT NULL,
65
+ "batch" INTEGER NOT NULL,
66
+
67
+ CONSTRAINT "migrations_pkey" PRIMARY KEY ("id")
68
+ );
69
+
70
+ -- CreateTable
71
+ CREATE TABLE "password_reset_tokens" (
72
+ "email" TEXT NOT NULL,
73
+ "token" TEXT NOT NULL,
74
+ "created_at" TIMESTAMP(3),
75
+
76
+ CONSTRAINT "password_reset_tokens_pkey" PRIMARY KEY ("email")
77
+ );
78
+
79
+ -- CreateTable
80
+ CREATE TABLE "personal_access_tokens" (
81
+ "id" BIGSERIAL NOT NULL,
82
+ "tokenable_type" TEXT NOT NULL,
83
+ "tokenable_id" BIGINT NOT NULL,
84
+ "name" TEXT NOT NULL,
85
+ "token" TEXT NOT NULL,
86
+ "abilities" TEXT,
87
+ "last_used_at" TIMESTAMP(3),
88
+ "expires_at" TIMESTAMP(3),
89
+ "created_at" TIMESTAMP(3),
90
+ "updated_at" TIMESTAMP(3),
91
+
92
+ CONSTRAINT "personal_access_tokens_pkey" PRIMARY KEY ("id")
93
+ );
94
+
95
+ -- CreateTable
96
+ CREATE TABLE "sessions" (
97
+ "id" TEXT NOT NULL,
98
+ "user_id" BIGINT,
99
+ "ip_address" TEXT,
100
+ "user_agent" TEXT,
101
+ "payload" TEXT NOT NULL,
102
+ "last_activity" INTEGER NOT NULL,
103
+
104
+ CONSTRAINT "sessions_pkey" PRIMARY KEY ("id")
105
+ );
106
+
107
+ -- CreateTable
108
+ CREATE TABLE "users" (
109
+ "id" BIGSERIAL NOT NULL,
110
+ "uuid" TEXT NOT NULL,
111
+ "name" TEXT NOT NULL,
112
+ "email" TEXT NOT NULL,
113
+ "avatar" TEXT,
114
+ "avatar_url" TEXT,
115
+ "email_verified_at" TIMESTAMP(3),
116
+ "password" TEXT NOT NULL,
117
+ "remember_token" TEXT,
118
+ "created_at" TIMESTAMP(3),
119
+ "updated_at" TIMESTAMP(3),
120
+
121
+ CONSTRAINT "users_pkey" PRIMARY KEY ("id")
122
+ );
123
+
124
+ -- CreateTable
125
+ CREATE TABLE "roles" (
126
+ "id" BIGSERIAL NOT NULL,
127
+ "name" TEXT NOT NULL,
128
+ "slug" TEXT NOT NULL,
129
+ "description" TEXT,
130
+ "created_at" TIMESTAMP(3),
131
+ "updated_at" TIMESTAMP(3),
132
+
133
+ CONSTRAINT "roles_pkey" PRIMARY KEY ("id")
134
+ );
135
+
136
+ -- CreateTable
137
+ CREATE TABLE "permissions" (
138
+ "id" BIGSERIAL NOT NULL,
139
+ "name" TEXT NOT NULL,
140
+ "slug" TEXT NOT NULL,
141
+ "description" TEXT,
142
+ "created_at" TIMESTAMP(3),
143
+ "updated_at" TIMESTAMP(3),
144
+
145
+ CONSTRAINT "permissions_pkey" PRIMARY KEY ("id")
146
+ );
147
+
148
+ -- CreateTable
149
+ CREATE TABLE "user_roles" (
150
+ "id" BIGSERIAL NOT NULL,
151
+ "user_id" BIGINT NOT NULL,
152
+ "role_id" BIGINT NOT NULL,
153
+ "created_at" TIMESTAMP(3),
154
+
155
+ CONSTRAINT "user_roles_pkey" PRIMARY KEY ("id")
156
+ );
157
+
158
+ -- CreateTable
159
+ CREATE TABLE "role_permissions" (
160
+ "id" BIGSERIAL NOT NULL,
161
+ "role_id" BIGINT NOT NULL,
162
+ "permission_id" BIGINT NOT NULL,
163
+ "created_at" TIMESTAMP(3),
164
+
165
+ CONSTRAINT "role_permissions_pkey" PRIMARY KEY ("id")
166
+ );
167
+
168
+ -- CreateTable
169
+ CREATE TABLE "user_permissions" (
170
+ "id" BIGSERIAL NOT NULL,
171
+ "user_id" BIGINT NOT NULL,
172
+ "permission_id" BIGINT NOT NULL,
173
+ "created_at" TIMESTAMP(3),
174
+
175
+ CONSTRAINT "user_permissions_pkey" PRIMARY KEY ("id")
176
+ );
177
+
178
+ -- CreateTable
179
+ CREATE TABLE "pets" (
180
+ "id" BIGSERIAL NOT NULL,
181
+ "name" TEXT NOT NULL,
182
+ "species" TEXT NOT NULL,
183
+ "age" INTEGER NOT NULL,
184
+ "created_at" TIMESTAMP(3),
185
+ "updated_at" TIMESTAMP(3),
186
+
187
+ CONSTRAINT "pets_pkey" PRIMARY KEY ("id")
188
+ );
189
+
190
+ -- CreateIndex
191
+ CREATE UNIQUE INDEX "failed_jobs_uuid_key" ON "failed_jobs"("uuid");
192
+
193
+ -- CreateIndex
194
+ CREATE INDEX "jobs_queue_idx" ON "jobs"("queue");
195
+
196
+ -- CreateIndex
197
+ CREATE UNIQUE INDEX "personal_access_tokens_token_key" ON "personal_access_tokens"("token");
198
+
199
+ -- CreateIndex
200
+ CREATE INDEX "personal_access_tokens_expires_at_idx" ON "personal_access_tokens"("expires_at");
201
+
202
+ -- CreateIndex
203
+ CREATE INDEX "personal_access_tokens_tokenable_type_tokenable_id_idx" ON "personal_access_tokens"("tokenable_type", "tokenable_id");
204
+
205
+ -- CreateIndex
206
+ CREATE INDEX "sessions_last_activity_idx" ON "sessions"("last_activity");
207
+
208
+ -- CreateIndex
209
+ CREATE INDEX "sessions_user_id_idx" ON "sessions"("user_id");
210
+
211
+ -- CreateIndex
212
+ CREATE UNIQUE INDEX "users_uuid_key" ON "users"("uuid");
213
+
214
+ -- CreateIndex
215
+ CREATE UNIQUE INDEX "users_email_key" ON "users"("email");
216
+
217
+ -- CreateIndex
218
+ CREATE UNIQUE INDEX "roles_slug_key" ON "roles"("slug");
219
+
220
+ -- CreateIndex
221
+ CREATE UNIQUE INDEX "permissions_slug_key" ON "permissions"("slug");
222
+
223
+ -- CreateIndex
224
+ CREATE UNIQUE INDEX "user_roles_user_id_role_id_key" ON "user_roles"("user_id", "role_id");
225
+
226
+ -- CreateIndex
227
+ CREATE UNIQUE INDEX "role_permissions_role_id_permission_id_key" ON "role_permissions"("role_id", "permission_id");
228
+
229
+ -- CreateIndex
230
+ CREATE UNIQUE INDEX "user_permissions_user_id_permission_id_key" ON "user_permissions"("user_id", "permission_id");
231
+
232
+ -- AddForeignKey
233
+ ALTER TABLE "user_roles" ADD CONSTRAINT "user_roles_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE NO ACTION;
234
+
235
+ -- AddForeignKey
236
+ ALTER TABLE "user_roles" ADD CONSTRAINT "user_roles_role_id_fkey" FOREIGN KEY ("role_id") REFERENCES "roles"("id") ON DELETE CASCADE ON UPDATE NO ACTION;
237
+
238
+ -- AddForeignKey
239
+ ALTER TABLE "role_permissions" ADD CONSTRAINT "role_permissions_role_id_fkey" FOREIGN KEY ("role_id") REFERENCES "roles"("id") ON DELETE CASCADE ON UPDATE NO ACTION;
240
+
241
+ -- AddForeignKey
242
+ ALTER TABLE "role_permissions" ADD CONSTRAINT "role_permissions_permission_id_fkey" FOREIGN KEY ("permission_id") REFERENCES "permissions"("id") ON DELETE CASCADE ON UPDATE NO ACTION;
243
+
244
+ -- AddForeignKey
245
+ ALTER TABLE "user_permissions" ADD CONSTRAINT "user_permissions_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE NO ACTION;
246
+
247
+ -- AddForeignKey
248
+ ALTER TABLE "user_permissions" ADD CONSTRAINT "user_permissions_permission_id_fkey" FOREIGN KEY ("permission_id") REFERENCES "permissions"("id") ON DELETE CASCADE ON UPDATE NO ACTION;
@@ -0,0 +1,3 @@
1
+ # Please do not edit this file manually
2
+ # It should be added in your version-control system (e.g., Git)
3
+ provider = "postgresql"
@@ -0,0 +1,183 @@
1
+ generator client {
2
+ provider = "prisma-client-js"
3
+ }
4
+
5
+ datasource db {
6
+ provider = "postgresql"
7
+ }
8
+
9
+
10
+ model cache {
11
+ key String @id
12
+ value String
13
+ expiration Int
14
+ }
15
+
16
+ model cache_locks {
17
+ key String @id
18
+ owner String
19
+ expiration Int
20
+ }
21
+
22
+ model failed_jobs {
23
+ id BigInt @id @default(autoincrement())
24
+ uuid String @unique
25
+ connection String
26
+ queue String
27
+ payload String
28
+ exception String
29
+ failed_at DateTime @default(now())
30
+ }
31
+
32
+ model job_batches {
33
+ id String @id
34
+ name String
35
+ total_jobs Int
36
+ pending_jobs Int
37
+ failed_jobs Int
38
+ failed_job_ids String
39
+ options String?
40
+ cancelled_at Int?
41
+ created_at Int
42
+ finished_at Int?
43
+ }
44
+
45
+ model jobs {
46
+ id BigInt @id @default(autoincrement())
47
+ queue String
48
+ payload String
49
+ attempts Int
50
+ reserved_at Int?
51
+ available_at Int
52
+ created_at Int
53
+
54
+ @@index([queue])
55
+ }
56
+
57
+ model migrations {
58
+ id Int @id @default(autoincrement())
59
+ migration String
60
+ batch Int
61
+ }
62
+
63
+ model password_reset_tokens {
64
+ email String @id
65
+ token String
66
+ created_at DateTime?
67
+ }
68
+
69
+ model personal_access_tokens {
70
+ id BigInt @id @default(autoincrement())
71
+ tokenable_type String
72
+ tokenable_id BigInt
73
+ name String
74
+ token String @unique
75
+ abilities String?
76
+ last_used_at DateTime?
77
+ expires_at DateTime?
78
+ created_at DateTime?
79
+ updated_at DateTime?
80
+
81
+ @@index([expires_at])
82
+ @@index([tokenable_type, tokenable_id])
83
+ }
84
+
85
+ model sessions {
86
+ id String @id
87
+ user_id BigInt?
88
+ ip_address String?
89
+ user_agent String?
90
+ payload String
91
+ last_activity Int
92
+
93
+ @@index([last_activity])
94
+ @@index([user_id])
95
+ }
96
+
97
+ model users {
98
+ id BigInt @id @default(autoincrement())
99
+ uuid String @unique
100
+ name String
101
+ email String @unique
102
+ avatar String?
103
+ avatar_url String?
104
+ email_verified_at DateTime?
105
+ password String
106
+ remember_token String?
107
+ created_at DateTime?
108
+ updated_at DateTime?
109
+
110
+ user_roles user_roles[]
111
+ user_permissions user_permissions[]
112
+ }
113
+
114
+ model roles {
115
+ id BigInt @id @default(autoincrement())
116
+ name String
117
+ slug String @unique
118
+ description String?
119
+ created_at DateTime?
120
+ updated_at DateTime?
121
+
122
+ user_roles user_roles[]
123
+ role_permissions role_permissions[]
124
+ }
125
+
126
+ model permissions {
127
+ id BigInt @id @default(autoincrement())
128
+ name String
129
+ slug String @unique
130
+ description String?
131
+ created_at DateTime?
132
+ updated_at DateTime?
133
+
134
+ role_permissions role_permissions[]
135
+ user_permissions user_permissions[]
136
+ }
137
+
138
+ model user_roles {
139
+ id BigInt @id @default(autoincrement())
140
+ user_id BigInt
141
+ role_id BigInt
142
+ created_at DateTime?
143
+
144
+ user users @relation(fields: [user_id], references: [id], onDelete: Cascade, onUpdate: NoAction)
145
+ role roles @relation(fields: [role_id], references: [id], onDelete: Cascade, onUpdate: NoAction)
146
+
147
+ @@unique([user_id, role_id])
148
+ }
149
+
150
+ model role_permissions {
151
+ id BigInt @id @default(autoincrement())
152
+ role_id BigInt
153
+ permission_id BigInt
154
+ created_at DateTime?
155
+
156
+ role roles @relation(fields: [role_id], references: [id], onDelete: Cascade, onUpdate: NoAction)
157
+ permission permissions @relation(fields: [permission_id], references: [id], onDelete: Cascade, onUpdate: NoAction)
158
+
159
+ @@unique([role_id, permission_id])
160
+ }
161
+
162
+ model user_permissions {
163
+ id BigInt @id @default(autoincrement())
164
+ user_id BigInt
165
+ permission_id BigInt
166
+ created_at DateTime?
167
+
168
+ user users @relation(fields: [user_id], references: [id], onDelete: Cascade, onUpdate: NoAction)
169
+ permission permissions @relation(fields: [permission_id], references: [id], onDelete: Cascade, onUpdate: NoAction)
170
+
171
+ @@unique([user_id, permission_id])
172
+ }
173
+
174
+
175
+
176
+ model pets {
177
+ id BigInt @id @default(autoincrement())
178
+ name String
179
+ species String
180
+ age Int
181
+ created_at DateTime?
182
+ updated_at DateTime?
183
+ }