lapeh 2.3.7 → 2.3.9

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.
@@ -0,0 +1,163 @@
1
+ model cache {
2
+ key String @id
3
+ value String
4
+ expiration Int
5
+ }
6
+
7
+ model cache_locks {
8
+ key String @id
9
+ owner String
10
+ expiration Int
11
+ }
12
+
13
+ model failed_jobs {
14
+ id BigInt @id @default(autoincrement())
15
+ uuid String @unique
16
+ connection String
17
+ queue String
18
+ payload String
19
+ exception String
20
+ failed_at DateTime @default(now())
21
+ }
22
+
23
+ model job_batches {
24
+ id String @id
25
+ name String
26
+ total_jobs Int
27
+ pending_jobs Int
28
+ failed_jobs Int
29
+ failed_job_ids String
30
+ options String?
31
+ cancelled_at Int?
32
+ created_at Int
33
+ finished_at Int?
34
+ }
35
+
36
+ model jobs {
37
+ id BigInt @id @default(autoincrement())
38
+ queue String
39
+ payload String
40
+ attempts Int
41
+ reserved_at Int?
42
+ available_at Int
43
+ created_at Int
44
+
45
+ @@index([queue])
46
+ }
47
+
48
+ model migrations {
49
+ id Int @id @default(autoincrement())
50
+ migration String
51
+ batch Int
52
+ }
53
+
54
+ model password_reset_tokens {
55
+ email String @id
56
+ token String
57
+ created_at DateTime?
58
+ }
59
+
60
+ model personal_access_tokens {
61
+ id BigInt @id @default(autoincrement())
62
+ tokenable_type String
63
+ tokenable_id BigInt
64
+ name String
65
+ token String @unique
66
+ abilities String?
67
+ last_used_at DateTime?
68
+ expires_at DateTime?
69
+ created_at DateTime?
70
+ updated_at DateTime?
71
+
72
+ @@index([expires_at])
73
+ @@index([tokenable_type, tokenable_id])
74
+ }
75
+
76
+ model sessions {
77
+ id String @id
78
+ user_id BigInt?
79
+ ip_address String?
80
+ user_agent String?
81
+ payload String
82
+ last_activity Int
83
+
84
+ @@index([last_activity])
85
+ @@index([user_id])
86
+ }
87
+
88
+ model users {
89
+ id BigInt @id @default(autoincrement())
90
+ uuid String @unique
91
+ name String
92
+ email String @unique
93
+ avatar String?
94
+ avatar_url String?
95
+ email_verified_at DateTime?
96
+ password String
97
+ remember_token String?
98
+ created_at DateTime?
99
+ updated_at DateTime?
100
+
101
+ user_roles user_roles[]
102
+ user_permissions user_permissions[]
103
+ }
104
+
105
+ model roles {
106
+ id BigInt @id @default(autoincrement())
107
+ name String
108
+ slug String @unique
109
+ description String?
110
+ created_at DateTime?
111
+ updated_at DateTime?
112
+
113
+ user_roles user_roles[]
114
+ role_permissions role_permissions[]
115
+ }
116
+
117
+ model permissions {
118
+ id BigInt @id @default(autoincrement())
119
+ name String
120
+ slug String @unique
121
+ description String?
122
+ created_at DateTime?
123
+ updated_at DateTime?
124
+
125
+ role_permissions role_permissions[]
126
+ user_permissions user_permissions[]
127
+ }
128
+
129
+ model user_roles {
130
+ id BigInt @id @default(autoincrement())
131
+ user_id BigInt
132
+ role_id BigInt
133
+ created_at DateTime?
134
+
135
+ user users @relation(fields: [user_id], references: [id], onDelete: Cascade, onUpdate: NoAction)
136
+ role roles @relation(fields: [role_id], references: [id], onDelete: Cascade, onUpdate: NoAction)
137
+
138
+ @@unique([user_id, role_id])
139
+ }
140
+
141
+ model role_permissions {
142
+ id BigInt @id @default(autoincrement())
143
+ role_id BigInt
144
+ permission_id BigInt
145
+ created_at DateTime?
146
+
147
+ role roles @relation(fields: [role_id], references: [id], onDelete: Cascade, onUpdate: NoAction)
148
+ permission permissions @relation(fields: [permission_id], references: [id], onDelete: Cascade, onUpdate: NoAction)
149
+
150
+ @@unique([role_id, permission_id])
151
+ }
152
+
153
+ model user_permissions {
154
+ id BigInt @id @default(autoincrement())
155
+ user_id BigInt
156
+ permission_id BigInt
157
+ created_at DateTime?
158
+
159
+ user users @relation(fields: [user_id], references: [id], onDelete: Cascade, onUpdate: NoAction)
160
+ permission permissions @relation(fields: [permission_id], references: [id], onDelete: Cascade, onUpdate: NoAction)
161
+
162
+ @@unique([user_id, permission_id])
163
+ }
@@ -0,0 +1,9 @@
1
+
2
+ model pets {
3
+ id BigInt @id @default(autoincrement())
4
+ name String
5
+ species String
6
+ age Int
7
+ created_at DateTime?
8
+ updated_at DateTime?
9
+ }
@@ -0,0 +1,74 @@
1
+ import { Router } from "express";
2
+ import rateLimit from "express-rate-limit";
3
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
4
+ const multer = require("multer");
5
+ import path from "path";
6
+ import fs from "fs";
7
+ import {
8
+ register,
9
+ login,
10
+ me,
11
+ logout,
12
+ refreshToken,
13
+ updatePassword,
14
+ updateProfile,
15
+ updateAvatar,
16
+ } from "@/controllers/authController";
17
+ import { requireAuth } from "@lapeh/middleware/auth";
18
+
19
+ const authLimiter = rateLimit({
20
+ windowMs: 15 * 60 * 1000,
21
+ max: 50,
22
+ standardHeaders: true,
23
+ legacyHeaders: false,
24
+ });
25
+
26
+ const avatarUploadDir = process.env.AVATAR_UPLOAD_DIR || "uploads/avatars";
27
+ if (!fs.existsSync(avatarUploadDir)) {
28
+ fs.mkdirSync(avatarUploadDir, { recursive: true });
29
+ }
30
+
31
+ const storage = (multer as any).diskStorage({
32
+ destination(
33
+ _req: any,
34
+ _file: any,
35
+ cb: (error: Error | null, destination: string) => void
36
+ ) {
37
+ cb(null, avatarUploadDir);
38
+ },
39
+ filename(
40
+ _req: any,
41
+ file: any,
42
+ cb: (error: Error | null, filename: string) => void
43
+ ) {
44
+ const ext = path.extname(file.originalname);
45
+ const base = path.basename(file.originalname, ext);
46
+ const unique = Date.now() + "-" + Math.round(Math.random() * 1e9);
47
+ cb(null, base + "-" + unique + ext);
48
+ },
49
+ });
50
+
51
+ const uploadAvatar = multer({ storage });
52
+
53
+ export const authRouter = Router();
54
+
55
+ authRouter.post("/register", authLimiter, register);
56
+
57
+ authRouter.post("/login", authLimiter, login);
58
+
59
+ authRouter.get("/me", requireAuth, me);
60
+
61
+ authRouter.post("/logout", requireAuth, logout);
62
+
63
+ authRouter.post("/refresh", authLimiter, refreshToken);
64
+
65
+ authRouter.put("/password", requireAuth, updatePassword);
66
+
67
+ authRouter.put("/profile", requireAuth, updateProfile);
68
+
69
+ authRouter.post(
70
+ "/avatar",
71
+ requireAuth,
72
+ uploadAvatar.single("avatar"),
73
+ updateAvatar
74
+ );
@@ -0,0 +1,10 @@
1
+ import { Router } from "express";
2
+ import { authRouter } from "@/routes/auth";
3
+ import { rbacRouter } from "@/routes/rbac";
4
+ import petRouter from "@/routes/pets";
5
+
6
+ export const apiRouter = Router();
7
+
8
+ apiRouter.use("/auth", authRouter);
9
+ apiRouter.use("/rbac", rbacRouter);
10
+ apiRouter.use("/pets", petRouter);
@@ -0,0 +1,13 @@
1
+ import { Router } from "express";
2
+ import * as PetController from "@/controllers/petController";
3
+ import { parseMultipart } from "@lapeh/middleware/multipart";
4
+
5
+ const router = Router();
6
+
7
+ router.get("/", PetController.index);
8
+ router.get("/:id", PetController.show);
9
+ router.post("/", parseMultipart, PetController.store);
10
+ router.put("/:id", parseMultipart, PetController.update);
11
+ router.delete("/:id", PetController.destroy);
12
+
13
+ export default router;
@@ -0,0 +1,42 @@
1
+ import { Router } from "express";
2
+ import { requireAdmin, requireAuth } from "@lapeh/middleware/auth";
3
+ import {
4
+ createRole,
5
+ listRoles,
6
+ updateRole,
7
+ deleteRole,
8
+ createPermission,
9
+ listPermissions,
10
+ updatePermission,
11
+ deletePermission,
12
+ assignRoleToUser,
13
+ removeRoleFromUser,
14
+ assignPermissionToRole,
15
+ removePermissionFromRole,
16
+ assignPermissionToUser,
17
+ removePermissionFromUser,
18
+ } from "@/controllers/rbacController";
19
+
20
+ export const rbacRouter = Router();
21
+
22
+ rbacRouter.use(requireAuth);
23
+ rbacRouter.use(requireAdmin);
24
+
25
+ rbacRouter.post("/roles", createRole);
26
+ rbacRouter.get("/roles", listRoles);
27
+ rbacRouter.put("/roles/:id", updateRole);
28
+ rbacRouter.delete("/roles/:id", deleteRole);
29
+
30
+ rbacRouter.post("/permissions", createPermission);
31
+ rbacRouter.get("/permissions", listPermissions);
32
+ rbacRouter.put("/permissions/:id", updatePermission);
33
+ rbacRouter.delete("/permissions/:id", deletePermission);
34
+
35
+ rbacRouter.post("/users/assign-role", assignRoleToUser);
36
+ rbacRouter.post("/users/remove-role", removeRoleFromUser);
37
+
38
+ rbacRouter.post("/roles/assign-permission", assignPermissionToRole);
39
+ rbacRouter.post("/roles/remove-permission", removePermissionFromRole);
40
+
41
+ rbacRouter.post("/users/assign-permission", assignPermissionToUser);
42
+ rbacRouter.post("/users/remove-permission", removePermissionFromUser);
@@ -0,0 +1,20 @@
1
+ {
2
+ "keep": {
3
+ "days": true,
4
+ "amount": 3
5
+ },
6
+ "auditLog": "E:\\PROJECT\\ANY\\2026\\lapeh\\storage\\logs\\.0337f5062fe676994d1dc340156e089444e3d6e0-audit.json",
7
+ "files": [
8
+ {
9
+ "date": 1766767461282,
10
+ "name": "E:\\PROJECT\\ANY\\2026\\lapeh\\storage\\logs\\lapeh-2025-12-26.log",
11
+ "hash": "52e47e3c087de40a7c2c8ca0b57a470d5fe65938a1bc76fe1c27d9a79255fa24"
12
+ },
13
+ {
14
+ "date": 1766768402694,
15
+ "name": "E:\\PROJECT\\ANY\\2026\\lapeh\\storage\\logs\\lapeh-2025-12-27.log",
16
+ "hash": "7b83a98dcb0ded21998f90e8c58a724cbb2534104205f97e15b409cfa080e982"
17
+ }
18
+ ],
19
+ "hashType": "sha256"
20
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "keep": {
3
+ "days": true,
4
+ "amount": 14
5
+ },
6
+ "auditLog": "E:\\PROJECT\\ANY\\2026\\lapeh\\storage\\logs\\.6d800ded05707868e0fd0de083c4866ce890c8db-audit.json",
7
+ "files": [
8
+ {
9
+ "date": 1766766288426,
10
+ "name": "E:\\PROJECT\\ANY\\2026\\lapeh\\storage\\logs\\lapeh-2025-12-26.log",
11
+ "hash": "08b87cd726ea8087719a4bb0ec857a6ffb4363019ff37932cb79595348820e83"
12
+ }
13
+ ],
14
+ "hashType": "sha256"
15
+ }
File without changes
@@ -0,0 +1,88 @@
1
+ [2025-12-26 23:24:48] INFO: This is an info message from test script
2
+ [2025-12-26 23:24:48] ERROR: This is an error message from test script
3
+ [2025-12-26 23:24:48] WARN: This is a warning
4
+ [2025-12-26 23:25:18] INFO: This is an info message from test script
5
+ [2025-12-26 23:25:18] ERROR: This is an error message from test script
6
+ [2025-12-26 23:25:18] WARN: This is a warning
7
+ [2025-12-26 23:25:42] INFO: This is an info message from test script
8
+ [2025-12-26 23:25:42] ERROR: This is an error message from test script
9
+ [2025-12-26 23:25:42] WARN: This is a warning
10
+ [2025-12-26 23:35:47] WARN: Validation error
11
+ [2025-12-26 23:35:48] WARN: Validation error
12
+ [2025-12-26 23:35:49] WARN: Validation error
13
+ [2025-12-26 23:35:50] WARN: Validation error
14
+ [2025-12-26 23:35:51] WARN: Validation error
15
+ [2025-12-26 23:35:54] WARN: Validation error
16
+ [2025-12-26 23:36:06] WARN: Validation error
17
+ [2025-12-26 23:36:07] WARN: Validation error
18
+ [2025-12-26 23:36:08] WARN: Validation error
19
+ [2025-12-26 23:36:21] WARN: Validation error
20
+ [2025-12-26 23:41:33] WARN: Validation error
21
+ Errors: {
22
+ "age": [
23
+ "Age must be a number"
24
+ ]
25
+ }
26
+ Meta: {"statusCode":422}
27
+ [2025-12-26 23:41:36] WARN: Validation error
28
+ Errors: {
29
+ "age": [
30
+ "Age must be a number"
31
+ ]
32
+ }
33
+ Meta: {"statusCode":422}
34
+ [2025-12-26 23:41:38] WARN: Validation error
35
+ Errors: {
36
+ "age": [
37
+ "Age must be a number"
38
+ ]
39
+ }
40
+ Meta: {"statusCode":422}
41
+ [2025-12-26 23:41:39] WARN: Validation error
42
+ Errors: {
43
+ "age": [
44
+ "Age must be a number"
45
+ ]
46
+ }
47
+ Meta: {"statusCode":422}
48
+ [2025-12-26 23:41:47] WARN: Validation error
49
+ Errors: {
50
+ "species": [
51
+ "Species is required"
52
+ ],
53
+ "age": [
54
+ "Age is required"
55
+ ]
56
+ }
57
+ Meta: {"statusCode":422}
58
+ [2025-12-26 23:42:10] WARN: Validation error
59
+ Errors: {
60
+ "species": [
61
+ "Species is required"
62
+ ],
63
+ "age": [
64
+ "Age is required"
65
+ ]
66
+ }
67
+ Meta: {"statusCode":422}
68
+ [2025-12-26 23:42:27] WARN: Validation error
69
+ Errors: {
70
+ "age": [
71
+ "Age must be a number"
72
+ ]
73
+ }
74
+ Meta: {"statusCode":422}
75
+ [2025-12-26 23:56:33] WARN: Validation error
76
+ Errors: {
77
+ "age": [
78
+ "Age must be a number"
79
+ ]
80
+ }
81
+ Meta: {"statusCode":422}
82
+ [2025-12-26 23:56:35] WARN: Validation error
83
+ Errors: {
84
+ "age": [
85
+ "Age must be a number"
86
+ ]
87
+ }
88
+ Meta: {"statusCode":422}
@@ -0,0 +1,217 @@
1
+ [2025-12-27 00:09:03] WARN: Validation error
2
+ Errors: {
3
+ "email": [
4
+ "Invalid email"
5
+ ],
6
+ "password": [
7
+ "String must contain at least 4 character(s)"
8
+ ]
9
+ }
10
+ Meta: {"statusCode":422}
11
+ [2025-12-27 00:57:03] WARN: Validation error
12
+ Errors: {
13
+ "email": [
14
+ "Invalid email"
15
+ ],
16
+ "password": [
17
+ "String must contain at least 4 character(s)"
18
+ ]
19
+ }
20
+ Meta: {"statusCode":422}
21
+ [2025-12-27 00:57:03] WARN: POST /api/auth/login 422 - 648ms - ::1
22
+ [2025-12-27 00:57:05] WARN: Validation error
23
+ Errors: {
24
+ "email": [
25
+ "Invalid email"
26
+ ],
27
+ "password": [
28
+ "String must contain at least 4 character(s)"
29
+ ]
30
+ }
31
+ Meta: {"statusCode":422}
32
+ [2025-12-27 00:57:05] WARN: POST /api/auth/login 422 - 9ms - ::1
33
+ [2025-12-27 00:57:21] INFO: POST /api/auth/login 200 - 744ms - ::1
34
+ [2025-12-27 00:57:23] INFO: POST /api/auth/login 200 - 146ms - ::1
35
+ [2025-12-27 00:57:33] WARN: Validation error
36
+ Errors: {
37
+ "email": [
38
+ "Invalid email"
39
+ ]
40
+ }
41
+ Meta: {"statusCode":422}
42
+ [2025-12-27 00:57:33] WARN: POST /api/auth/login 422 - 7ms - ::1
43
+ [2025-12-27 00:57:38] INFO: POST /api/auth/login 200 - 227ms - ::1
44
+ [2025-12-27 00:57:44] INFO: POST /api/pets 201 - 38ms - ::1
45
+ [2025-12-27 05:29:45] INFO: GET /api/pets 200 - 639ms - ::1
46
+ [2025-12-27 05:29:47] INFO: GET /api/pets 200 - 14ms - ::1
47
+ [2025-12-27 05:29:49] INFO: GET /api/pets 200 - 17ms - ::1
48
+ [2025-12-27 05:39:12] WARN: Email not registered
49
+ Errors: {
50
+ "field": "email",
51
+ "message": "Email is not registered, please register first"
52
+ }
53
+ Meta: {"statusCode":401}
54
+ [2025-12-27 05:39:12] WARN: POST /api/auth/login 401 - 282ms - ::1
55
+ [2025-12-27 07:18:49] INFO: GET /api/pets 200 - 943ms - ::1
56
+ [2025-12-27 07:18:51] INFO: GET /api/pets 200 - 14ms - ::1
57
+ [2025-12-27 07:18:52] INFO: GET /api/pets 200 - 12ms - ::1
58
+ [2025-12-27 07:18:53] INFO: GET /api/pets 200 - 16ms - ::1
59
+ [2025-12-27 07:18:54] INFO: GET /api/pets 200 - 14ms - ::1
60
+ [2025-12-27 07:18:55] INFO: GET /api/pets 200 - 17ms - ::1
61
+ [2025-12-27 07:18:56] INFO: GET /api/pets 200 - 17ms - ::1
62
+ [2025-12-27 07:18:59] INFO: POST /api/auth/login 200 - 192ms - ::1
63
+ [2025-12-27 07:19:01] INFO: POST /api/auth/login 200 - 174ms - ::1
64
+ [2025-12-27 07:19:02] INFO: POST /api/auth/login 200 - 170ms - ::1
65
+ [2025-12-27 07:21:10] INFO: GET /api/pets 200 - 310ms - ::1
66
+ [2025-12-27 07:21:12] INFO: GET /api/pets 200 - 15ms - ::1
67
+ [2025-12-27 07:21:21] INFO: GET /api/pets 200 - 13ms - ::1
68
+ [2025-12-27 07:21:21] INFO: GET /api/pets 200 - 15ms - ::1
69
+ [2025-12-27 07:21:22] INFO: GET /api/pets 200 - 19ms - ::1
70
+ [2025-12-27 07:21:23] INFO: GET /api/pets 200 - 18ms - ::1
71
+ [2025-12-27 07:21:24] INFO: GET /api/pets 200 - 16ms - ::1
72
+ [2025-12-27 07:21:25] INFO: GET /api/pets 200 - 11ms - ::1
73
+ [2025-12-27 07:24:00] INFO: GET /api/pets 200 - 274ms - ::1
74
+ [2025-12-27 07:24:08] INFO: GET /api/pets 200 - 23ms - ::1
75
+ [2025-12-27 07:24:09] INFO: GET /api/pets 200 - 13ms - ::1
76
+ [2025-12-27 07:24:10] INFO: GET /api/pets 200 - 19ms - ::1
77
+ [2025-12-27 07:24:10] INFO: GET /api/pets 200 - 22ms - ::1
78
+ [2025-12-27 07:24:11] INFO: GET /api/pets 200 - 18ms - ::1
79
+ [2025-12-27 07:24:12] INFO: GET /api/pets 200 - 16ms - ::1
80
+ [2025-12-27 07:26:19] INFO: GET /api/pets 200 - 229ms - ::1
81
+ [2025-12-27 07:48:20] INFO: GET /api/pets 200 - 253ms - ::1
82
+ [2025-12-27 07:48:22] INFO: GET /api/pets 200 - 16ms - ::1
83
+ [2025-12-27 07:48:23] INFO: GET /api/pets 200 - 24ms - ::1
84
+ [2025-12-27 07:48:24] INFO: GET /api/pets 200 - 15ms - ::1
85
+ [2025-12-27 07:48:25] INFO: GET /api/pets 200 - 18ms - ::1
86
+ [2025-12-27 07:48:26] INFO: GET /api/pets 200 - 14ms - ::1
87
+ [2025-12-27 07:48:30] INFO: POST /api/auth/login 200 - 178ms - ::1
88
+ [2025-12-27 07:48:31] INFO: POST /api/auth/login 200 - 161ms - ::1
89
+ [2025-12-27 07:48:32] INFO: POST /api/auth/login 200 - 169ms - ::1
90
+ [2025-12-27 07:48:33] INFO: POST /api/auth/login 200 - 152ms - ::1
91
+ [2025-12-27 07:48:35] INFO: POST /api/auth/login 200 - 165ms - ::1
92
+ [2025-12-27 07:48:36] INFO: POST /api/auth/login 200 - 137ms - ::1
93
+ [2025-12-27 07:48:37] INFO: POST /api/auth/login 200 - 174ms - ::1
94
+ [2025-12-27 07:48:38] INFO: POST /api/auth/login 200 - 157ms - ::1
95
+ [2025-12-27 07:48:40] INFO: POST /api/auth/login 200 - 218ms - ::1
96
+ [2025-12-27 07:48:41] INFO: POST /api/auth/login 200 - 162ms - ::1
97
+ [2025-12-27 07:48:42] INFO: POST /api/auth/login 200 - 149ms - ::1
98
+ [2025-12-27 07:48:49] INFO: GET /api/auth/me 200 - 20ms - ::1
99
+ [2025-12-27 07:48:52] INFO: GET /api/auth/me 200 - 16ms - ::1
100
+ [2025-12-27 07:48:52] INFO: GET /api/auth/me 200 - 22ms - ::1
101
+ [2025-12-27 07:48:53] INFO: GET /api/auth/me 200 - 23ms - ::1
102
+ [2025-12-27 07:48:58] INFO: GET /api/pets 200 - 58ms - ::1
103
+ [2025-12-27 07:48:59] INFO: GET /api/pets 200 - 19ms - ::1
104
+ [2025-12-27 09:12:25] INFO: POST /api/auth/register 200 - 386ms - ::1
105
+ [2025-12-27 09:12:25] INFO: POST /api/auth/login 200 - 77ms - ::1
106
+ [2025-12-27 09:12:25] WARN: Unauthorized
107
+ Meta: {"statusCode":401}
108
+ [2025-12-27 09:12:25] WARN: POST /api/rbac/roles 401 - 2ms - ::1
109
+ [2025-12-27 09:13:27] INFO: POST /api/auth/login 200 - 111ms - ::1
110
+ [2025-12-27 09:13:27] WARN: Validation error
111
+ Errors: {
112
+ "email": [
113
+ "The email has already been taken."
114
+ ]
115
+ }
116
+ Meta: {"statusCode":422}
117
+ [2025-12-27 09:13:27] WARN: POST /api/auth/register 422 - 4ms - ::1
118
+ [2025-12-27 09:13:27] INFO: POST /api/auth/login 200 - 67ms - ::1
119
+ [2025-12-27 09:13:27] INFO: GET /api/auth/me 200 - 7ms - ::1
120
+ [2025-12-27 09:13:28] INFO: POST /api/auth/login 200 - 64ms - ::1
121
+ [2025-12-27 09:13:28] WARN: Unauthorized
122
+ Meta: {"statusCode":401}
123
+ [2025-12-27 09:13:28] WARN: POST /api/rbac/roles 401 - 2ms - ::1
124
+ [2025-12-27 09:15:38] INFO: POST /api/auth/login 200 - 220ms - ::1
125
+ [2025-12-27 09:15:38] WARN: Validation error
126
+ Errors: {
127
+ "email": [
128
+ "The email has already been taken."
129
+ ]
130
+ }
131
+ Meta: {"statusCode":422}
132
+ [2025-12-27 09:15:38] WARN: POST /api/auth/register 422 - 8ms - ::1
133
+ [2025-12-27 09:15:38] INFO: POST /api/auth/login 200 - 70ms - ::1
134
+ [2025-12-27 09:15:38] INFO: GET /api/auth/me 200 - 7ms - ::1
135
+ [2025-12-27 09:15:38] INFO: POST /api/auth/login 200 - 64ms - ::1
136
+ [2025-12-27 09:15:38] WARN: Unauthorized
137
+ Meta: {"statusCode":401}
138
+ [2025-12-27 09:15:38] WARN: POST /api/rbac/roles 401 - 4ms - ::1
139
+ [2025-12-27 09:16:41] INFO: POST /api/auth/login 200 - 342ms - ::1
140
+ [2025-12-27 09:16:41] WARN: Validation error
141
+ Errors: {
142
+ "email": [
143
+ "The email has already been taken."
144
+ ]
145
+ }
146
+ Meta: {"statusCode":422}
147
+ [2025-12-27 09:16:41] WARN: POST /api/auth/register 422 - 7ms - ::1
148
+ [2025-12-27 09:16:41] INFO: POST /api/auth/login 200 - 70ms - ::1
149
+ [2025-12-27 09:16:41] INFO: GET /api/auth/me 200 - 7ms - ::1
150
+ [2025-12-27 09:16:41] INFO: POST /api/auth/login 200 - 64ms - ::1
151
+ [2025-12-27 09:16:41] INFO: POST /api/rbac/roles 201 - 10ms - ::1
152
+ [2025-12-27 09:16:41] INFO: POST /api/rbac/permissions 201 - 7ms - ::1
153
+ [2025-12-27 09:16:41] WARN: POST /api/rbac/assign-permission-role 404 - 4ms - ::1
154
+ [2025-12-27 09:16:41] WARN: POST /api/rbac/assign-role-user 404 - 3ms - ::1
155
+ [2025-12-27 09:16:41] INFO: GET /api/auth/me 200 - 5ms - ::1
156
+ [2025-12-27 09:16:41] INFO: DELETE /api/rbac/roles/4 200 - 16ms - ::1
157
+ [2025-12-27 09:16:41] INFO: DELETE /api/rbac/permissions/15 200 - 9ms - ::1
158
+ [2025-12-27 09:17:22] INFO: POST /api/auth/login 200 - 130ms - ::1
159
+ [2025-12-27 09:17:22] WARN: Validation error
160
+ Errors: {
161
+ "email": [
162
+ "The email has already been taken."
163
+ ]
164
+ }
165
+ Meta: {"statusCode":422}
166
+ [2025-12-27 09:17:22] WARN: POST /api/auth/register 422 - 4ms - ::1
167
+ [2025-12-27 09:17:22] INFO: POST /api/auth/login 200 - 68ms - ::1
168
+ [2025-12-27 09:17:22] INFO: GET /api/auth/me 200 - 5ms - ::1
169
+ [2025-12-27 09:17:22] INFO: POST /api/auth/login 200 - 70ms - ::1
170
+ [2025-12-27 09:17:22] INFO: POST /api/rbac/roles 201 - 7ms - ::1
171
+ [2025-12-27 09:17:22] INFO: POST /api/rbac/permissions 201 - 6ms - ::1
172
+ [2025-12-27 09:17:22] INFO: POST /api/rbac/roles/assign-permission 200 - 14ms - ::1
173
+ [2025-12-27 09:17:22] INFO: POST /api/rbac/users/assign-role 200 - 9ms - ::1
174
+ [2025-12-27 09:17:22] INFO: GET /api/auth/me 200 - 5ms - ::1
175
+ [2025-12-27 09:17:22] INFO: DELETE /api/rbac/roles/5 200 - 6ms - ::1
176
+ [2025-12-27 09:17:22] INFO: DELETE /api/rbac/permissions/16 200 - 6ms - ::1
177
+ [2025-12-27 09:20:59] INFO: POST /api/auth/login 200 - 234ms - ::1
178
+ [2025-12-27 09:20:59] WARN: Validation error
179
+ Errors: {
180
+ "email": [
181
+ "The email has already been taken."
182
+ ]
183
+ }
184
+ Meta: {"statusCode":422}
185
+ [2025-12-27 09:20:59] WARN: POST /api/auth/register 422 - 8ms - ::1
186
+ [2025-12-27 09:21:00] INFO: POST /api/auth/login 200 - 68ms - ::1
187
+ [2025-12-27 09:21:00] INFO: GET /api/auth/me 200 - 8ms - ::1
188
+ [2025-12-27 09:21:00] INFO: POST /api/auth/login 200 - 73ms - ::1
189
+ [2025-12-27 09:21:00] INFO: POST /api/rbac/roles 201 - 12ms - ::1
190
+ [2025-12-27 09:21:00] INFO: POST /api/rbac/permissions 201 - 10ms - ::1
191
+ [2025-12-27 09:21:00] INFO: POST /api/rbac/roles/assign-permission 200 - 21ms - ::1
192
+ [2025-12-27 09:21:00] INFO: POST /api/rbac/users/assign-role 200 - 9ms - ::1
193
+ [2025-12-27 09:21:00] INFO: GET /api/auth/me 200 - 7ms - ::1
194
+ [2025-12-27 09:21:00] INFO: DELETE /api/rbac/roles/6 200 - 7ms - ::1
195
+ [2025-12-27 09:21:00] INFO: DELETE /api/rbac/permissions/17 200 - 10ms - ::1
196
+ [2025-12-27 09:25:15] INFO: POST /api/auth/login 200 - 253ms - ::1
197
+ [2025-12-27 09:25:15] WARN: Validation error
198
+ Errors: {
199
+ "email": [
200
+ "The email has already been taken."
201
+ ]
202
+ }
203
+ Meta: {"statusCode":422}
204
+ [2025-12-27 09:25:15] WARN: POST /api/auth/register 422 - 9ms - ::1
205
+ [2025-12-27 09:25:15] INFO: POST /api/auth/login 200 - 66ms - ::1
206
+ [2025-12-27 09:25:15] INFO: GET /api/auth/me 200 - 8ms - ::1
207
+ [2025-12-27 09:25:15] INFO: POST /api/auth/login 200 - 67ms - ::1
208
+ [2025-12-27 09:25:15] INFO: POST /api/rbac/roles 201 - 12ms - ::1
209
+ [2025-12-27 09:25:15] INFO: POST /api/rbac/permissions 201 - 12ms - ::1
210
+ [2025-12-27 09:25:15] INFO: POST /api/rbac/roles/assign-permission 200 - 24ms - ::1
211
+ [2025-12-27 09:25:15] INFO: POST /api/rbac/users/assign-role 200 - 10ms - ::1
212
+ [2025-12-27 09:25:15] INFO: GET /api/auth/me 200 - 7ms - ::1
213
+ [2025-12-27 09:25:15] INFO: DELETE /api/rbac/roles/7 200 - 14ms - ::1
214
+ [2025-12-27 09:25:15] INFO: DELETE /api/rbac/permissions/18 200 - 10ms - ::1
215
+ [2025-12-27 09:29:29] INFO: GET /api/pets 200 - 129ms - ::1
216
+ [2025-12-27 09:29:32] INFO: GET /api/pets 200 - 16ms - ::1
217
+ [2025-12-27 09:29:33] INFO: GET /api/pets 200 - 19ms - ::1
package/tsconfig.json ADDED
@@ -0,0 +1,30 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2020",
4
+ "module": "CommonJS",
5
+ "outDir": "dist",
6
+ "rootDir": ".",
7
+ "declaration": true,
8
+ "declarationMap": true,
9
+ "strict": true,
10
+ "esModuleInterop": true,
11
+ "skipLibCheck": true,
12
+ "forceConsistentCasingInFileNames": true,
13
+ "noUnusedLocals": true,
14
+ "noUnusedParameters": true,
15
+ "paths": {
16
+ "@lapeh/*": ["./lib/*"],
17
+ "@/*": ["./src/*"]
18
+ }
19
+ },
20
+ "include": [
21
+ "lib",
22
+ "src",
23
+ "prisma",
24
+ "generated"
25
+ ],
26
+ "exclude": [
27
+ "node_modules",
28
+ "dist"
29
+ ]
30
+ }