From 2cda69ef5ef4f79e0d4aeb9b6eed9b10e8bc3c29 Mon Sep 17 00:00:00 2001 From: Adriaan Jacquet Date: Sat, 12 Apr 2025 19:56:04 +0200 Subject: [PATCH] feat: submission query get all en get --- frontend/src/controllers/submissions.ts | 8 ++- frontend/src/queries/submissions.ts | 66 +++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 2 deletions(-) create mode 100644 frontend/src/queries/submissions.ts diff --git a/frontend/src/controllers/submissions.ts b/frontend/src/controllers/submissions.ts index 837d356c..1f281e62 100644 --- a/frontend/src/controllers/submissions.ts +++ b/frontend/src/controllers/submissions.ts @@ -11,7 +11,11 @@ export interface SubmissionResponse { export class SubmissionController extends BaseController { constructor(classid: string, assignmentNumber: number, groupNumber: number) { - super(`class/${classid}/assignments/${assignmentNumber}/groups/${groupNumber}`); + super(`class/${classid}/assignments/${assignmentNumber}/groups/${groupNumber}/submissions`); + } + + protected getBasePath(classid: string, assignmentNumber: number, groupNumber: number) { + return `class/${classid}/assignments/${assignmentNumber}/groups/${groupNumber}/submissions`; } async getAll(full = true): Promise { @@ -22,7 +26,7 @@ export class SubmissionController extends BaseController { return this.get(`/${submissionNumber}`); } - async createSubmission(data: unknown): Promise { + async createSubmission(data: SubmissionDTO): Promise { return this.post(`/`, data); } diff --git a/frontend/src/queries/submissions.ts b/frontend/src/queries/submissions.ts new file mode 100644 index 00000000..defa6c38 --- /dev/null +++ b/frontend/src/queries/submissions.ts @@ -0,0 +1,66 @@ +import { SubmissionController, type SubmissionResponse, type SubmissionsResponse } from "@/controllers/submissions"; +import { useQuery, type UseQueryReturnType } from "@tanstack/vue-query"; +import { computed, toValue, type MaybeRefOrGetter } from "vue"; + +function submissionsQueryKey(classid: string, assignmentNumber: number, full: boolean) { + return [ "submissions", classid, assignmentNumber, full ]; +} +function submissionQueryKey(classid: string, assignmentNumber: number, groupNumber: number) { + return [ "submission", classid, assignmentNumber, groupNumber ]; +} + +function checkEnabled( + classid: string | undefined, + assignmentNumber: number | undefined, + groupNumber: number | undefined, + submissionNumber: number | undefined +): boolean { + return Boolean(classid) + && !isNaN(Number(groupNumber)) + && !isNaN(Number(assignmentNumber)) + && !isNaN(Number(submissionNumber)); +} +function toValues( + classid: MaybeRefOrGetter, + assignmentNumber: MaybeRefOrGetter, + groupNumber: MaybeRefOrGetter, + submissionNumber: MaybeRefOrGetter, + full: MaybeRefOrGetter, +) { + return { + cid: toValue(classid), + an: toValue(assignmentNumber), + gn: toValue(groupNumber), + sn: toValue(submissionNumber), + f: toValue(full) + }; +} + +export function useSubmissionsQuery( + classid: MaybeRefOrGetter, + assignmentNumber: MaybeRefOrGetter, + groupNumber: MaybeRefOrGetter, + full: MaybeRefOrGetter = true, +): UseQueryReturnType { + const { cid, an, gn, sn, f } = toValues(classid, assignmentNumber, groupNumber, 1, full); + + return useQuery({ + queryKey: computed(() => (submissionsQueryKey(cid!, an!, f))), + queryFn: async () => new SubmissionController(cid!, an!, gn!).getAll(f), + enabled: () => checkEnabled(cid, an, gn, sn), + }); +} + +export function useSubmissionQuery( + classid: MaybeRefOrGetter, + assignmentNumber: MaybeRefOrGetter, + groupNumber: MaybeRefOrGetter, +): UseQueryReturnType { + const { cid, an, gn, sn, f } = toValues(classid, assignmentNumber, groupNumber, 1, true); + + return useQuery({ + queryKey: computed(() => submissionQueryKey(cid!, an!, gn!)), + queryFn: async () => new SubmissionController(cid!, an!, gn!).getByNumber(sn!), + enabled: () => checkEnabled(cid, an, gn, sn), + }); +} \ No newline at end of file