update : Revision after first pull request on management-aspect

This commit is contained in:
percyfikri 2024-08-14 14:22:58 +07:00
parent 1774dda83e
commit 625420417e

View File

@ -2,7 +2,6 @@
import { Hono } from "hono"; import { Hono } from "hono";
import { z } from "zod"; import { z } from "zod";
import { HTTPException } from "hono/http-exception";
import db from "../../drizzle"; import db from "../../drizzle";
import { aspects } from "../../drizzle/schema/aspects"; import { aspects } from "../../drizzle/schema/aspects";
import { subAspects } from "../../drizzle/schema/subAspects"; import { subAspects } from "../../drizzle/schema/subAspects";
@ -10,6 +9,8 @@
import requestValidator from "../../utils/requestValidator"; import requestValidator from "../../utils/requestValidator";
import authInfo from "../../middlewares/authInfo"; import authInfo from "../../middlewares/authInfo";
import checkPermission from "../../middlewares/checkPermission"; import checkPermission from "../../middlewares/checkPermission";
import { forbidden } from "../../errors/DashboardError";
import { notFound } from "../../errors/DashboardError";
// Schema for creating and updating aspects // Schema for creating and updating aspects
export const aspectFormSchema = z.object({ export const aspectFormSchema = z.object({
@ -53,6 +54,7 @@
* - includeTrashed: boolean (default: false) * - includeTrashed: boolean (default: false)
* - withMetadata: boolean * - withMetadata: boolean
*/ */
// Get all aspects // Get all aspects
.get( .get(
"/", "/",
@ -124,10 +126,12 @@
async (c) => { async (c) => {
const aspectId = c.req.param("id"); const aspectId = c.req.param("id");
if (!aspectId) throw new HTTPException(400, { message: "Missing id" }); if (!aspectId)
throw notFound({
message: "Missing id",
});
const includeTrashed = const includeTrashed = c.req.query("includeTrashed")?.toLowerCase() === "true";
c.req.query("includeTrashed")?.toLowerCase() === "true";
const queryResult = await db const queryResult = await db
.select({ .select({
@ -143,15 +147,10 @@
}) })
.from(aspects) .from(aspects)
.leftJoin(subAspects, eq(aspects.id, subAspects.aspectId)) .leftJoin(subAspects, eq(aspects.id, subAspects.aspectId))
.where( .where(and(eq(aspects.id, aspectId), !includeTrashed ? isNull(aspects.deletedAt) : undefined));
and(
eq(aspects.id, aspectId),
!includeTrashed ? isNull(aspects.deletedAt) : undefined
)
);
if (!queryResult.length) if (!queryResult.length)
throw new HTTPException(404, { throw forbidden({
message: "The aspect does not exist", message: "The aspect does not exist",
}); });
@ -172,21 +171,22 @@
) )
// Create aspect // Create aspect
.post( .post("/",
"/",
checkPermission("managementAspect.create"), 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 // Validation to check if the aspect name already exists
const existingAspect = await db const existingAspect = await db
.select() .select()
.from(aspects) .from(aspects)
.where(ilike(aspects.name, aspectData.name)); .where(eq(aspects.name, aspectData.name));
if (existingAspect.length > 0) { if (existingAspect.length > 0) {
throw new HTTPException(400, { message: "Aspect name already existss" }); throw forbidden({
message: "Aspect name already exists",
});
} }
const aspect = await db const aspect = await db
@ -196,9 +196,10 @@
}) })
.returning(); .returning();
// if sub-aspects are available, parse them into a string array
if (aspectData.subAspects) { if (aspectData.subAspects) {
const subAspectsArray = JSON.parse(aspectData.subAspects) as string[]; const subAspectsArray = JSON.parse(aspectData.subAspects) as string[];
// if there are sub-aspects, insert them into the database
if (subAspectsArray.length) { if (subAspectsArray.length) {
await db.insert(subAspects).values( await db.insert(subAspects).values(
subAspectsArray.map((subAspect) => ({ subAspectsArray.map((subAspect) => ({
@ -227,20 +228,22 @@
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 // Validation to check if the new aspect name already exists
const existingAspect = await db const existingAspect = await db
.select() .select()
.from(aspects) .from(aspects)
.where( .where(
and( and(
ilike(aspects.name, aspectData.name), eq(aspects.name, aspectData.name),
isNull(aspects.deletedAt), isNull(aspects.deletedAt),
sql`${aspects.id} <> ${aspectId}` sql`${aspects.id} <> ${aspectId}`
) )
); );
if (existingAspect.length > 0) { if (existingAspect.length > 0) {
throw new HTTPException(400, { message: "Aspect name already exists" }); throw forbidden({
message: "Aspect name already exists",
});
} }
const aspect = await db const aspect = await db
@ -248,7 +251,7 @@
.from(aspects) .from(aspects)
.where(and(eq(aspects.id, aspectId), isNull(aspects.deletedAt))); .where(and(eq(aspects.id, aspectId), isNull(aspects.deletedAt)));
if (!aspect[0]) return c.notFound(); if (!aspect[0]) throw notFound();
await db await db
.update(aspects) .update(aspects)
@ -258,20 +261,21 @@
}) })
.where(eq(aspects.id, aspectId)); .where(eq(aspects.id, aspectId));
if (aspectData.subAspects) { //Update for Sub-Aspects
const subAspectsArray = JSON.parse(aspectData.subAspects) as string[]; // if (aspectData.subAspects) {
// const subAspectsArray = JSON.parse(aspectData.subAspects) as string[];
await db.delete(subAspects).where(eq(subAspects.aspectId, aspectId)); // await db.delete(subAspects).where(eq(subAspects.aspectId, aspectId));
if (subAspectsArray.length) { // if (subAspectsArray.length) {
await db.insert(subAspects).values( // await db.insert(subAspects).values(
subAspectsArray.map((subAspect) => ({ // subAspectsArray.map((subAspect) => ({
aspectId: aspectId, // aspectId: aspectId,
name: subAspect, // name: subAspect,
})) // }))
); // );
} // }
} // }
return c.json({ return c.json({
message: "Aspect updated successfully", message: "Aspect updated successfully",
@ -286,34 +290,31 @@
requestValidator( requestValidator(
"form", "form",
z.object({ z.object({
skipTrash: z.string().default("false"), // skipTrash: z.string().default("false"),
}) })
), ),
async (c) => { async (c) => {
const aspectId = c.req.param("id"); const aspectId = c.req.param("id");
const skipTrash = c.req.valid("form").skipTrash.toLowerCase() === "true"; // const skipTrash = c.req.valid("form").skipTrash.toLowerCase() === "true";
const aspect = await db const aspect = await db
.select() .select()
.from(aspects) .from(aspects)
.where(and(eq(aspects.id, aspectId), skipTrash ? undefined : isNull(aspects.deletedAt))); .where(and(eq(aspects.id, aspectId), isNull(aspects.deletedAt)));
if (!aspect[0]) if (!aspect[0])
throw new HTTPException(404, { throw notFound({
message: "The aspect is not found", message: "The aspect is not found",
}); });
if (skipTrash) {
await db.delete(aspects).where(eq(aspects.id, aspectId));
} else {
await db await db
.update(aspects) .update(aspects)
.set({ .set({
deletedAt: new Date(), deletedAt: new Date(),
}) })
.where(and(eq(aspects.id, aspectId), isNull(aspects.deletedAt))); .where(eq(aspects.id, aspectId));
}
return c.json({ return c.json({
message: "Aspect deleted successfully", message: "Aspect deleted successfully",
}); });
@ -332,7 +333,7 @@
if (!aspect) return c.notFound(); if (!aspect) return c.notFound();
if (!aspect.deletedAt) { if (!aspect.deletedAt) {
throw new HTTPException(400, { throw forbidden({
message: "The aspect is not deleted", message: "The aspect is not deleted",
}); });
} }
@ -355,10 +356,12 @@
const aspect = await db const aspect = await db
.select() .select()
.from(aspects) .from(aspects)
.where(and(eq(aspects.id, aspectId), isNull(aspects.deletedAt))); .where(and(
eq(aspects.id, aspectId),
isNull(aspects.deletedAt)));
if (!aspect[0]) if (!aspect[0])
throw new HTTPException(404, { throw notFound({
message: "The aspect is not found", message: "The aspect is not found",
}); });
@ -381,28 +384,29 @@
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 // Validation to check if the sub aspect name already exists
const existingSubAspect = await db const existingSubAspect = await db
.select() .select()
.from(subAspects) .from(subAspects)
.where( .where(
and( and(
ilike(subAspects.name, subAspectData.name), eq(subAspects.name, subAspectData.name),
eq(subAspects.aspectId, subAspectData.aspectId) eq(subAspects.aspectId, subAspectData.aspectId)));
)
);
if (existingSubAspect.length > 0) { if (existingSubAspect.length > 0) {
throw new HTTPException(400, { message: "Nama Sub Aspek sudah tersedia!" }); throw forbidden({ message: "Nama Sub Aspek sudah tersedia!" });
} }
const aspect = await db const [aspect] = await db
.select() .select()
.from(aspects) .from(aspects)
.where(and(eq(aspects.id, subAspectData.aspectId), isNull(aspects.deletedAt))); .where(
and(
eq(aspects.id, subAspectData.aspectId),
isNull(aspects.deletedAt)));
if (!aspect[0]) if (!aspect)
throw new HTTPException(404, { throw forbidden({
message: "The aspect is not found", message: "The aspect is not found",
}); });
@ -419,36 +423,25 @@
// Update sub aspect // Update sub aspect
.patch( .patch(
"/subAspect/:id", "/subAspect/:id", checkPermission("managementAspect.update"),
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 // Validation to check if the new sub aspect name already exists
const existingSubAspect = await db const existingSubAspect = await db
.select() .select()
.from(subAspects) .from(subAspects)
.where( .where(
and( eq(subAspects.aspectId, subAspectData.aspectId));
ilike(subAspects.name, subAspectData.name),
eq(subAspects.aspectId, subAspectData.aspectId),
sql`${subAspects.id} <> ${subAspectId}`
)
);
if (existingSubAspect.length > 0) { if (existingSubAspect.length > 0) {
throw new HTTPException(400, { message: "Name Sub Aspect already exists" }); throw forbidden({ message: "Name Sub Aspect already exists" });
} }
const subAspect = await db if (!existingSubAspect[0])
.select() throw notFound({
.from(subAspects)
.where(eq(subAspects.id, subAspectId));
if (!subAspect[0])
throw new HTTPException(404, {
message: "The sub aspect is not found", message: "The sub aspect is not found",
}); });
@ -463,8 +456,7 @@
return c.json({ return c.json({
message: "Sub aspect updated successfully", message: "Sub aspect updated successfully",
}); });
} })
)
// Delete sub aspect // Delete sub aspect
.delete( .delete(
@ -479,11 +471,17 @@
.where(eq(subAspects.id, subAspectId)); .where(eq(subAspects.id, subAspectId));
if (!subAspect[0]) if (!subAspect[0])
throw new HTTPException(404, { throw notFound({
message: "The sub aspect is not found", message: "The sub aspect is not found",
}); });
await db.delete(subAspects).where(eq(subAspects.id, subAspectId)); await db
.update(subAspects)
.set({
deletedAt: new Date(),
})
.where(eq(subAspects.id, subAspectId));
// await db.delete(subAspects).where(eq(subAspects.id, subAspectId));
return c.json({ return c.json({
message: "Sub aspect deleted successfully", message: "Sub aspect deleted successfully",
@ -492,4 +490,3 @@
); );
export default managementAspectRoute; export default managementAspectRoute;