Pull Request branch dev-clone to main #1
|
|
@ -32,6 +32,21 @@ const permissionsData = [
|
||||||
{
|
{
|
||||||
code: "roles.delete",
|
code: "roles.delete",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
code: "managementAspect.readAll",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
code: "managementAspect.create",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
code: "managementAspect.update",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
code: "managementAspect.delete",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
code: "managementAspect.restore",
|
||||||
|
},
|
||||||
] as const;
|
] as const;
|
||||||
|
|
||||||
export type SpecificPermissionCode = (typeof permissionsData)[number]["code"];
|
export type SpecificPermissionCode = (typeof permissionsData)[number]["code"];
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ import { configDotenv } from "dotenv";
|
||||||
import { Hono } from "hono";
|
import { Hono } from "hono";
|
||||||
import authRoutes from "./routes/auth/route";
|
import authRoutes from "./routes/auth/route";
|
||||||
import usersRoute from "./routes/users/route";
|
import usersRoute from "./routes/users/route";
|
||||||
import aspectsRoute from "./routes/managementAspect/route";
|
import managementAspectsRoute from "./routes/managementAspect/route";
|
||||||
import { verifyAccessToken } from "./utils/authUtils";
|
import { verifyAccessToken } from "./utils/authUtils";
|
||||||
import permissionRoutes from "./routes/permissions/route";
|
import permissionRoutes from "./routes/permissions/route";
|
||||||
import { cors } from "hono/cors";
|
import { cors } from "hono/cors";
|
||||||
|
|
@ -79,7 +79,7 @@ const routes = app
|
||||||
.route("/dashboard", dashboardRoutes)
|
.route("/dashboard", dashboardRoutes)
|
||||||
.route("/roles", rolesRoute)
|
.route("/roles", rolesRoute)
|
||||||
.route("/dev", devRoutes)
|
.route("/dev", devRoutes)
|
||||||
.route("/management-aspect", aspectsRoute)
|
.route("/management-aspect", managementAspectsRoute)
|
||||||
.onError((err, c) => {
|
.onError((err, c) => {
|
||||||
if (err instanceof DashboardError) {
|
if (err instanceof DashboardError) {
|
||||||
return c.json(
|
return c.json(
|
||||||
|
|
|
||||||
|
|
@ -56,6 +56,7 @@ const managementAspectRoute = new Hono<HonoEnv>()
|
||||||
// Get all aspects
|
// Get all aspects
|
||||||
.get(
|
.get(
|
||||||
"/",
|
"/",
|
||||||
|
checkPermission("managementAspect.readAll"),
|
||||||
requestValidator(
|
requestValidator(
|
||||||
"query",
|
"query",
|
||||||
z.object({
|
z.object({
|
||||||
|
|
@ -109,9 +110,11 @@ const managementAspectRoute = new Hono<HonoEnv>()
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
// Get aspect by id
|
// Get aspect by id
|
||||||
.get(
|
.get(
|
||||||
"/:id",
|
"/:id",
|
||||||
|
checkPermission("managementAspect.readAll"),
|
||||||
requestValidator(
|
requestValidator(
|
||||||
"query",
|
"query",
|
||||||
z.object({
|
z.object({
|
||||||
|
|
@ -167,13 +170,25 @@ const managementAspectRoute = new Hono<HonoEnv>()
|
||||||
return c.json(aspectData);
|
return c.json(aspectData);
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
// Create aspect
|
// Create aspect
|
||||||
.post(
|
.post(
|
||||||
"/",
|
"/",
|
||||||
|
checkPermission("managementAspect.create"),
|
||||||
requestValidator("json", aspectFormSchema),
|
requestValidator("json", aspectFormSchema),
|
||||||
async (c) => {
|
async (c) => {
|
||||||
const aspectData = c.req.valid("json");
|
const aspectData = c.req.valid("json");
|
||||||
|
|
||||||
|
// Validasi untuk mengecek apakah nama aspek sudah ada
|
||||||
|
const existingAspect = await db
|
||||||
|
.select()
|
||||||
|
.from(aspects)
|
||||||
|
.where(ilike(aspects.name, aspectData.name));
|
||||||
|
|
||||||
|
if (existingAspect.length > 0) {
|
||||||
|
throw new HTTPException(400, { message: "Aspect name already existss" });
|
||||||
|
}
|
||||||
|
|
||||||
const aspect = await db
|
const aspect = await db
|
||||||
.insert(aspects)
|
.insert(aspects)
|
||||||
.values({
|
.values({
|
||||||
|
|
@ -202,14 +217,32 @@ const managementAspectRoute = new Hono<HonoEnv>()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
// Update aspect
|
// Update aspect
|
||||||
.patch(
|
.patch(
|
||||||
"/:id",
|
"/:id",
|
||||||
|
checkPermission("managementAspect.update"),
|
||||||
requestValidator("json", aspectUpdateSchema),
|
requestValidator("json", aspectUpdateSchema),
|
||||||
async (c) => {
|
async (c) => {
|
||||||
const aspectId = c.req.param("id");
|
const aspectId = c.req.param("id");
|
||||||
const aspectData = c.req.valid("json");
|
const aspectData = c.req.valid("json");
|
||||||
|
|
||||||
|
// Validasi untuk mengecek apakah nama aspek baru sudah ada
|
||||||
|
const existingAspect = await db
|
||||||
|
.select()
|
||||||
|
.from(aspects)
|
||||||
|
.where(
|
||||||
|
and(
|
||||||
|
ilike(aspects.name, aspectData.name),
|
||||||
|
isNull(aspects.deletedAt),
|
||||||
|
sql`${aspects.id} <> ${aspectId}`
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
if (existingAspect.length > 0) {
|
||||||
|
throw new HTTPException(400, { message: "Aspect name already exists" });
|
||||||
|
}
|
||||||
|
|
||||||
const aspect = await db
|
const aspect = await db
|
||||||
.select()
|
.select()
|
||||||
.from(aspects)
|
.from(aspects)
|
||||||
|
|
@ -245,9 +278,11 @@ const managementAspectRoute = new Hono<HonoEnv>()
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
// Delete aspect
|
// Delete aspect
|
||||||
.delete(
|
.delete(
|
||||||
"/:id",
|
"/:id",
|
||||||
|
checkPermission("managementAspect.delete"),
|
||||||
requestValidator(
|
requestValidator(
|
||||||
"form",
|
"form",
|
||||||
z.object({
|
z.object({
|
||||||
|
|
@ -284,9 +319,11 @@ const managementAspectRoute = new Hono<HonoEnv>()
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
// Undo delete
|
// Undo delete
|
||||||
.patch(
|
.patch(
|
||||||
"/restore/:id",
|
"/restore/:id",
|
||||||
|
checkPermission("managementAspect.restore"),
|
||||||
async (c) => {
|
async (c) => {
|
||||||
const aspectId = c.req.param("id");
|
const aspectId = c.req.param("id");
|
||||||
|
|
||||||
|
|
@ -307,13 +344,58 @@ const managementAspectRoute = new Hono<HonoEnv>()
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Get sub aspects by aspect ID
|
||||||
|
.get(
|
||||||
|
"/subAspects/:aspectId",
|
||||||
|
checkPermission("managementAspect.readAll"),
|
||||||
|
async (c) => {
|
||||||
|
const aspectId = c.req.param("aspectId");
|
||||||
|
|
||||||
|
const aspect = await db
|
||||||
|
.select()
|
||||||
|
.from(aspects)
|
||||||
|
.where(and(eq(aspects.id, aspectId), isNull(aspects.deletedAt)));
|
||||||
|
|
||||||
|
if (!aspect[0])
|
||||||
|
throw new HTTPException(404, {
|
||||||
|
message: "The aspect is not found",
|
||||||
|
});
|
||||||
|
|
||||||
|
const subAspectsData = await db
|
||||||
|
.select()
|
||||||
|
.from(subAspects)
|
||||||
|
.where(eq(subAspects.aspectId, aspectId));
|
||||||
|
|
||||||
|
return c.json({
|
||||||
|
subAspects: subAspectsData,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
// Create sub aspect
|
// Create sub aspect
|
||||||
.post(
|
.post(
|
||||||
"/subAspect",
|
"/subAspect",
|
||||||
|
checkPermission("managementAspect.create"),
|
||||||
requestValidator("json", subAspectFormSchema),
|
requestValidator("json", subAspectFormSchema),
|
||||||
async (c) => {
|
async (c) => {
|
||||||
const subAspectData = c.req.valid("json");
|
const subAspectData = c.req.valid("json");
|
||||||
|
|
||||||
|
// Validasi untuk mengecek apakah nama sub aspek sudah ada
|
||||||
|
const existingSubAspect = await db
|
||||||
|
.select()
|
||||||
|
.from(subAspects)
|
||||||
|
.where(
|
||||||
|
and(
|
||||||
|
ilike(subAspects.name, subAspectData.name),
|
||||||
|
eq(subAspects.aspectId, subAspectData.aspectId)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
if (existingSubAspect.length > 0) {
|
||||||
|
throw new HTTPException(400, { message: "Nama Sub Aspek sudah tersedia!" });
|
||||||
|
}
|
||||||
|
|
||||||
const aspect = await db
|
const aspect = await db
|
||||||
.select()
|
.select()
|
||||||
.from(aspects)
|
.from(aspects)
|
||||||
|
|
@ -334,14 +416,32 @@ const managementAspectRoute = new Hono<HonoEnv>()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
// Update sub aspect
|
// Update sub aspect
|
||||||
.patch(
|
.patch(
|
||||||
"/subAspect/:id",
|
"/subAspect/:id",
|
||||||
|
checkPermission("managementAspect.update"),
|
||||||
requestValidator("json", subAspectUpdateSchema),
|
requestValidator("json", subAspectUpdateSchema),
|
||||||
async (c) => {
|
async (c) => {
|
||||||
const subAspectId = c.req.param("id");
|
const subAspectId = c.req.param("id");
|
||||||
const subAspectData = c.req.valid("json");
|
const subAspectData = c.req.valid("json");
|
||||||
|
|
||||||
|
// Validasi untuk mengecek apakah nama sub aspek baru sudah ada
|
||||||
|
const existingSubAspect = await db
|
||||||
|
.select()
|
||||||
|
.from(subAspects)
|
||||||
|
.where(
|
||||||
|
and(
|
||||||
|
ilike(subAspects.name, subAspectData.name),
|
||||||
|
eq(subAspects.aspectId, subAspectData.aspectId),
|
||||||
|
sql`${subAspects.id} <> ${subAspectId}`
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
if (existingSubAspect.length > 0) {
|
||||||
|
throw new HTTPException(400, { message: "Name Sub Aspect already exists" });
|
||||||
|
}
|
||||||
|
|
||||||
const subAspect = await db
|
const subAspect = await db
|
||||||
.select()
|
.select()
|
||||||
.from(subAspects)
|
.from(subAspects)
|
||||||
|
|
@ -365,9 +465,11 @@ const managementAspectRoute = new Hono<HonoEnv>()
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
// Delete sub aspect
|
// Delete sub aspect
|
||||||
.delete(
|
.delete(
|
||||||
"/subAspect/:id",
|
"/subAspect/:id",
|
||||||
|
checkPermission("managementAspect.delete"),
|
||||||
async (c) => {
|
async (c) => {
|
||||||
const subAspectId = c.req.param("id");
|
const subAspectId = c.req.param("id");
|
||||||
|
|
||||||
|
|
@ -387,32 +489,7 @@ const managementAspectRoute = new Hono<HonoEnv>()
|
||||||
message: "Sub aspect deleted successfully",
|
message: "Sub aspect deleted successfully",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
)
|
|
||||||
// Get sub aspects by aspect ID
|
|
||||||
.get(
|
|
||||||
"/subAspects/:aspectId",
|
|
||||||
async (c) => {
|
|
||||||
const aspectId = c.req.param("aspectId");
|
|
||||||
|
|
||||||
const aspect = await db
|
|
||||||
.select()
|
|
||||||
.from(aspects)
|
|
||||||
.where(and(eq(aspects.id, aspectId), isNull(aspects.deletedAt)));
|
|
||||||
|
|
||||||
if (!aspect[0])
|
|
||||||
throw new HTTPException(404, {
|
|
||||||
message: "The aspect is not found",
|
|
||||||
});
|
|
||||||
|
|
||||||
const subAspectsData = await db
|
|
||||||
.select()
|
|
||||||
.from(subAspects)
|
|
||||||
.where(eq(subAspects.aspectId, aspectId));
|
|
||||||
|
|
||||||
return c.json({
|
|
||||||
subAspects: subAspectsData,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
);
|
);
|
||||||
|
|
||||||
export default managementAspectRoute;
|
export default managementAspectRoute;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user