From 70d4c80093dd7f34cadcd44dd271e90c5942395d Mon Sep 17 00:00:00 2001 From: Gabriellvl Date: Mon, 24 Mar 2025 17:12:31 +0100 Subject: [PATCH] feat: student query --- frontend/config.ts | 1 - frontend/src/controllers/controllers.ts | 4 +- .../{student-controller.ts => students.ts} | 0 .../{teacher-controller.ts => teachers.ts} | 0 frontend/src/queries/students.ts | 101 ++++++++++++++++++ 5 files changed, 103 insertions(+), 3 deletions(-) delete mode 100644 frontend/config.ts rename frontend/src/controllers/{student-controller.ts => students.ts} (100%) rename frontend/src/controllers/{teacher-controller.ts => teachers.ts} (100%) create mode 100644 frontend/src/queries/students.ts diff --git a/frontend/config.ts b/frontend/config.ts deleted file mode 100644 index 656687fd..00000000 --- a/frontend/config.ts +++ /dev/null @@ -1 +0,0 @@ -export const API_BASE = "http://localhost:3000/api"; diff --git a/frontend/src/controllers/controllers.ts b/frontend/src/controllers/controllers.ts index c712c8b5..47136f46 100644 --- a/frontend/src/controllers/controllers.ts +++ b/frontend/src/controllers/controllers.ts @@ -1,5 +1,5 @@ -import { StudentController } from "@/controllers/student-controller.ts"; -import { TeacherController } from "@/controllers/teacher-controller.ts"; +import { StudentController } from "@/controllers/students.ts"; +import { TeacherController } from "@/controllers/teachers.ts"; import {ThemeController} from "@/controllers/themes.ts"; diff --git a/frontend/src/controllers/student-controller.ts b/frontend/src/controllers/students.ts similarity index 100% rename from frontend/src/controllers/student-controller.ts rename to frontend/src/controllers/students.ts diff --git a/frontend/src/controllers/teacher-controller.ts b/frontend/src/controllers/teachers.ts similarity index 100% rename from frontend/src/controllers/teacher-controller.ts rename to frontend/src/controllers/teachers.ts diff --git a/frontend/src/queries/students.ts b/frontend/src/queries/students.ts new file mode 100644 index 00000000..40304dcf --- /dev/null +++ b/frontend/src/queries/students.ts @@ -0,0 +1,101 @@ +import { computed, toValue } from "vue"; +import type { MaybeRefOrGetter } from "vue"; +import { useQuery } from "@tanstack/vue-query"; +import { getStudentController } from "@/controllers/controllers.ts"; + +const studentController = getStudentController(); + +/** 🔑 Query keys */ +const STUDENTS_QUERY_KEY = (full: boolean) => ['students', full]; +const STUDENT_QUERY_KEY = (username: string) => ['student', username]; +const STUDENT_CLASSES_QUERY_KEY = (username: string, full: boolean) => ['student-classes', username, full]; +const STUDENT_ASSIGNMENTS_QUERY_KEY = (username: string, full: boolean) => ['student-assignments', username, full]; +const STUDENT_GROUPS_QUERY_KEY = (username: string, full: boolean) => ['student-groups', username, full]; +const STUDENT_SUBMISSIONS_QUERY_KEY = (username: string) => ['student-submissions', username]; +const STUDENT_QUESTIONS_QUERY_KEY = (username: string, full: boolean) => ['student-questions', username, full]; + +export function useStudentsQuery(full: MaybeRefOrGetter = true) { + return useQuery({ + queryKey: computed(() => STUDENTS_QUERY_KEY(toValue(full))), + queryFn: () => studentController.getAll(toValue(full)), + }); +} + +export function useStudentQuery(username: MaybeRefOrGetter) { + return useQuery({ + queryKey: computed(() => STUDENT_QUERY_KEY(toValue(username)!)), + queryFn: () => studentController.getByUsername(toValue(username)!), + enabled: () => !!toValue(username), + }); +} + +export function useStudentClassesQuery(username: MaybeRefOrGetter, full: MaybeRefOrGetter = true) { + return useQuery({ + queryKey: computed(() => STUDENT_CLASSES_QUERY_KEY(toValue(username)!, toValue(full))), + queryFn: () => studentController.getClasses(toValue(username)!, toValue(full)), + enabled: () => !!toValue(username), + }); +} + +export function useStudentAssignmentsQuery(username: MaybeRefOrGetter, full: MaybeRefOrGetter = true) { + return useQuery({ + queryKey: computed(() => STUDENT_ASSIGNMENTS_QUERY_KEY(toValue(username)!, toValue(full))), + queryFn: () => studentController.getAssignments(toValue(username)!, toValue(full)), + enabled: () => !!toValue(username), + }); +} + +export function useStudentGroupsQuery(username: MaybeRefOrGetter, full: MaybeRefOrGetter = true) { + return useQuery({ + queryKey: computed(() => STUDENT_GROUPS_QUERY_KEY(toValue(username)!, toValue(full))), + queryFn: () => studentController.getGroups(toValue(username)!, toValue(full)), + enabled: () => !!toValue(username), + }); +} + +export function useStudentSubmissionsQuery(username: MaybeRefOrGetter) { + return useQuery({ + queryKey: computed(() => STUDENT_SUBMISSIONS_QUERY_KEY(toValue(username)!)), + queryFn: () => studentController.getSubmissions(toValue(username)!), + enabled: () => !!toValue(username), + }); +} + +export function useStudentQuestionsQuery(username: MaybeRefOrGetter, full: MaybeRefOrGetter = true) { + return useQuery({ + queryKey: computed(() => STUDENT_QUESTIONS_QUERY_KEY(toValue(username)!, toValue(full))), + queryFn: () => studentController.getQuestions(toValue(username)!, toValue(full)), + enabled: () => !!toValue(username), + }); +} + +export function useCreateStudentMutation() { + const queryClient = useQueryClient(); + + return useMutation({ + mutationFn: (data: any) => studentController.createStudent(data), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ['students'] }); + }, + onError: (err) => { + alert("Create student failed:", err); + }, + }); +} + +// TODO +// setquerydata +// previous students +export function useDeleteStudentMutation() { + const queryClient = useQueryClient(); + + return useMutation({ + mutationFn: (username: string) => studentController.deleteStudent(username), + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ['students'] }); + }, + onError: (err) => { + alert("Delete student failed:", err); + }, + }); +}