diff --git a/apps/backend/src/data/permissions.ts b/apps/backend/src/data/permissions.ts index f8ac1ef..34c2ae1 100644 --- a/apps/backend/src/data/permissions.ts +++ b/apps/backend/src/data/permissions.ts @@ -89,6 +89,9 @@ const permissionsData = [ { code: "assessmentRequest.create", }, + { + code: "assessmentRequest.update", + }, { code: "assessments.readAspect", }, diff --git a/apps/backend/src/routes/assessmentRequest/route.ts b/apps/backend/src/routes/assessmentRequest/route.ts index dc2abee..aa33c27 100644 --- a/apps/backend/src/routes/assessmentRequest/route.ts +++ b/apps/backend/src/routes/assessmentRequest/route.ts @@ -145,6 +145,65 @@ const assessmentRequestRoute = new Hono() return c.json({ message: "Successfully submitted the assessment request", data: newAssessment }, 201); } + ) + + // Update assessment status when the user clicks the start assessment button + .patch( + "/:assessmentId", + checkPermission("assessmentRequest.update"), + requestValidator( + "json", + z.object({ + status: z.enum([ + "menunggu konfirmasi", + "diterima", + "ditolak", + "dalam pengerjaan", + "belum diverifikasi", + "selesai", + ]).optional(), + }) + ), + async (c) => { + const currentUser = c.get("currentUser"); + const userId = currentUser?.id; + const { assessmentId } = c.req.param(); + const { status } = c.req.valid("json"); + + if (!userId) { + throw forbidden({ + message: "User not authenticated", + }); + } + + // Check if the assessment with the given assessmentId exists and belongs to the user + const existingAssessment = await db + .select() + .from(assessments) + .leftJoin(respondents, eq(assessments.respondentId, respondents.id)) + .where(and(eq(assessments.id, assessmentId), eq(respondents.userId, userId))); + + if (!existingAssessment.length) { + throw notFound({ + message: "Assessment not found or unauthorized.", + }); + } + + // Update assessment status to "dalam pengerjaan" + const updatedAssessment = await db + .update(assessments) + .set({ + status: status || "dalam pengerjaan", + }) + .where(eq(assessments.id, assessmentId)) + .returning(); + + return c.json({ + message: "Assessment status updated successfully", + data: updatedAssessment, + }); + } ); + export default assessmentRequestRoute; \ No newline at end of file diff --git a/apps/frontend/src/modules/assessmentRequest/queries/assessmentRequestQueries.ts b/apps/frontend/src/modules/assessmentRequest/queries/assessmentRequestQueries.ts index 1be2a03..f09dfa8 100644 --- a/apps/frontend/src/modules/assessmentRequest/queries/assessmentRequestQueries.ts +++ b/apps/frontend/src/modules/assessmentRequest/queries/assessmentRequestQueries.ts @@ -27,4 +27,24 @@ export const createAssessmentRequest = async ({ respondentsId }: { respondentsId } return await response.json(); - }; \ No newline at end of file + }; + +// Query to update assessment status +export const updateAssessmentRequest = async ({ + assessmentId, + status, +}: { + assessmentId: string; + status: "menunggu konfirmasi" | "diterima" | "ditolak" | "dalam pengerjaan" | "belum diverifikasi" | "selesai"; +}) => { + const response = await client.assessmentRequest[":assessmentId"].$patch({ + json: { status }, + param: { assessmentId }, + }); + + if (!response.ok) { + throw new Error("Gagal memperbarui status permohonan asesmen"); + } + + return await response.json(); +}; \ No newline at end of file diff --git a/apps/frontend/src/routes/_dashboardLayout/assessmentRequest/index.lazy.tsx b/apps/frontend/src/routes/_dashboardLayout/assessmentRequest/index.lazy.tsx index 7dc3b8d..eae3c60 100644 --- a/apps/frontend/src/routes/_dashboardLayout/assessmentRequest/index.lazy.tsx +++ b/apps/frontend/src/routes/_dashboardLayout/assessmentRequest/index.lazy.tsx @@ -1,5 +1,5 @@ import { useState } from "react"; -import { assessmentRequestQueryOptions } from "@/modules/assessmentRequest/queries/assessmentRequestQueries"; +import { assessmentRequestQueryOptions, updateAssessmentRequest } from "@/modules/assessmentRequest/queries/assessmentRequestQueries"; import PageTemplate from "@/components/PageTemplate"; import { createLazyFileRoute } from "@tanstack/react-router"; import FormModal from "@/modules/assessmentRequest/modals/CreateAssessmentRequestModal"; @@ -38,16 +38,28 @@ export default function UsersPage() { }; /** - * Function to open assessment page in new tab - * @param {string} assessmentId ID of the assessment to be opened + * Function to start assessment and redirect to the assessment page in new tab + * This function will update the status of the assessment to "dalam pengerjaan" + * and then open the assessment page in a new tab + * @param {string} assessmentId ID of the assessment to be started */ - const handleStartAssessment = (assessmentId: string) => { - // Redirect to new URL in new tab - const assessmentUrl = `/assessment?id=${assessmentId}`; - window.open(assessmentUrl, "_blank"); - setModalOpen(false); - }; + const handleStartAssessment = async (assessmentId: string) => { + try { + await updateAssessmentRequest({ + assessmentId, + status: "dalam pengerjaan", + }); + // Redirect to the assessment page + const assessmentUrl = `/assessment?id=${assessmentId}`; + window.open(assessmentUrl, "_blank"); + } catch (error) { + console.error("Gagal memulai asesmen:", error); + } finally { + setModalOpen(false); + } + }; + /** * Function to open assessment result page based on valid ID * Used when "View Result" button is clicked @@ -97,16 +109,34 @@ export default function UsersPage() { cell: (props) => { const status = props.row.original.status; switch (status) { + case "dalam pengerjaan": + return
+ Dalam Pengerjaan +
; case "menunggu konfirmasi": - return Menunggu Konfirmasi; + return
+ Menunggu Konfirmasi +
; case "diterima": - return Diterima; + return
+ Diterima +
; case "ditolak": - return Ditolak; + return
+ Ditolak +
; + case "belum diverifikasi": + return
+ Belum Diverifikasi +
; case "selesai": - return Selesai; + return
+ Selesai +
; default: - return Tidak diketahui; + return
+ Tidak diketahui +
; } }, }), @@ -122,22 +152,36 @@ export default function UsersPage() { {status === "selesai" ? ( ) : status === "diterima" ? ( - + ) : status === "dalam pengerjaan" ? ( + ) : ( - + )} {/* Button View Result */} {status === "selesai" ? ( + + Lihat Hasil + + ) : status === "belum diverifikasi" ? ( + ) : ( - + )} );