diff --git a/frontend/src/controllers/groups.ts b/frontend/src/controllers/groups.ts index de6592b5..361dd9d3 100644 --- a/frontend/src/controllers/groups.ts +++ b/frontend/src/controllers/groups.ts @@ -16,11 +16,15 @@ export class GroupController extends BaseController { super(`class/${classid}/assignments/${assignmentNumber}/groups`); } + update(classid: string, assignmentNumber: number) { + this.basePath = `class/${classid}/assignments/${assignmentNumber}/groups`; + } + async getAll(full = true): Promise { return this.get(`/`, { full }); } - async getByNumber(num: number): Promise { + async getByNumber(num: number | string): Promise { return this.get(`/${num}`); } diff --git a/frontend/src/queries/groups.ts b/frontend/src/queries/groups.ts new file mode 100644 index 00000000..6465ce87 --- /dev/null +++ b/frontend/src/queries/groups.ts @@ -0,0 +1,74 @@ +import type { ClassesResponse } from "@/controllers/classes"; +import { GroupController, type GroupResponse, type GroupsResponse } from "@/controllers/groups"; +import type { QuestionsResponse } from "@/controllers/questions"; +import type { SubmissionsResponse } from "@/controllers/submissions"; +import { useQuery, type UseQueryReturnType } from "@tanstack/vue-query"; +import { computed, toValue, type MaybeRefOrGetter } from "vue"; + +const groupController = new GroupController('', 0); + +function groupsQueryKey(classid: string, assignmentNumber: number) { + return [ "groups", classid, assignmentNumber ]; +} +function groupQueryKey(classid: string, assignmentNumber: number, groupNumber: number) { + return [ "group", classid, assignmentNumber, groupNumber ]; +} +function groupSubmissionsQueryKey(classid: string, assignmentNumber: number, groupNumber: number) { + return [ "group-submissions", classid, assignmentNumber, groupNumber ]; +} + +export function useGroupsQuery( + classid: string, + assignmentNumber: number, +): UseQueryReturnType { + groupController.update(classid, assignmentNumber); + + return useQuery({ + queryKey: computed(() => (groupsQueryKey(classid, assignmentNumber))), + queryFn: async () => groupController.getAll(), + }); +} + +export function useGroupQuery( + classid: string, + assignmentNumber: number, + groupNumber: MaybeRefOrGetter, +): UseQueryReturnType { + groupController.update(classid, assignmentNumber); + + return useQuery({ + queryKey: computed(() => groupQueryKey(classid, assignmentNumber, toValue(groupNumber)!)), + queryFn: async () => groupController.getByNumber(toValue(groupNumber)!), + enabled: () => !isNaN(Number(toValue(groupNumber))), + }); +} + +export function useGroupSubmissionsQuery( + classid: string, + assignmentNumber: number, + groupNumber: MaybeRefOrGetter, + full: MaybeRefOrGetter = true, +): UseQueryReturnType { + groupController.update(classid, assignmentNumber); + + return useQuery({ + queryKey: computed(() => groupSubmissionsQueryKey(classid, assignmentNumber, toValue(groupNumber)!)), + queryFn: async () => groupController.getSubmissions(toValue(groupNumber)!, toValue(full)!), + enabled: () => !isNaN(Number(toValue(groupNumber))), + }); +} + +export function useGroupQuestionsQuery( + classid: string, + assignmentNumber: number, + groupNumber: MaybeRefOrGetter, + full: MaybeRefOrGetter = true, +): UseQueryReturnType { + groupController.update(classid, assignmentNumber); + + return useQuery({ + queryKey: computed(() => groupSubmissionsQueryKey(classid, assignmentNumber, toValue(groupNumber)!)), + queryFn: async () => groupController.getSubmissions(toValue(groupNumber)!, toValue(full)!), + enabled: () => !isNaN(Number(toValue(groupNumber))), + }); +}