From 17dc9649c5b4c4048586dd361cabc2049fd83118 Mon Sep 17 00:00:00 2001 From: Gabriellvl Date: Sun, 13 Apr 2025 20:50:15 +0200 Subject: [PATCH] feat: controller + queries --- frontend/src/controllers/classes.ts | 9 +-- .../src/controllers/teacher-invitations.ts | 28 ++++++++ frontend/src/queries/teacher-invitations.ts | 65 +++++++++++++++++++ 3 files changed, 94 insertions(+), 8 deletions(-) create mode 100644 frontend/src/controllers/teacher-invitations.ts create mode 100644 frontend/src/queries/teacher-invitations.ts diff --git a/frontend/src/controllers/classes.ts b/frontend/src/controllers/classes.ts index 03e3f560..65a992a5 100644 --- a/frontend/src/controllers/classes.ts +++ b/frontend/src/controllers/classes.ts @@ -4,6 +4,7 @@ import type { StudentsResponse } from "./students"; import type { AssignmentsResponse } from "./assignments"; import type { TeacherInvitationDTO } from "@dwengo-1/common/interfaces/teacher-invitation"; import type { TeachersResponse } from "@/controllers/teachers.ts"; +import type {TeacherInvitationsResponse} from "@/controllers/teacher-invitations.ts"; export interface ClassesResponse { classes: ClassDTO[] | string[]; @@ -13,14 +14,6 @@ export interface ClassResponse { class: ClassDTO; } -export interface TeacherInvitationsResponse { - invites: TeacherInvitationDTO[]; -} - -export interface TeacherInvitationResponse { - invite: TeacherInvitationDTO; -} - export class ClassController extends BaseController { constructor() { super("class"); diff --git a/frontend/src/controllers/teacher-invitations.ts b/frontend/src/controllers/teacher-invitations.ts new file mode 100644 index 00000000..30201821 --- /dev/null +++ b/frontend/src/controllers/teacher-invitations.ts @@ -0,0 +1,28 @@ +import {BaseController} from "@/controllers/base-controller.ts"; +import type {TeacherInvitationData, TeacherInvitationDTO} from "@dwengo-1/common/interfaces/teacher-invitation"; + +export interface TeacherInvitationsResponse { + invitations: TeacherInvitationDTO[] +} + +export interface TeacherInvitationResponse { + invitation: TeacherInvitationDTO +} + +export class TeacherInvitationController extends BaseController { + constructor() { + super("teachers/invitations"); + } + + async getAll(username: string, by: boolean): Promise { + return this.get(`/${username}`, { by }); + } + + async create(data: TeacherInvitationData): Promise { + return this.post("/", data); + } + + async respond(data: TeacherInvitationData, accepted: boolean): Promise { + return this.delete(`/${data.sender}/${data.receiver}/${data.class}`, { accepted }); + } +} diff --git a/frontend/src/queries/teacher-invitations.ts b/frontend/src/queries/teacher-invitations.ts new file mode 100644 index 00000000..e0b1e957 --- /dev/null +++ b/frontend/src/queries/teacher-invitations.ts @@ -0,0 +1,65 @@ +import { + useMutation, + useQuery, + type UseMutationReturnType, + type UseQueryReturnType, +} from "@tanstack/vue-query"; +import { computed, toValue } from "vue"; +import type { MaybeRefOrGetter } from "vue"; +import { + TeacherInvitationController, + type TeacherInvitationResponse, + type TeacherInvitationsResponse +} from "@/controllers/teacher-invitations.ts"; +import type {TeacherInvitationData} from "@dwengo-1/common/dist/interfaces/teacher-invitation.ts"; +import type {TeacherDTO} from "@dwengo-1/common/dist/interfaces/teacher.ts"; + +const controller = new TeacherInvitationController(); + +/** + all the invitations the teacher send +**/ +export function useTeacherInvitationsByQuery(username: MaybeRefOrGetter +): UseQueryReturnType { + return useQuery({ + queryFn: computed(() => controller.getAll(toValue(username), true)), + enabled: () => Boolean(toValue(username)), + }) +} + +/** + all the pending invitations send to this teacher + */ +export function useTeacherInvitationsForQuery(username: MaybeRefOrGetter +): UseQueryReturnType { + return useQuery({ + queryFn: computed(() => controller.getAll(toValue(username), false)), + enabled: () => Boolean(toValue(username)), + }) +} + +export function useCreateTeacherInvitationMutation(): UseMutationReturnType{ + return useMutation({ + mutationFn: async (data: TeacherInvitationData) => controller.create(data) + }) +} + +export function useAcceptTeacherInvitationMutation(): UseMutationReturnType { + return useMutation({ + mutationFn: async (data: TeacherInvitationData) => controller.respond(data, true) + }) +} + +export function useDeclineTeacherInvitationMutation(): UseMutationReturnType { + return useMutation({ + mutationFn: async (data: TeacherInvitationData) => controller.respond(data, false) + }) +} + +export function useDeleteTeacherInvitationMutation(): UseMutationReturnType { + return useMutation({ + mutationFn: async (data: TeacherInvitationData) => controller.respond(data, false) + }) +} + +