diff --git a/backend/src/controllers/teacher-invitations.ts b/backend/src/controllers/teacher-invitations.ts index 15bfc936..b826dee3 100644 --- a/backend/src/controllers/teacher-invitations.ts +++ b/backend/src/controllers/teacher-invitations.ts @@ -1,7 +1,7 @@ import { Request, Response } from 'express'; -import {requireFields} from "./error-helper"; -import {createInvitation, deleteInvitationFor, getAllInvitations} from "../services/teacher-invitations"; -import {TeacherInvitationData} from "@dwengo-1/common/interfaces/teacher-invitation"; +import { requireFields } from './error-helper'; +import { createInvitation, deleteInvitationFor, getAllInvitations } from '../services/teacher-invitations'; +import { TeacherInvitationData } from '@dwengo-1/common/interfaces/teacher-invitation'; export async function getAllInvitationsHandler(req: Request, res: Response): Promise { const username = req.params.username; diff --git a/backend/src/data/classes/teacher-invitation-repository.ts b/backend/src/data/classes/teacher-invitation-repository.ts index 5461d29b..69c0a972 100644 --- a/backend/src/data/classes/teacher-invitation-repository.ts +++ b/backend/src/data/classes/teacher-invitation-repository.ts @@ -25,6 +25,6 @@ export class TeacherInvitationRepository extends DwengoEntityRepository { const teacher = await fetchTeacher(username); @@ -29,12 +29,12 @@ export async function createInvitation(data: TeacherInvitationData): Promise { +export async function deleteInvitationFor( + usernameSender: string, + usernameReceiver: string, + classId: string, + accepted: boolean +): Promise { const teacherInvitationRepository = getTeacherInvitationRepository(); const sender = await fetchTeacher(usernameSender); const receiver = await fetchTeacher(usernameReceiver); @@ -60,12 +65,9 @@ export async function deleteInvitationFor(usernameSender: string, usernameReceiv const invitation = await fetchInvitation(sender, receiver, cls); await teacherInvitationRepository.deleteBy(cls, sender, receiver); - if (accepted){ + if (accepted) { await addClassTeacher(classId, usernameReceiver); } return mapToTeacherInvitationDTO(invitation); } - - - diff --git a/backend/tests/controllers/teacher-invitations.test.ts b/backend/tests/controllers/teacher-invitations.test.ts index 8135281a..6f233898 100644 --- a/backend/tests/controllers/teacher-invitations.test.ts +++ b/backend/tests/controllers/teacher-invitations.test.ts @@ -1,13 +1,9 @@ import { beforeAll, beforeEach, describe, expect, it, Mock, vi } from 'vitest'; import { Request, Response } from 'express'; import { setupTestApp } from '../setup-tests.js'; -import { - createInvitationHandler, - deleteInvitationForHandler, - getAllInvitationsHandler -} from "../../src/controllers/teacher-invitations"; -import {TeacherInvitationData} from "@dwengo-1/common/interfaces/teacher-invitation"; -import {getClassHandler} from "../../src/controllers/classes"; +import { createInvitationHandler, deleteInvitationForHandler, getAllInvitationsHandler } from '../../src/controllers/teacher-invitations'; +import { TeacherInvitationData } from '@dwengo-1/common/interfaces/teacher-invitation'; +import { getClassHandler } from '../../src/controllers/classes'; describe('Teacher controllers', () => { let req: Partial; @@ -27,22 +23,22 @@ describe('Teacher controllers', () => { }); it('Get teacher invitations by', async () => { - req = {params: {username: 'LimpBizkit'}, query: {by: 'true' }}; + req = { params: { username: 'LimpBizkit' }, query: { by: 'true' } }; await getAllInvitationsHandler(req as Request, res as Response); - expect(jsonMock).toHaveBeenCalledWith(expect.objectContaining({invitations: expect.anything()})); + expect(jsonMock).toHaveBeenCalledWith(expect.objectContaining({ invitations: expect.anything() })); const result = jsonMock.mock.lastCall?.[0]; expect(result.invitations).to.have.length.greaterThan(0); }); it('Get teacher invitations for', async () => { - req = {params: {username: 'FooFighters'}, query: {by: 'false' }}; + req = { params: { username: 'FooFighters' }, query: { by: 'false' } }; await getAllInvitationsHandler(req as Request, res as Response); - expect(jsonMock).toHaveBeenCalledWith(expect.objectContaining({invitations: expect.anything()})); + expect(jsonMock).toHaveBeenCalledWith(expect.objectContaining({ invitations: expect.anything() })); const result = jsonMock.mock.lastCall?.[0]; expect(result.invitations).to.have.length.greaterThan(0); @@ -50,8 +46,9 @@ describe('Teacher controllers', () => { it('Create and delete invitation', async () => { const body = { - sender: 'LimpBizkit', receiver: 'testleerkracht1', - class: '34d484a1-295f-4e9f-bfdc-3e7a23d86a89' + sender: 'LimpBizkit', + receiver: 'testleerkracht1', + class: '34d484a1-295f-4e9f-bfdc-3e7a23d86a89', } as TeacherInvitationData; req = { body }; @@ -59,9 +56,11 @@ describe('Teacher controllers', () => { req = { params: { - sender: 'LimpBizkit', receiver: 'testleerkracht1', - classId: '34d484a1-295f-4e9f-bfdc-3e7a23d86a89' - }, body: { accepted: 'false' } + sender: 'LimpBizkit', + receiver: 'testleerkracht1', + classId: '34d484a1-295f-4e9f-bfdc-3e7a23d86a89', + }, + body: { accepted: 'false' }, }; await deleteInvitationForHandler(req as Request, res as Response); @@ -69,8 +68,9 @@ describe('Teacher controllers', () => { it('Create and accept invitation', async () => { const body = { - sender: 'LimpBizkit', receiver: 'testleerkracht1', - class: '34d484a1-295f-4e9f-bfdc-3e7a23d86a89' + sender: 'LimpBizkit', + receiver: 'testleerkracht1', + class: '34d484a1-295f-4e9f-bfdc-3e7a23d86a89', } as TeacherInvitationData; req = { body }; @@ -78,16 +78,20 @@ describe('Teacher controllers', () => { req = { params: { - sender: 'LimpBizkit', receiver: 'testleerkracht1', - classId: '34d484a1-295f-4e9f-bfdc-3e7a23d86a89' - }, body: { accepted: 'true' } + sender: 'LimpBizkit', + receiver: 'testleerkracht1', + classId: '34d484a1-295f-4e9f-bfdc-3e7a23d86a89', + }, + body: { accepted: 'true' }, }; await deleteInvitationForHandler(req as Request, res as Response); - req = {params: { - id: '34d484a1-295f-4e9f-bfdc-3e7a23d86a89' - }}; + req = { + params: { + id: '34d484a1-295f-4e9f-bfdc-3e7a23d86a89', + }, + }; await getClassHandler(req as Request, res as Response); diff --git a/backend/tests/setup-tests.ts b/backend/tests/setup-tests.ts index b0e5ef5b..699e081b 100644 --- a/backend/tests/setup-tests.ts +++ b/backend/tests/setup-tests.ts @@ -13,7 +13,7 @@ import { makeTestAttachments } from './test_assets/content/attachments.testdata. import { makeTestQuestions } from './test_assets/questions/questions.testdata.js'; import { makeTestAnswers } from './test_assets/questions/answers.testdata.js'; import { makeTestSubmissions } from './test_assets/assignments/submission.testdata.js'; -import {Collection} from "@mikro-orm/core"; +import { Collection } from '@mikro-orm/core'; export async function setupTestApp(): Promise { dotenv.config({ path: '.env.test' }); diff --git a/frontend/src/controllers/classes.ts b/frontend/src/controllers/classes.ts index 9020e166..c9b7f6fa 100644 --- a/frontend/src/controllers/classes.ts +++ b/frontend/src/controllers/classes.ts @@ -3,7 +3,7 @@ import type { ClassDTO } from "@dwengo-1/common/interfaces/class"; import type { StudentsResponse } from "./students"; import type { AssignmentsResponse } from "./assignments"; import type { TeachersResponse } from "@/controllers/teachers.ts"; -import type {TeacherInvitationsResponse} from "@/controllers/teacher-invitations.ts"; +import type { TeacherInvitationsResponse } from "@/controllers/teacher-invitations.ts"; export interface ClassesResponse { classes: ClassDTO[] | string[]; diff --git a/frontend/src/controllers/teacher-invitations.ts b/frontend/src/controllers/teacher-invitations.ts index 30201821..a6e2045a 100644 --- a/frontend/src/controllers/teacher-invitations.ts +++ b/frontend/src/controllers/teacher-invitations.ts @@ -1,12 +1,12 @@ -import {BaseController} from "@/controllers/base-controller.ts"; -import type {TeacherInvitationData, TeacherInvitationDTO} from "@dwengo-1/common/interfaces/teacher-invitation"; +import { BaseController } from "@/controllers/base-controller.ts"; +import type { TeacherInvitationData, TeacherInvitationDTO } from "@dwengo-1/common/interfaces/teacher-invitation"; export interface TeacherInvitationsResponse { - invitations: TeacherInvitationDTO[] + invitations: TeacherInvitationDTO[]; } export interface TeacherInvitationResponse { - invitation: TeacherInvitationDTO + invitation: TeacherInvitationDTO; } export class TeacherInvitationController extends BaseController { diff --git a/frontend/src/queries/teacher-invitations.ts b/frontend/src/queries/teacher-invitations.ts index 4d9c5a52..a56ea9cd 100644 --- a/frontend/src/queries/teacher-invitations.ts +++ b/frontend/src/queries/teacher-invitations.ts @@ -1,65 +1,80 @@ -import { - useMutation, - useQuery, - type UseMutationReturnType, - type UseQueryReturnType, -} from "@tanstack/vue-query"; +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 + 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"; +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 +export function useTeacherInvitationsByQuery( + username: MaybeRefOrGetter, ): UseQueryReturnType { return useQuery({ queryFn: computed(async () => controller.getAll(toValue(username), true)), enabled: () => Boolean(toValue(username)), - }) + }); } /** All the pending invitations send to this teacher */ -export function useTeacherInvitationsForQuery(username: MaybeRefOrGetter +export function useTeacherInvitationsForQuery( + username: MaybeRefOrGetter, ): UseQueryReturnType { return useQuery({ queryFn: computed(async () => controller.getAll(toValue(username), false)), enabled: () => Boolean(toValue(username)), - }) + }); } -export function useCreateTeacherInvitationMutation(): UseMutationReturnType{ +export function useCreateTeacherInvitationMutation(): UseMutationReturnType< + TeacherInvitationResponse, + Error, + TeacherDTO, + unknown +> { return useMutation({ - mutationFn: async (data: TeacherInvitationData) => controller.create(data) - }) + mutationFn: async (data: TeacherInvitationData) => controller.create(data), + }); } -export function useAcceptTeacherInvitationMutation(): UseMutationReturnType { +export function useAcceptTeacherInvitationMutation(): UseMutationReturnType< + TeacherInvitationResponse, + Error, + TeacherDTO, + unknown +> { return useMutation({ - mutationFn: async (data: TeacherInvitationData) => controller.respond(data, true) - }) + mutationFn: async (data: TeacherInvitationData) => controller.respond(data, true), + }); } -export function useDeclineTeacherInvitationMutation(): UseMutationReturnType { +export function useDeclineTeacherInvitationMutation(): UseMutationReturnType< + TeacherInvitationResponse, + Error, + TeacherDTO, + unknown +> { return useMutation({ - mutationFn: async (data: TeacherInvitationData) => controller.respond(data, false) - }) + mutationFn: async (data: TeacherInvitationData) => controller.respond(data, false), + }); } -export function useDeleteTeacherInvitationMutation(): UseMutationReturnType { +export function useDeleteTeacherInvitationMutation(): UseMutationReturnType< + TeacherInvitationResponse, + Error, + TeacherDTO, + unknown +> { return useMutation({ - mutationFn: async (data: TeacherInvitationData) => controller.respond(data, false) - }) + mutationFn: async (data: TeacherInvitationData) => controller.respond(data, false), + }); } - - diff --git a/frontend/src/views/classes/TeacherClasses.vue b/frontend/src/views/classes/TeacherClasses.vue index 010cf2e2..a3fba26e 100644 --- a/frontend/src/views/classes/TeacherClasses.vue +++ b/frontend/src/views/classes/TeacherClasses.vue @@ -279,7 +279,8 @@ :key="i.classId" > - {{ i.classId }} + {{ i.classId }} + {{ (i.sender as TeacherDTO).firstName + " " + (i.sender as TeacherDTO).lastName }}