Merge branch 'feat/service-layer' into feat/service-layer-adriaan
# Conflicts: # backend/src/controllers/classes.ts # backend/src/controllers/students.ts # backend/src/data/users/teacher-repository.ts # backend/src/interfaces/assignment.ts # backend/src/interfaces/teacher.ts # backend/src/routes/classes.ts # backend/src/services/assignments.ts # backend/src/services/class.ts # backend/src/services/students.ts # backend/src/util/translation-helper.ts
This commit is contained in:
commit
6c4ea0eefb
33 changed files with 454 additions and 137 deletions
|
@ -1,5 +1,6 @@
|
|||
import { Request, Response } from 'express';
|
||||
import { getAllClasses, getClass, getClassStudents, getClassTeacherInvitations } from '../services/class.js';
|
||||
import { getAllClasses, getClass, getClassStudents, getClassStudentsIds, getClassTeacherInvitations } from '../services/class.js';
|
||||
import { ClassDTO } from '../interfaces/classes.js';
|
||||
|
||||
export async function getAllClassesHandler(
|
||||
req: Request,
|
||||
|
@ -47,7 +48,9 @@ export async function getClassStudentsHandler(
|
|||
const classId = req.params.id;
|
||||
const full = req.query.full === "true";
|
||||
|
||||
const students = await getClassStudents(classId, full);
|
||||
let students = full
|
||||
? await getClassStudents(classId)
|
||||
: await getClassStudentsIds(classId);
|
||||
|
||||
res.json({
|
||||
students: students,
|
||||
|
|
|
@ -3,9 +3,9 @@ import {
|
|||
getLearningObjectById,
|
||||
getLearningObjectIdsFromPath,
|
||||
getLearningObjectsFromPath,
|
||||
} from '../services/learningObjects.js';
|
||||
} from '../services/learning-objects.js';
|
||||
import { FALLBACK_LANG } from '../config.js';
|
||||
import { FilteredLearningObject } from '../interfaces/learningPath';
|
||||
import { FilteredLearningObject } from '../interfaces/learning-path';
|
||||
|
||||
export async function getAllLearningObjects(
|
||||
req: Request,
|
|
@ -4,7 +4,7 @@ import { FALLBACK_LANG } from '../config.js';
|
|||
import {
|
||||
fetchLearningPaths,
|
||||
searchLearningPaths,
|
||||
} from '../services/learningPaths.js';
|
||||
} from '../services/learning-paths.js';
|
||||
/**
|
||||
* Fetch learning paths based on query parameters.
|
||||
*/
|
155
backend/src/controllers/teachers.ts
Normal file
155
backend/src/controllers/teachers.ts
Normal file
|
@ -0,0 +1,155 @@
|
|||
import { Request, Response } from 'express';
|
||||
import {
|
||||
createTeacher,
|
||||
deleteTeacher,
|
||||
getTeacherByUsername,
|
||||
getClassesByTeacher,
|
||||
getClassIdsByTeacher,
|
||||
getAllTeachers,
|
||||
getAllTeachersIds, getStudentsByTeacher, getStudentIdsByTeacher, getQuestionsByTeacher, getQuestionIdsByTeacher
|
||||
} from '../services/teachers.js';
|
||||
import {TeacherDTO} from "../interfaces/teacher";
|
||||
import {ClassDTO} from "../interfaces/class";
|
||||
import {StudentDTO} from "../interfaces/student";
|
||||
import {QuestionDTO, QuestionId} from "../interfaces/question";
|
||||
|
||||
export async function getTeacherHandler(req: Request, res: Response): Promise<void> {
|
||||
try {
|
||||
const full = req.query.full === 'true';
|
||||
const username = req.query.username as string;
|
||||
|
||||
if (username){
|
||||
const teacher = await getTeacherByUsername(username);
|
||||
if (!teacher){
|
||||
res.status(404).json({ error: `Teacher with username '${username}' not found.` });
|
||||
return;
|
||||
}
|
||||
res.json(teacher);
|
||||
return;
|
||||
}
|
||||
|
||||
let teachers: TeacherDTO[] | string[];
|
||||
|
||||
if (full) teachers = await getAllTeachers();
|
||||
else teachers = await getAllTeachersIds();
|
||||
|
||||
res.json(teachers);
|
||||
} catch (error) {
|
||||
console.error("❌ Error fetching teachers:", error);
|
||||
res.status(500).json({ error: "Internal server error" });
|
||||
}
|
||||
}
|
||||
|
||||
export async function createTeacherHandler(
|
||||
req: Request,
|
||||
res: Response
|
||||
): Promise<void> {
|
||||
try {
|
||||
const teacherData = req.body as TeacherDTO;
|
||||
|
||||
if (!teacherData.username || !teacherData.firstName || !teacherData.lastName) {
|
||||
res.status(400).json({ error: 'Missing required fields: username, firstName, lastName' });
|
||||
return;
|
||||
}
|
||||
|
||||
const newTeacher = await createTeacher(teacherData);
|
||||
res.status(201).json(newTeacher);
|
||||
} catch (error) {
|
||||
console.error('Error creating teacher:', error);
|
||||
res.status(500).json({ error: 'Internal server error' });
|
||||
}
|
||||
}
|
||||
|
||||
export async function deleteTeacherHandler(
|
||||
req: Request,
|
||||
res: Response
|
||||
): Promise<void> {
|
||||
try {
|
||||
const username = req.params.username as string;
|
||||
|
||||
if (!username) {
|
||||
res.status(400).json({ error: 'Missing required field: username' });
|
||||
return;
|
||||
}
|
||||
|
||||
const deletedTeacher = await deleteTeacher(username);
|
||||
|
||||
if (!deletedTeacher) {
|
||||
res.status(400).json({ error: `Did not find teacher with username ${username}` });
|
||||
return;
|
||||
}
|
||||
|
||||
res.status(201).json(deletedTeacher);
|
||||
} catch (error) {
|
||||
console.error('Error deleting teacher:', error);
|
||||
res.status(500).json({ error: 'Internal server error' });
|
||||
}
|
||||
}
|
||||
|
||||
export async function getTeacherClassHandler(req: Request, res: Response): Promise<void> {
|
||||
try {
|
||||
const username = req.params.username as string;
|
||||
const full = req.query.full === 'true';
|
||||
|
||||
if (!username) {
|
||||
res.status(400).json({ error: 'Missing required field: username' });
|
||||
return;
|
||||
}
|
||||
|
||||
let classes: ClassDTO[] | string[];
|
||||
|
||||
if (full) classes = await getClassesByTeacher(username);
|
||||
else classes = await getClassIdsByTeacher(username);
|
||||
|
||||
res.status(201).json(classes);
|
||||
} catch (error) {
|
||||
console.error('Error fetching classes by teacher:', error);
|
||||
res.status(500).json({ error: 'Internal server error' });
|
||||
}
|
||||
}
|
||||
|
||||
export async function getTeacherStudentHandler(req: Request, res: Response): Promise<void> {
|
||||
try {
|
||||
const username = req.params.username as string;
|
||||
const full = req.query.full === 'true';
|
||||
|
||||
if (!username) {
|
||||
res.status(400).json({ error: 'Missing required field: username' });
|
||||
return;
|
||||
}
|
||||
|
||||
let students: StudentDTO[] | string[];
|
||||
|
||||
if (full) students = await getStudentsByTeacher(username);
|
||||
else students = await getStudentIdsByTeacher(username);
|
||||
|
||||
res.status(201).json(students);
|
||||
} catch (error) {
|
||||
console.error('Error fetching students by teacher:', error);
|
||||
res.status(500).json({ error: 'Internal server error' });
|
||||
}
|
||||
}
|
||||
|
||||
export async function getTeacherQuestionHandler(req: Request, res: Response): Promise<void> {
|
||||
try {
|
||||
const username = req.params.username as string;
|
||||
const full = req.query.full === 'true';
|
||||
|
||||
if (!username) {
|
||||
res.status(400).json({ error: 'Missing required field: username' });
|
||||
return;
|
||||
}
|
||||
|
||||
let questions: QuestionDTO[] | QuestionId[];
|
||||
|
||||
if (full) questions = await getQuestionsByTeacher(username);
|
||||
else questions = await getQuestionIdsByTeacher(username);
|
||||
|
||||
res.status(201).json(questions);
|
||||
} catch (error) {
|
||||
console.error('Error fetching questions by teacher:', error);
|
||||
res.status(500).json({ error: 'Internal server error' });
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
import { Request, Response } from 'express';
|
||||
import { themes } from '../data/themes.js';
|
||||
import { loadTranslations } from "../util/translationHelper.js";
|
||||
import { loadTranslations } from "../util/translation-helper.js";
|
||||
import { FALLBACK_LANG } from '../config.js';
|
||||
|
||||
interface Translations {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue