update : add checkpermission and added api merge for aspects and subAspects

This commit is contained in:
percyfikri 2024-08-12 11:33:56 +07:00
parent 70702950d4
commit 94cf958318
3 changed files with 469 additions and 377 deletions

View File

@ -32,6 +32,21 @@ const permissionsData = [
{
code: "roles.delete",
},
{
code: "managementAspect.readAll",
},
{
code: "managementAspect.create",
},
{
code: "managementAspect.update",
},
{
code: "managementAspect.delete",
},
{
code: "managementAspect.restore",
},
] as const;
export type SpecificPermissionCode = (typeof permissionsData)[number]["code"];

View File

@ -3,7 +3,7 @@ import { configDotenv } from "dotenv";
import { Hono } from "hono";
import authRoutes from "./routes/auth/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 permissionRoutes from "./routes/permissions/route";
import { cors } from "hono/cors";
@ -79,7 +79,7 @@ const routes = app
.route("/dashboard", dashboardRoutes)
.route("/roles", rolesRoute)
.route("/dev", devRoutes)
.route("/management-aspect", aspectsRoute)
.route("/management-aspect", managementAspectsRoute)
.onError((err, c) => {
if (err instanceof DashboardError) {
return c.json(

View File

@ -1,18 +1,18 @@
import { and, eq, ilike, isNull, or, sql } from "drizzle-orm";
import { Hono } from "hono";
import { and, eq, ilike, isNull, or, sql } from "drizzle-orm";
import { Hono } from "hono";
import { z } from "zod";
import { HTTPException } from "hono/http-exception";
import db from "../../drizzle";
import { aspects } from "../../drizzle/schema/aspects";
import { subAspects } from "../../drizzle/schema/subAspects";
import HonoEnv from "../../types/HonoEnv";
import requestValidator from "../../utils/requestValidator";
import authInfo from "../../middlewares/authInfo";
import checkPermission from "../../middlewares/checkPermission";
import { z } from "zod";
import { HTTPException } from "hono/http-exception";
import db from "../../drizzle";
import { aspects } from "../../drizzle/schema/aspects";
import { subAspects } from "../../drizzle/schema/subAspects";
import HonoEnv from "../../types/HonoEnv";
import requestValidator from "../../utils/requestValidator";
import authInfo from "../../middlewares/authInfo";
import checkPermission from "../../middlewares/checkPermission";
// Schema for creating and updating aspects
export const aspectFormSchema = z.object({
// Schema for creating and updating aspects
export const aspectFormSchema = z.object({
name: z.string().min(1).max(50),
subAspects: z
.string()
@ -30,21 +30,21 @@ export const aspectFormSchema = z.object({
}
)
.optional(),
});
});
export const aspectUpdateSchema = aspectFormSchema.extend({
export const aspectUpdateSchema = aspectFormSchema.extend({
subAspects: z.string().optional().or(z.literal("")),
});
});
// Schema for creating and updating subAspects
export const subAspectFormSchema = z.object({
// Schema for creating and updating subAspects
export const subAspectFormSchema = z.object({
name: z.string().min(1).max(50),
aspectId: z.string().uuid(),
});
});
export const subAspectUpdateSchema = subAspectFormSchema.extend({});
export const subAspectUpdateSchema = subAspectFormSchema.extend({});
const managementAspectRoute = new Hono<HonoEnv>()
const managementAspectRoute = new Hono<HonoEnv>()
.use(authInfo)
/**
* Get All Aspects (With Metadata)
@ -56,6 +56,7 @@ const managementAspectRoute = new Hono<HonoEnv>()
// Get all aspects
.get(
"/",
checkPermission("managementAspect.readAll"),
requestValidator(
"query",
z.object({
@ -109,9 +110,11 @@ const managementAspectRoute = new Hono<HonoEnv>()
});
}
)
// Get aspect by id
.get(
"/:id",
checkPermission("managementAspect.readAll"),
requestValidator(
"query",
z.object({
@ -167,13 +170,25 @@ const managementAspectRoute = new Hono<HonoEnv>()
return c.json(aspectData);
}
)
// Create aspect
.post(
"/",
checkPermission("managementAspect.create"),
requestValidator("json", aspectFormSchema),
async (c) => {
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
.insert(aspects)
.values({
@ -202,14 +217,32 @@ const managementAspectRoute = new Hono<HonoEnv>()
);
}
)
// Update aspect
.patch(
"/:id",
checkPermission("managementAspect.update"),
requestValidator("json", aspectUpdateSchema),
async (c) => {
const aspectId = c.req.param("id");
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
.select()
.from(aspects)
@ -245,9 +278,11 @@ const managementAspectRoute = new Hono<HonoEnv>()
});
}
)
// Delete aspect
.delete(
"/:id",
checkPermission("managementAspect.delete"),
requestValidator(
"form",
z.object({
@ -284,9 +319,11 @@ const managementAspectRoute = new Hono<HonoEnv>()
});
}
)
// Undo delete
.patch(
"/restore/:id",
checkPermission("managementAspect.restore"),
async (c) => {
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
.post(
"/subAspect",
checkPermission("managementAspect.create"),
requestValidator("json", subAspectFormSchema),
async (c) => {
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
.select()
.from(aspects)
@ -334,14 +416,32 @@ const managementAspectRoute = new Hono<HonoEnv>()
);
}
)
// Update sub aspect
.patch(
"/subAspect/:id",
checkPermission("managementAspect.update"),
requestValidator("json", subAspectUpdateSchema),
async (c) => {
const subAspectId = c.req.param("id");
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
.select()
.from(subAspects)
@ -365,9 +465,11 @@ const managementAspectRoute = new Hono<HonoEnv>()
});
}
)
// Delete sub aspect
.delete(
"/subAspect/:id",
checkPermission("managementAspect.delete"),
async (c) => {
const subAspectId = c.req.param("id");
@ -387,32 +489,7 @@ const managementAspectRoute = new Hono<HonoEnv>()
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;