diff --git a/backend/src/controllers/teachers.ts b/backend/src/controllers/teachers.ts index c8063f80..1ac4888e 100644 --- a/backend/src/controllers/teachers.ts +++ b/backend/src/controllers/teachers.ts @@ -7,6 +7,7 @@ import { getJoinRequestsByClass, getStudentsByTeacher, getTeacher, + getTeacherAssignments, getTeacherQuestions, updateClassJoinRequestStatus, } from '../services/teachers.js'; @@ -60,6 +61,16 @@ export async function getTeacherClassHandler(req: Request, res: Response): Promi res.json({ classes }); } +export async function getTeacherAssignmentsHandler(req: Request, res: Response): Promise { + const username = req.params.username; + const full = req.query.full === 'true'; + requireFields({ username }); + + const assignments = await getTeacherAssignments(username, full); + + res.json({ assignments }); +} + export async function getTeacherStudentHandler(req: Request, res: Response): Promise { const username = req.params.username; const full = req.query.full === 'true'; diff --git a/backend/src/routes/teachers.ts b/backend/src/routes/teachers.ts index 44d3064b..6ff5fd9c 100644 --- a/backend/src/routes/teachers.ts +++ b/backend/src/routes/teachers.ts @@ -4,6 +4,7 @@ import { deleteTeacherHandler, getAllTeachersHandler, getStudentJoinRequestHandler, + getTeacherAssignmentsHandler, getTeacherClassHandler, getTeacherHandler, getTeacherQuestionHandler, @@ -25,6 +26,8 @@ router.delete('/:username', deleteTeacherHandler); router.get('/:username/classes', getTeacherClassHandler); +router.get(`/:username/assignments`, getTeacherAssignmentsHandler); + router.get('/:username/students', getTeacherStudentHandler); router.get('/:username/questions', getTeacherQuestionHandler); diff --git a/backend/src/services/teachers.ts b/backend/src/services/teachers.ts index 4fdb15be..9e617a4d 100644 --- a/backend/src/services/teachers.ts +++ b/backend/src/services/teachers.ts @@ -1,4 +1,5 @@ import { + getAssignmentRepository, getClassJoinRequestRepository, getClassRepository, getLearningObjectRepository, @@ -30,6 +31,8 @@ import { QuestionDTO, QuestionId } from '@dwengo-1/common/interfaces/question'; import { ClassJoinRequestDTO } from '@dwengo-1/common/interfaces/class-join-request'; import { ClassStatus } from '@dwengo-1/common/util/class-join-request'; import { ConflictException } from '../exceptions/conflict-exception.js'; +import { AssignmentDTO, AssignmentDTOId } from '@dwengo-1/common/interfaces/assignment'; +import { mapToAssignmentDTO, mapToAssignmentDTOId } from '../interfaces/assignment.js'; export async function getAllTeachers(full: boolean): Promise { const teacherRepository: TeacherRepository = getTeacherRepository(); @@ -101,6 +104,17 @@ export async function getClassesByTeacher(username: string, full: boolean): Prom return classes.map((cls) => cls.id); } +export async function getTeacherAssignments(username: string, full: boolean): Promise { + const assignmentRepository = getAssignmentRepository(); + const assignments = await assignmentRepository.findAllByResponsibleTeacher(username); + + if (full) { + return assignments.map(mapToAssignmentDTO); + } + + return assignments.map(mapToAssignmentDTOId); +} + export async function getStudentsByTeacher(username: string, full: boolean): Promise { const classes: ClassDTO[] = await fetchClassesByTeacher(username); diff --git a/frontend/src/controllers/teachers.ts b/frontend/src/controllers/teachers.ts index a97cf11f..76fe0162 100644 --- a/frontend/src/controllers/teachers.ts +++ b/frontend/src/controllers/teachers.ts @@ -3,6 +3,7 @@ import type { JoinRequestResponse, JoinRequestsResponse, StudentsResponse } from import type { QuestionsResponse } from "@/controllers/questions.ts"; import type { ClassesResponse } from "@/controllers/classes.ts"; import type { TeacherDTO } from "@dwengo-1/common/interfaces/teacher"; +import type { AssignmentsResponse } from "./assignments"; export interface TeachersResponse { teachers: TeacherDTO[] | string[]; @@ -36,6 +37,10 @@ export class TeacherController extends BaseController { return this.get(`/${username}/classes`, { full }); } + async getAssignments(username: string, full = true): Promise { + return this.get(`/${username}/assignments`, { full }); + } + async getStudents(username: string, full = false): Promise { return this.get(`/${username}/students`, { full }); } diff --git a/frontend/src/queries/teachers.ts b/frontend/src/queries/teachers.ts index 59da84f4..ab799118 100644 --- a/frontend/src/queries/teachers.ts +++ b/frontend/src/queries/teachers.ts @@ -13,6 +13,7 @@ import type { JoinRequestResponse, JoinRequestsResponse, StudentsResponse } from import type { QuestionsResponse } from "@/controllers/questions.ts"; import type { TeacherDTO } from "@dwengo-1/common/interfaces/teacher"; import { studentJoinRequestQueryKey, studentJoinRequestsQueryKey } from "@/queries/students.ts"; +import type { AssignmentResponse, AssignmentsResponse } from "@/controllers/assignments"; const teacherController = new TeacherController(); @@ -29,6 +30,10 @@ function teacherClassesQueryKey(username: string, full: boolean): [string, strin return ["teacher-classes", username, full]; } +function teacherAssignmentsQueryKey(username: string, full: boolean): [string, string, boolean] { + return ["teacher-assignments", username, full]; +} + function teacherStudentsQueryKey(username: string, full: boolean): [string, string, boolean] { return ["teacher-students", username, full]; } @@ -69,6 +74,17 @@ export function useTeacherClassesQuery( }); } +export function useTeacherAssignmentsQuery( + username: MaybeRefOrGetter, + full: MaybeRefOrGetter = false, +): UseQueryReturnType { + return useQuery({ + queryKey: computed(() => teacherAssignmentsQueryKey(toValue(username)!, toValue(full))), + queryFn: async () => teacherController.getAssignments(toValue(username)!, toValue(full)), + enabled: () => Boolean(toValue(username)), + }); +} + export function useTeacherStudentsQuery( username: MaybeRefOrGetter, full: MaybeRefOrGetter = false,