lapeh 2.3.6 → 2.3.8
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/bin/index.js +39 -56
- package/dist/generated/prisma/browser.d.ts +80 -0
- package/dist/generated/prisma/browser.d.ts.map +1 -0
- package/dist/generated/prisma/browser.js +56 -0
- package/dist/generated/prisma/client.d.ts +97 -0
- package/dist/generated/prisma/client.d.ts.map +1 -0
- package/dist/generated/prisma/client.js +68 -0
- package/dist/generated/prisma/commonInputTypes.d.ts +486 -0
- package/dist/generated/prisma/commonInputTypes.d.ts.map +1 -0
- package/dist/generated/prisma/commonInputTypes.js +11 -0
- package/dist/generated/prisma/enums.d.ts +2 -0
- package/dist/generated/prisma/enums.d.ts.map +1 -0
- package/dist/generated/prisma/enums.js +11 -0
- package/dist/generated/prisma/internal/class.d.ts +281 -0
- package/dist/generated/prisma/internal/class.d.ts.map +1 -0
- package/dist/generated/prisma/internal/class.js +76 -0
- package/dist/generated/prisma/internal/prismaNamespace.d.ts +1734 -0
- package/dist/generated/prisma/internal/prismaNamespace.d.ts.map +1 -0
- package/dist/generated/prisma/internal/prismaNamespace.js +260 -0
- package/dist/generated/prisma/internal/prismaNamespaceBrowser.d.ts +200 -0
- package/dist/generated/prisma/internal/prismaNamespaceBrowser.d.ts.map +1 -0
- package/dist/generated/prisma/internal/prismaNamespaceBrowser.js +231 -0
- package/dist/generated/prisma/models/cache.d.ts +986 -0
- package/dist/generated/prisma/models/cache.d.ts.map +1 -0
- package/dist/generated/prisma/models/cache.js +2 -0
- package/dist/generated/prisma/models/cache_locks.d.ts +976 -0
- package/dist/generated/prisma/models/cache_locks.d.ts.map +1 -0
- package/dist/generated/prisma/models/cache_locks.js +2 -0
- package/dist/generated/prisma/models/failed_jobs.d.ts +1098 -0
- package/dist/generated/prisma/models/failed_jobs.d.ts.map +1 -0
- package/dist/generated/prisma/models/failed_jobs.js +2 -0
- package/dist/generated/prisma/models/job_batches.d.ts +1212 -0
- package/dist/generated/prisma/models/job_batches.d.ts.map +1 -0
- package/dist/generated/prisma/models/job_batches.js +2 -0
- package/dist/generated/prisma/models/jobs.d.ts +1112 -0
- package/dist/generated/prisma/models/jobs.d.ts.map +1 -0
- package/dist/generated/prisma/models/jobs.js +2 -0
- package/dist/generated/prisma/models/migrations.d.ts +979 -0
- package/dist/generated/prisma/models/migrations.d.ts.map +1 -0
- package/dist/generated/prisma/models/migrations.js +2 -0
- package/dist/generated/prisma/models/password_reset_tokens.d.ts +941 -0
- package/dist/generated/prisma/models/password_reset_tokens.d.ts.map +1 -0
- package/dist/generated/prisma/models/password_reset_tokens.js +2 -0
- package/dist/generated/prisma/models/permissions.d.ts +1333 -0
- package/dist/generated/prisma/models/permissions.d.ts.map +1 -0
- package/dist/generated/prisma/models/permissions.js +2 -0
- package/dist/generated/prisma/models/personal_access_tokens.d.ts +1178 -0
- package/dist/generated/prisma/models/personal_access_tokens.d.ts.map +1 -0
- package/dist/generated/prisma/models/personal_access_tokens.js +2 -0
- package/dist/generated/prisma/models/role_permissions.d.ts +1291 -0
- package/dist/generated/prisma/models/role_permissions.d.ts.map +1 -0
- package/dist/generated/prisma/models/role_permissions.js +2 -0
- package/dist/generated/prisma/models/roles.d.ts +1333 -0
- package/dist/generated/prisma/models/roles.d.ts.map +1 -0
- package/dist/generated/prisma/models/roles.js +2 -0
- package/dist/generated/prisma/models/sessions.d.ts +1073 -0
- package/dist/generated/prisma/models/sessions.d.ts.map +1 -0
- package/dist/generated/prisma/models/sessions.js +2 -0
- package/dist/generated/prisma/models/user_permissions.d.ts +1291 -0
- package/dist/generated/prisma/models/user_permissions.d.ts.map +1 -0
- package/dist/generated/prisma/models/user_permissions.js +2 -0
- package/dist/generated/prisma/models/user_roles.d.ts +1291 -0
- package/dist/generated/prisma/models/user_roles.d.ts.map +1 -0
- package/dist/generated/prisma/models/user_roles.js +2 -0
- package/dist/generated/prisma/models/users.d.ts +1513 -0
- package/dist/generated/prisma/models/users.d.ts.map +1 -0
- package/dist/generated/prisma/models/users.js +2 -0
- package/dist/generated/prisma/models.d.ts +17 -0
- package/dist/generated/prisma/models.d.ts.map +1 -0
- package/dist/generated/prisma/models.js +2 -0
- package/dist/lib/bootstrap.d.ts +2 -0
- package/dist/lib/bootstrap.d.ts.map +1 -0
- package/dist/lib/bootstrap.js +133 -0
- package/dist/lib/core/database.d.ts +3 -0
- package/dist/lib/core/database.d.ts.map +1 -0
- package/dist/lib/core/database.js +34 -0
- package/dist/lib/core/realtime.d.ts +3 -0
- package/dist/lib/core/realtime.d.ts.map +1 -0
- package/dist/lib/core/realtime.js +36 -0
- package/dist/lib/core/redis.d.ts +8 -0
- package/dist/lib/core/redis.d.ts.map +1 -0
- package/dist/lib/core/redis.js +123 -0
- package/dist/lib/core/serializer.d.ts +43 -0
- package/dist/lib/core/serializer.d.ts.map +1 -0
- package/dist/lib/core/serializer.js +66 -0
- package/dist/lib/core/server.d.ts +2 -0
- package/dist/lib/core/server.d.ts.map +1 -0
- package/dist/lib/core/server.js +60 -0
- package/dist/lib/middleware/auth.d.ts +4 -0
- package/dist/lib/middleware/auth.d.ts.map +1 -0
- package/dist/lib/middleware/auth.js +55 -0
- package/dist/lib/middleware/error.d.ts +3 -0
- package/dist/lib/middleware/error.d.ts.map +1 -0
- package/dist/lib/middleware/error.js +60 -0
- package/dist/lib/middleware/multipart.d.ts +4 -0
- package/dist/lib/middleware/multipart.d.ts.map +1 -0
- package/dist/lib/middleware/multipart.js +17 -0
- package/dist/lib/middleware/rateLimit.d.ts +2 -0
- package/dist/lib/middleware/rateLimit.d.ts.map +1 -0
- package/dist/lib/middleware/rateLimit.js +19 -0
- package/dist/lib/middleware/requestLogger.d.ts +3 -0
- package/dist/lib/middleware/requestLogger.d.ts.map +1 -0
- package/dist/lib/middleware/requestLogger.js +22 -0
- package/dist/lib/middleware/visitor.d.ts +3 -0
- package/dist/lib/middleware/visitor.d.ts.map +1 -0
- package/dist/lib/middleware/visitor.js +144 -0
- package/dist/lib/utils/logger.d.ts +11 -0
- package/dist/lib/utils/logger.d.ts.map +1 -0
- package/dist/lib/utils/logger.js +81 -0
- package/dist/lib/utils/pagination.d.ts +19 -0
- package/dist/lib/utils/pagination.d.ts.map +1 -0
- package/dist/lib/utils/pagination.js +34 -0
- package/dist/lib/utils/response.d.ts +11 -0
- package/dist/lib/utils/response.d.ts.map +1 -0
- package/dist/lib/utils/response.js +57 -0
- package/dist/lib/utils/validator.d.ts +38 -0
- package/dist/lib/utils/validator.d.ts.map +1 -0
- package/dist/lib/utils/validator.js +369 -0
- package/dist/prisma/seed.d.ts +2 -0
- package/dist/prisma/seed.d.ts.map +1 -0
- package/dist/prisma/seed.js +381 -0
- package/dist/src/controllers/authController.d.ts +11 -0
- package/dist/src/controllers/authController.d.ts.map +1 -0
- package/dist/src/controllers/authController.js +414 -0
- package/dist/src/controllers/petController.d.ts +7 -0
- package/dist/src/controllers/petController.d.ts.map +1 -0
- package/dist/src/controllers/petController.js +163 -0
- package/dist/src/controllers/rbacController.d.ts +16 -0
- package/dist/src/controllers/rbacController.d.ts.map +1 -0
- package/dist/src/controllers/rbacController.js +437 -0
- package/dist/src/core/database.d.ts +3 -0
- package/dist/src/core/database.d.ts.map +1 -0
- package/dist/src/core/database.js +34 -0
- package/dist/src/core/realtime.d.ts +3 -0
- package/dist/src/core/realtime.d.ts.map +1 -0
- package/dist/src/core/realtime.js +36 -0
- package/dist/src/core/redis.d.ts +8 -0
- package/dist/src/core/redis.d.ts.map +1 -0
- package/dist/src/core/redis.js +123 -0
- package/dist/src/core/serializer.d.ts +43 -0
- package/dist/src/core/serializer.d.ts.map +1 -0
- package/dist/src/core/serializer.js +66 -0
- package/dist/src/core/server.d.ts +2 -0
- package/dist/src/core/server.d.ts.map +1 -0
- package/dist/src/core/server.js +60 -0
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +98 -0
- package/dist/src/middleware/auth.d.ts +4 -0
- package/dist/src/middleware/auth.d.ts.map +1 -0
- package/dist/src/middleware/auth.js +48 -0
- package/dist/src/middleware/error.d.ts +3 -0
- package/dist/src/middleware/error.d.ts.map +1 -0
- package/dist/src/middleware/error.js +60 -0
- package/dist/src/middleware/multipart.d.ts +4 -0
- package/dist/src/middleware/multipart.d.ts.map +1 -0
- package/dist/src/middleware/multipart.js +17 -0
- package/dist/src/middleware/rateLimit.d.ts +2 -0
- package/dist/src/middleware/rateLimit.d.ts.map +1 -0
- package/dist/src/middleware/rateLimit.js +19 -0
- package/dist/src/middleware/requestLogger.d.ts +3 -0
- package/dist/src/middleware/requestLogger.d.ts.map +1 -0
- package/dist/src/middleware/requestLogger.js +22 -0
- package/dist/src/middleware/visitor.d.ts +3 -0
- package/dist/src/middleware/visitor.d.ts.map +1 -0
- package/dist/src/middleware/visitor.js +144 -0
- package/dist/src/prisma.d.ts +3 -0
- package/dist/src/prisma.d.ts.map +1 -0
- package/dist/src/prisma.js +34 -0
- package/dist/src/realtime.d.ts +3 -0
- package/dist/src/realtime.d.ts.map +1 -0
- package/dist/src/realtime.js +36 -0
- package/dist/src/redis.d.ts +8 -0
- package/dist/src/redis.d.ts.map +1 -0
- package/dist/src/redis.js +122 -0
- package/dist/src/routes/auth.d.ts +2 -0
- package/dist/src/routes/auth.d.ts.map +1 -0
- package/dist/src/routes/auth.js +45 -0
- package/dist/src/routes/index.d.ts +2 -0
- package/dist/src/routes/index.d.ts.map +1 -0
- package/dist/src/routes/index.js +14 -0
- package/dist/src/routes/pets.d.ts +3 -0
- package/dist/src/routes/pets.d.ts.map +1 -0
- package/dist/src/routes/pets.js +45 -0
- package/dist/src/routes/rbac.d.ts +2 -0
- package/dist/src/routes/rbac.d.ts.map +1 -0
- package/dist/src/routes/rbac.js +23 -0
- package/dist/src/schema/auth-schema.d.ts +76 -0
- package/dist/src/schema/auth-schema.d.ts.map +1 -0
- package/dist/src/schema/auth-schema.js +63 -0
- package/dist/src/schema/pet-schema.d.ts +28 -0
- package/dist/src/schema/pet-schema.d.ts.map +1 -0
- package/dist/src/schema/pet-schema.js +14 -0
- package/dist/src/server.d.ts +2 -0
- package/dist/src/server.d.ts.map +1 -0
- package/dist/src/server.js +31 -0
- package/dist/src/utils/logger.d.ts +11 -0
- package/dist/src/utils/logger.d.ts.map +1 -0
- package/dist/src/utils/logger.js +81 -0
- package/dist/src/utils/pagination.d.ts +19 -0
- package/dist/src/utils/pagination.d.ts.map +1 -0
- package/dist/src/utils/pagination.js +34 -0
- package/dist/src/utils/response.d.ts +11 -0
- package/dist/src/utils/response.d.ts.map +1 -0
- package/dist/src/utils/response.js +57 -0
- package/dist/src/utils/validator.d.ts +38 -0
- package/dist/src/utils/validator.d.ts.map +1 -0
- package/dist/src/utils/validator.js +369 -0
- package/lib/bootstrap.ts +6 -0
- package/package.json +26 -14
- package/.env.example +0 -19
- package/doc/ARCHITECTURE_GUIDE.md +0 -73
- package/doc/CHANGELOG.md +0 -77
- package/doc/CHEATSHEET.md +0 -94
- package/doc/CLI.md +0 -139
- package/doc/CONTRIBUTING.md +0 -105
- package/doc/DEPLOYMENT.md +0 -122
- package/doc/FAQ.md +0 -81
- package/doc/FEATURES.md +0 -165
- package/doc/GETTING_STARTED.md +0 -108
- package/doc/INTRODUCTION.md +0 -60
- package/doc/PACKAGES.md +0 -66
- package/doc/PERFORMANCE.md +0 -91
- package/doc/ROADMAP.md +0 -93
- package/doc/SECURITY.md +0 -93
- package/doc/STRUCTURE.md +0 -90
- package/doc/TUTORIAL.md +0 -192
- package/docker-compose.yml +0 -24
- package/eslint.config.mjs +0 -26
- package/framework.md +0 -168
- package/nodemon.json +0 -6
- package/prisma.config.ts +0 -15
- package/src/controllers/authController.ts +0 -469
- package/src/controllers/petController.ts +0 -194
- package/src/controllers/rbacController.ts +0 -478
- package/src/models/core.prisma +0 -163
- package/src/models/pets.prisma +0 -9
- package/src/routes/auth.ts +0 -74
- package/src/routes/index.ts +0 -10
- package/src/routes/pets.ts +0 -13
- package/src/routes/rbac.ts +0 -42
- package/storage/logs/.gitkeep +0 -0
- package/tsconfig.json +0 -30
|
@@ -1,478 +0,0 @@
|
|
|
1
|
-
import { Request, Response } from "express";
|
|
2
|
-
import { prisma } from "@lapeh/core/database";
|
|
3
|
-
import { sendError, sendFastSuccess } from "@lapeh/utils/response";
|
|
4
|
-
import { Validator } from "@lapeh/utils/validator";
|
|
5
|
-
import { z } from "zod";
|
|
6
|
-
import { getSerializer, createResponseSchema } from "@lapeh/core/serializer";
|
|
7
|
-
|
|
8
|
-
// --- Serializers ---
|
|
9
|
-
|
|
10
|
-
const roleSchema = {
|
|
11
|
-
type: "object",
|
|
12
|
-
properties: {
|
|
13
|
-
id: { type: "string" },
|
|
14
|
-
name: { type: "string" },
|
|
15
|
-
slug: { type: "string" },
|
|
16
|
-
description: { type: "string", nullable: true },
|
|
17
|
-
created_at: { type: "string", format: "date-time", nullable: true },
|
|
18
|
-
updated_at: { type: "string", format: "date-time", nullable: true },
|
|
19
|
-
},
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
const permissionSchema = {
|
|
23
|
-
type: "object",
|
|
24
|
-
properties: {
|
|
25
|
-
id: { type: "string" },
|
|
26
|
-
name: { type: "string" },
|
|
27
|
-
slug: { type: "string" },
|
|
28
|
-
description: { type: "string", nullable: true },
|
|
29
|
-
created_at: { type: "string", format: "date-time", nullable: true },
|
|
30
|
-
updated_at: { type: "string", format: "date-time", nullable: true },
|
|
31
|
-
},
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
const roleSerializer = getSerializer("role", createResponseSchema(roleSchema));
|
|
35
|
-
const roleListSerializer = getSerializer(
|
|
36
|
-
"role-list",
|
|
37
|
-
createResponseSchema({ type: "array", items: roleSchema })
|
|
38
|
-
);
|
|
39
|
-
|
|
40
|
-
const permissionSerializer = getSerializer(
|
|
41
|
-
"permission",
|
|
42
|
-
createResponseSchema(permissionSchema)
|
|
43
|
-
);
|
|
44
|
-
const permissionListSerializer = getSerializer(
|
|
45
|
-
"permission-list",
|
|
46
|
-
createResponseSchema({ type: "array", items: permissionSchema })
|
|
47
|
-
);
|
|
48
|
-
|
|
49
|
-
const voidSerializer = getSerializer(
|
|
50
|
-
"void",
|
|
51
|
-
createResponseSchema({ type: "null" })
|
|
52
|
-
);
|
|
53
|
-
|
|
54
|
-
// --- Controllers ---
|
|
55
|
-
|
|
56
|
-
export async function createRole(req: Request, res: Response) {
|
|
57
|
-
const validator = Validator.make(req.body || {}, {
|
|
58
|
-
name: "required|string|min:1",
|
|
59
|
-
slug: "required|string|min:1|unique:roles,slug",
|
|
60
|
-
description: "string",
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
if (await validator.fails()) {
|
|
64
|
-
sendError(res, 422, "Validation error", validator.errors());
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
const { name, slug, description } = await validator.validated();
|
|
69
|
-
// Manual unique check removed as it is handled by validator
|
|
70
|
-
|
|
71
|
-
const role = await prisma.roles.create({
|
|
72
|
-
data: {
|
|
73
|
-
name,
|
|
74
|
-
slug,
|
|
75
|
-
description: description || null,
|
|
76
|
-
created_at: new Date(),
|
|
77
|
-
updated_at: new Date(),
|
|
78
|
-
},
|
|
79
|
-
});
|
|
80
|
-
sendFastSuccess(res, 201, roleSerializer, {
|
|
81
|
-
status: "success",
|
|
82
|
-
message: "Role created",
|
|
83
|
-
data: { ...role, id: role.id.toString() },
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
export async function listRoles(_req: Request, res: Response) {
|
|
88
|
-
const roles = await prisma.roles.findMany({
|
|
89
|
-
orderBy: { id: "asc" },
|
|
90
|
-
});
|
|
91
|
-
const serialized = roles.map((r: any) => ({ ...r, id: r.id.toString() }));
|
|
92
|
-
sendFastSuccess(res, 200, roleListSerializer, {
|
|
93
|
-
status: "success",
|
|
94
|
-
message: "Roles list",
|
|
95
|
-
data: serialized,
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
export async function updateRole(req: Request, res: Response) {
|
|
100
|
-
const { id } = req.params;
|
|
101
|
-
const roleId = BigInt(id);
|
|
102
|
-
|
|
103
|
-
const validator = Validator.make(req.body || {}, {
|
|
104
|
-
name: "string",
|
|
105
|
-
slug: `string|unique:roles,slug,${id}`,
|
|
106
|
-
description: "string",
|
|
107
|
-
});
|
|
108
|
-
|
|
109
|
-
if (await validator.fails()) {
|
|
110
|
-
sendError(res, 422, "Validation error", validator.errors());
|
|
111
|
-
return;
|
|
112
|
-
}
|
|
113
|
-
const { name, slug, description } = await validator.validated();
|
|
114
|
-
|
|
115
|
-
const role = await prisma.roles.findUnique({ where: { id: roleId } });
|
|
116
|
-
if (!role) {
|
|
117
|
-
sendError(res, 404, "Role not found");
|
|
118
|
-
return;
|
|
119
|
-
}
|
|
120
|
-
// Manual unique check removed as it is handled by validator
|
|
121
|
-
const updated = await prisma.roles.update({
|
|
122
|
-
where: { id: roleId },
|
|
123
|
-
data: {
|
|
124
|
-
name: name ?? role.name,
|
|
125
|
-
slug: slug ?? role.slug,
|
|
126
|
-
description: description ?? role.description,
|
|
127
|
-
updated_at: new Date(),
|
|
128
|
-
},
|
|
129
|
-
});
|
|
130
|
-
sendFastSuccess(res, 200, roleSerializer, {
|
|
131
|
-
status: "success",
|
|
132
|
-
message: "Role updated",
|
|
133
|
-
data: { ...updated, id: updated.id.toString() },
|
|
134
|
-
});
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
export async function deleteRole(req: Request, res: Response) {
|
|
138
|
-
const { id } = req.params;
|
|
139
|
-
const roleId = BigInt(id);
|
|
140
|
-
const role = await prisma.roles.findUnique({ where: { id: roleId } });
|
|
141
|
-
if (!role) {
|
|
142
|
-
sendError(res, 404, "Role not found");
|
|
143
|
-
return;
|
|
144
|
-
}
|
|
145
|
-
await prisma.role_permissions.deleteMany({ where: { role_id: roleId } });
|
|
146
|
-
await prisma.user_roles.deleteMany({ where: { role_id: roleId } });
|
|
147
|
-
await prisma.roles.delete({ where: { id: roleId } });
|
|
148
|
-
sendFastSuccess(res, 200, voidSerializer, {
|
|
149
|
-
status: "success",
|
|
150
|
-
message: "Role deleted",
|
|
151
|
-
data: null,
|
|
152
|
-
});
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
export async function createPermission(req: Request, res: Response) {
|
|
156
|
-
const validator = Validator.make(req.body || {}, {
|
|
157
|
-
name: "required|string|min:1",
|
|
158
|
-
slug: "required|string|min:1|unique:permissions,slug",
|
|
159
|
-
description: "string",
|
|
160
|
-
});
|
|
161
|
-
|
|
162
|
-
if (await validator.fails()) {
|
|
163
|
-
sendError(res, 422, "Validation error", validator.errors());
|
|
164
|
-
return;
|
|
165
|
-
}
|
|
166
|
-
const { name, slug, description } = await validator.validated();
|
|
167
|
-
// Manual unique check removed as it is handled by validator
|
|
168
|
-
|
|
169
|
-
const permission = await prisma.permissions.create({
|
|
170
|
-
data: {
|
|
171
|
-
name,
|
|
172
|
-
slug,
|
|
173
|
-
description: description || null,
|
|
174
|
-
created_at: new Date(),
|
|
175
|
-
updated_at: new Date(),
|
|
176
|
-
},
|
|
177
|
-
});
|
|
178
|
-
sendFastSuccess(res, 201, permissionSerializer, {
|
|
179
|
-
status: "success",
|
|
180
|
-
message: "Permission created",
|
|
181
|
-
data: { ...permission, id: permission.id.toString() },
|
|
182
|
-
});
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
export async function listPermissions(_req: Request, res: Response) {
|
|
186
|
-
const permissions = await prisma.permissions.findMany({
|
|
187
|
-
orderBy: { id: "asc" },
|
|
188
|
-
});
|
|
189
|
-
const serialized = permissions.map((p: any) => ({
|
|
190
|
-
...p,
|
|
191
|
-
id: p.id.toString(),
|
|
192
|
-
}));
|
|
193
|
-
sendFastSuccess(res, 200, permissionListSerializer, {
|
|
194
|
-
status: "success",
|
|
195
|
-
message: "Permissions list",
|
|
196
|
-
data: serialized,
|
|
197
|
-
});
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
export async function updatePermission(req: Request, res: Response) {
|
|
201
|
-
const { id } = req.params;
|
|
202
|
-
const permissionId = BigInt(id);
|
|
203
|
-
|
|
204
|
-
const validator = Validator.make(req.body || {}, {
|
|
205
|
-
name: "string",
|
|
206
|
-
slug: `string|unique:permissions,slug,${id}`,
|
|
207
|
-
description: "string",
|
|
208
|
-
});
|
|
209
|
-
|
|
210
|
-
if (await validator.fails()) {
|
|
211
|
-
sendError(res, 422, "Validation error", validator.errors());
|
|
212
|
-
return;
|
|
213
|
-
}
|
|
214
|
-
const { name, slug, description } = await validator.validated();
|
|
215
|
-
|
|
216
|
-
const permission = await prisma.permissions.findUnique({
|
|
217
|
-
where: { id: permissionId },
|
|
218
|
-
});
|
|
219
|
-
if (!permission) {
|
|
220
|
-
sendError(res, 404, "Permission not found");
|
|
221
|
-
return;
|
|
222
|
-
}
|
|
223
|
-
// Manual unique check removed as it is handled by validator
|
|
224
|
-
const updated = await prisma.permissions.update({
|
|
225
|
-
where: { id: permissionId },
|
|
226
|
-
data: {
|
|
227
|
-
name: name ?? permission.name,
|
|
228
|
-
slug: slug ?? permission.slug,
|
|
229
|
-
description: description ?? permission.description,
|
|
230
|
-
updated_at: new Date(),
|
|
231
|
-
},
|
|
232
|
-
});
|
|
233
|
-
sendFastSuccess(res, 200, permissionSerializer, {
|
|
234
|
-
status: "success",
|
|
235
|
-
message: "Permission updated",
|
|
236
|
-
data: { ...updated, id: updated.id.toString() },
|
|
237
|
-
});
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
export async function deletePermission(req: Request, res: Response) {
|
|
241
|
-
const { id } = req.params;
|
|
242
|
-
const permissionId = BigInt(id);
|
|
243
|
-
const permission = await prisma.permissions.findUnique({
|
|
244
|
-
where: { id: permissionId },
|
|
245
|
-
});
|
|
246
|
-
if (!permission) {
|
|
247
|
-
sendError(res, 404, "Permission not found");
|
|
248
|
-
return;
|
|
249
|
-
}
|
|
250
|
-
await prisma.role_permissions.deleteMany({
|
|
251
|
-
where: { permission_id: permissionId },
|
|
252
|
-
});
|
|
253
|
-
await prisma.user_permissions.deleteMany({
|
|
254
|
-
where: { permission_id: permissionId },
|
|
255
|
-
});
|
|
256
|
-
await prisma.permissions.delete({ where: { id: permissionId } });
|
|
257
|
-
sendFastSuccess(res, 200, voidSerializer, {
|
|
258
|
-
status: "success",
|
|
259
|
-
message: "Permission deleted",
|
|
260
|
-
data: null,
|
|
261
|
-
});
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
export async function assignRoleToUser(req: Request, res: Response) {
|
|
265
|
-
const validator = Validator.make(req.body || {}, {
|
|
266
|
-
userId: z.string().min(1, "userId wajib diisi"),
|
|
267
|
-
roleId: z.string().min(1, "roleId wajib diisi"),
|
|
268
|
-
});
|
|
269
|
-
|
|
270
|
-
if (await validator.fails()) {
|
|
271
|
-
sendError(res, 422, "Validation error", validator.errors());
|
|
272
|
-
return;
|
|
273
|
-
}
|
|
274
|
-
const { userId, roleId } = await validator.validated();
|
|
275
|
-
|
|
276
|
-
const user = await prisma.users.findUnique({
|
|
277
|
-
where: { id: BigInt(userId) },
|
|
278
|
-
});
|
|
279
|
-
if (!user) {
|
|
280
|
-
sendError(res, 404, "User not found");
|
|
281
|
-
return;
|
|
282
|
-
}
|
|
283
|
-
const role = await prisma.roles.findUnique({
|
|
284
|
-
where: { id: BigInt(roleId) },
|
|
285
|
-
});
|
|
286
|
-
if (!role) {
|
|
287
|
-
sendError(res, 404, "Role not found");
|
|
288
|
-
return;
|
|
289
|
-
}
|
|
290
|
-
await prisma.user_roles.upsert({
|
|
291
|
-
where: {
|
|
292
|
-
user_id_role_id: {
|
|
293
|
-
user_id: BigInt(userId),
|
|
294
|
-
role_id: BigInt(roleId),
|
|
295
|
-
},
|
|
296
|
-
},
|
|
297
|
-
create: {
|
|
298
|
-
user_id: BigInt(userId),
|
|
299
|
-
role_id: BigInt(roleId),
|
|
300
|
-
created_at: new Date(),
|
|
301
|
-
},
|
|
302
|
-
update: {},
|
|
303
|
-
});
|
|
304
|
-
sendFastSuccess(res, 200, voidSerializer, {
|
|
305
|
-
status: "success",
|
|
306
|
-
message: "Role assigned to user",
|
|
307
|
-
data: null,
|
|
308
|
-
});
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
export async function removeRoleFromUser(req: Request, res: Response) {
|
|
312
|
-
const validator = Validator.make(req.body || {}, {
|
|
313
|
-
userId: z.string().min(1, "userId wajib diisi"),
|
|
314
|
-
roleId: z.string().min(1, "roleId wajib diisi"),
|
|
315
|
-
});
|
|
316
|
-
|
|
317
|
-
if (await validator.fails()) {
|
|
318
|
-
sendError(res, 422, "Validation error", validator.errors());
|
|
319
|
-
return;
|
|
320
|
-
}
|
|
321
|
-
const { userId, roleId } = await validator.validated();
|
|
322
|
-
|
|
323
|
-
await prisma.user_roles.deleteMany({
|
|
324
|
-
where: {
|
|
325
|
-
user_id: BigInt(userId),
|
|
326
|
-
role_id: BigInt(roleId),
|
|
327
|
-
},
|
|
328
|
-
});
|
|
329
|
-
sendFastSuccess(res, 200, voidSerializer, {
|
|
330
|
-
status: "success",
|
|
331
|
-
message: "Role removed from user",
|
|
332
|
-
data: null,
|
|
333
|
-
});
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
export async function assignPermissionToRole(req: Request, res: Response) {
|
|
337
|
-
const validator = Validator.make(req.body || {}, {
|
|
338
|
-
roleId: z.string().min(1, "roleId wajib diisi"),
|
|
339
|
-
permissionId: z.string().min(1, "permissionId wajib diisi"),
|
|
340
|
-
});
|
|
341
|
-
|
|
342
|
-
if (await validator.fails()) {
|
|
343
|
-
sendError(res, 422, "Validation error", validator.errors());
|
|
344
|
-
return;
|
|
345
|
-
}
|
|
346
|
-
const { roleId, permissionId } = await validator.validated();
|
|
347
|
-
|
|
348
|
-
const role = await prisma.roles.findUnique({
|
|
349
|
-
where: { id: BigInt(roleId) },
|
|
350
|
-
});
|
|
351
|
-
if (!role) {
|
|
352
|
-
sendError(res, 404, "Role not found");
|
|
353
|
-
return;
|
|
354
|
-
}
|
|
355
|
-
const permission = await prisma.permissions.findUnique({
|
|
356
|
-
where: { id: BigInt(permissionId) },
|
|
357
|
-
});
|
|
358
|
-
if (!permission) {
|
|
359
|
-
sendError(res, 404, "Permission not found");
|
|
360
|
-
return;
|
|
361
|
-
}
|
|
362
|
-
await prisma.role_permissions.upsert({
|
|
363
|
-
where: {
|
|
364
|
-
role_id_permission_id: {
|
|
365
|
-
role_id: BigInt(roleId),
|
|
366
|
-
permission_id: BigInt(permissionId),
|
|
367
|
-
},
|
|
368
|
-
},
|
|
369
|
-
create: {
|
|
370
|
-
role_id: BigInt(roleId),
|
|
371
|
-
permission_id: BigInt(permissionId),
|
|
372
|
-
created_at: new Date(),
|
|
373
|
-
},
|
|
374
|
-
update: {},
|
|
375
|
-
});
|
|
376
|
-
sendFastSuccess(res, 200, voidSerializer, {
|
|
377
|
-
status: "success",
|
|
378
|
-
message: "Permission assigned to role",
|
|
379
|
-
data: null,
|
|
380
|
-
});
|
|
381
|
-
}
|
|
382
|
-
|
|
383
|
-
export async function removePermissionFromRole(req: Request, res: Response) {
|
|
384
|
-
const validator = Validator.make(req.body || {}, {
|
|
385
|
-
roleId: z.string().min(1, "roleId wajib diisi"),
|
|
386
|
-
permissionId: z.string().min(1, "permissionId wajib diisi"),
|
|
387
|
-
});
|
|
388
|
-
|
|
389
|
-
if (await validator.fails()) {
|
|
390
|
-
sendError(res, 422, "Validation error", validator.errors());
|
|
391
|
-
return;
|
|
392
|
-
}
|
|
393
|
-
const { roleId, permissionId } = await validator.validated();
|
|
394
|
-
|
|
395
|
-
await prisma.role_permissions.deleteMany({
|
|
396
|
-
where: {
|
|
397
|
-
role_id: BigInt(roleId),
|
|
398
|
-
permission_id: BigInt(permissionId),
|
|
399
|
-
},
|
|
400
|
-
});
|
|
401
|
-
sendFastSuccess(res, 200, voidSerializer, {
|
|
402
|
-
status: "success",
|
|
403
|
-
message: "Permission removed from role",
|
|
404
|
-
data: null,
|
|
405
|
-
});
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
export async function assignPermissionToUser(req: Request, res: Response) {
|
|
409
|
-
const validator = Validator.make(req.body || {}, {
|
|
410
|
-
userId: z.string().min(1, "userId wajib diisi"),
|
|
411
|
-
permissionId: z.string().min(1, "permissionId wajib diisi"),
|
|
412
|
-
});
|
|
413
|
-
|
|
414
|
-
if (await validator.fails()) {
|
|
415
|
-
sendError(res, 422, "Validation error", validator.errors());
|
|
416
|
-
return;
|
|
417
|
-
}
|
|
418
|
-
const { userId, permissionId } = await validator.validated();
|
|
419
|
-
|
|
420
|
-
const user = await prisma.users.findUnique({
|
|
421
|
-
where: { id: BigInt(userId) },
|
|
422
|
-
});
|
|
423
|
-
if (!user) {
|
|
424
|
-
sendError(res, 404, "User not found");
|
|
425
|
-
return;
|
|
426
|
-
}
|
|
427
|
-
const permission = await prisma.permissions.findUnique({
|
|
428
|
-
where: { id: BigInt(permissionId) },
|
|
429
|
-
});
|
|
430
|
-
if (!permission) {
|
|
431
|
-
sendError(res, 404, "Permission not found");
|
|
432
|
-
return;
|
|
433
|
-
}
|
|
434
|
-
await prisma.user_permissions.upsert({
|
|
435
|
-
where: {
|
|
436
|
-
user_id_permission_id: {
|
|
437
|
-
user_id: BigInt(userId),
|
|
438
|
-
permission_id: BigInt(permissionId),
|
|
439
|
-
},
|
|
440
|
-
},
|
|
441
|
-
create: {
|
|
442
|
-
user_id: BigInt(userId),
|
|
443
|
-
permission_id: BigInt(permissionId),
|
|
444
|
-
created_at: new Date(),
|
|
445
|
-
},
|
|
446
|
-
update: {},
|
|
447
|
-
});
|
|
448
|
-
sendFastSuccess(res, 200, voidSerializer, {
|
|
449
|
-
status: "success",
|
|
450
|
-
message: "Permission assigned to user",
|
|
451
|
-
data: null,
|
|
452
|
-
});
|
|
453
|
-
}
|
|
454
|
-
|
|
455
|
-
export async function removePermissionFromUser(req: Request, res: Response) {
|
|
456
|
-
const validator = Validator.make(req.body || {}, {
|
|
457
|
-
userId: z.string().min(1, "userId wajib diisi"),
|
|
458
|
-
permissionId: z.string().min(1, "permissionId wajib diisi"),
|
|
459
|
-
});
|
|
460
|
-
|
|
461
|
-
if (await validator.fails()) {
|
|
462
|
-
sendError(res, 422, "Validation error", validator.errors());
|
|
463
|
-
return;
|
|
464
|
-
}
|
|
465
|
-
const { userId, permissionId } = await validator.validated();
|
|
466
|
-
|
|
467
|
-
await prisma.user_permissions.deleteMany({
|
|
468
|
-
where: {
|
|
469
|
-
user_id: BigInt(userId),
|
|
470
|
-
permission_id: BigInt(permissionId),
|
|
471
|
-
},
|
|
472
|
-
});
|
|
473
|
-
sendFastSuccess(res, 200, voidSerializer, {
|
|
474
|
-
status: "success",
|
|
475
|
-
message: "Permission removed from user",
|
|
476
|
-
data: null,
|
|
477
|
-
});
|
|
478
|
-
}
|
package/src/models/core.prisma
DELETED
|
@@ -1,163 +0,0 @@
|
|
|
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
|
-
}
|
package/src/models/pets.prisma
DELETED
package/src/routes/auth.ts
DELETED
|
@@ -1,74 +0,0 @@
|
|
|
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
|
-
);
|