diff --git a/frontend/src/queries/assignments.ts b/frontend/src/queries/assignments.ts new file mode 100644 index 00000000..a7a8caaf --- /dev/null +++ b/frontend/src/queries/assignments.ts @@ -0,0 +1,54 @@ +import { AssignmentController, type AssignmentsResponse } from "@/controllers/assignments"; +import { useQuery, type UseQueryReturnType } from "@tanstack/vue-query"; +import { computed, toValue, type MaybeRefOrGetter } from "vue"; + +function assignmentsQueryKey(classid: string, full: boolean) { + return [ "assignments", classid, full ]; +} +function assignmentQueryKey(classid: string, assignmentNumber: number) { + return [ "assignment", classid, assignmentNumber ]; +} + +function checkEnabled( + classid: string | undefined, + assignmentNumber: number | undefined, + groupNumber: number | undefined, +): boolean { + return Boolean(classid) && !isNaN(Number(groupNumber)) && !isNaN(Number(assignmentNumber)); +} +function toValues( + classid: MaybeRefOrGetter, + assignmentNumber: MaybeRefOrGetter, + groupNumber: MaybeRefOrGetter, + full: MaybeRefOrGetter, +) { + return { cid: toValue(classid), an: toValue(assignmentNumber), gn: toValue(groupNumber), f: toValue(full) }; +} + +export function useAssignmentsQuery( + classid: MaybeRefOrGetter, + assignmentNumber: MaybeRefOrGetter, + full: MaybeRefOrGetter = true, +): UseQueryReturnType { + const { cid, an, f } = toValues(classid, assignmentNumber, 1, full); + + return useQuery({ + queryKey: computed(() => (assignmentsQueryKey(cid!, f))), + queryFn: async () => new AssignmentController(cid!).getAll(f), + enabled: () => checkEnabled(cid, an, 1), + }); +} + +export function useAssignmentQuery( + classid: MaybeRefOrGetter, + assignmentNumber: MaybeRefOrGetter, + groupNumber: MaybeRefOrGetter, +): UseQueryReturnType { + const { cid, an, gn } = toValues(classid, assignmentNumber, groupNumber, true); + + return useQuery({ + queryKey: computed(() => assignmentQueryKey(cid!, an!)), + queryFn: async () => new AssignmentController(cid!).getByNumber(gn!), + enabled: () => checkEnabled(cid, an, gn), + }); +} \ No newline at end of file diff --git a/frontend/src/queries/submissions.ts b/frontend/src/queries/submissions.ts index 374d83d6..3a15f16e 100644 --- a/frontend/src/queries/submissions.ts +++ b/frontend/src/queries/submissions.ts @@ -3,11 +3,11 @@ import type { SubmissionDTO } from "@dwengo-1/common/interfaces/submission"; import { useMutation, useQuery, useQueryClient, type UseMutationReturnType, 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 submissionsQueryKey(classid: string, assignmentNumber: number, groupNumber: number, full: boolean) { + return [ "submissions", classid, assignmentNumber, groupNumber, full ]; } -function submissionQueryKey(classid: string, assignmentNumber: number, groupNumber: number) { - return [ "submission", classid, assignmentNumber, groupNumber ]; +function submissionQueryKey(classid: string, assignmentNumber: number, groupNumber: number, submissionNumber: number) { + return [ "submission", classid, assignmentNumber, groupNumber, submissionNumber ]; } function checkEnabled( @@ -46,7 +46,7 @@ export function useSubmissionsQuery( const { cid, an, gn, sn, f } = toValues(classid, assignmentNumber, groupNumber, 1, full); return useQuery({ - queryKey: computed(() => (submissionsQueryKey(cid!, an!, f))), + queryKey: computed(() => (submissionsQueryKey(cid!, an!, gn!, f))), queryFn: async () => new SubmissionController(cid!, an!, gn!).getAll(f), enabled: () => checkEnabled(cid, an, gn, sn), }); @@ -60,7 +60,7 @@ export function useSubmissionQuery( const { cid, an, gn, sn, f } = toValues(classid, assignmentNumber, groupNumber, 1, true); return useQuery({ - queryKey: computed(() => submissionQueryKey(cid!, an!, gn!)), + queryKey: computed(() => submissionQueryKey(cid!, an!, gn!, sn!)), queryFn: async () => new SubmissionController(cid!, an!, gn!).getByNumber(sn!), enabled: () => checkEnabled(cid, an, gn, sn), }); @@ -79,8 +79,8 @@ export function useCreateSubmissionMutation( return useMutation({ mutationFn: async (data) => new SubmissionController(cid!, an!, gn!).createSubmission(data), onSuccess: async () => { - await queryClient.invalidateQueries({ queryKey: submissionsQueryKey(cid!, an!, true) }); - await queryClient.invalidateQueries({ queryKey: submissionsQueryKey(cid!, an!, false) }); + await queryClient.invalidateQueries({ queryKey: submissionsQueryKey(cid!, an!, gn!, true) }); + await queryClient.invalidateQueries({ queryKey: submissionsQueryKey(cid!, an!, gn!, false) }); }, }); } @@ -96,8 +96,8 @@ export function useDeleteGroupMutation( return useMutation({ mutationFn: async (id) => new SubmissionController(cid!, an!, gn!).deleteSubmission(id), onSuccess: async () => { - await queryClient.invalidateQueries({ queryKey: submissionsQueryKey(cid!, an!, true) }); - await queryClient.invalidateQueries({ queryKey: submissionsQueryKey(cid!, an!, false) }); + await queryClient.invalidateQueries({ queryKey: submissionsQueryKey(cid!, an!, gn!, true) }); + await queryClient.invalidateQueries({ queryKey: submissionsQueryKey(cid!, an!, gn!, false) }); }, }); } \ No newline at end of file