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) + }) +} + +