Merge remote-tracking branch 'origin/feat/user-routes' into feat/user-routes

# Conflicts:
#	backend/src/controllers/students.ts
#	backend/src/services/students.ts
This commit is contained in:
Gabriellvl 2025-03-24 15:27:16 +01:00
commit d2cf5b95a9
11 changed files with 37 additions and 40 deletions

View file

@ -6,10 +6,11 @@ import {
getStudent,
getStudentAssignments,
getStudentClasses,
getStudentGroups, getStudentQuestions,
getStudentGroups,
getStudentQuestions,
getStudentSubmissions,
} from '../services/students.js';
import {MISSING_FIELDS_ERROR, MISSING_USERNAME_ERROR, NAME_NOT_FOUND_ERROR} from './users.js';
import { MISSING_FIELDS_ERROR, MISSING_USERNAME_ERROR, NAME_NOT_FOUND_ERROR } from './users.js';
import { StudentDTO } from '../interfaces/student.js';
@ -23,7 +24,7 @@ export async function getAllStudentsHandler(req: Request, res: Response): Promis
return;
}
res.json({students});
res.json({ students });
}
export async function getStudentHandler(req: Request, res: Response): Promise<void> {
@ -153,5 +154,5 @@ export async function getStudentQuestionsHandler(req: Request, res: Response): P
res.json({
questions,
})
});
}

View file

@ -1,17 +1,10 @@
import { Request, Response } from 'express';
import {
createTeacher,
deleteTeacher,
getAllTeachers,
getClassesByTeacher,
getStudentsByTeacher,
getTeacher,
} from '../services/teachers.js';
import { createTeacher, deleteTeacher, getAllTeachers, getClassesByTeacher, getStudentsByTeacher, getTeacher } from '../services/teachers.js';
import { ClassDTO } from '../interfaces/class.js';
import { StudentDTO } from '../interfaces/student.js';
import { QuestionDTO, QuestionId } from '../interfaces/question.js';
import { TeacherDTO } from '../interfaces/teacher.js';
import {MISSING_FIELDS_ERROR, MISSING_USERNAME_ERROR, NAME_NOT_FOUND_ERROR} from "./users";
import { MISSING_FIELDS_ERROR, MISSING_USERNAME_ERROR, NAME_NOT_FOUND_ERROR } from './users';
export async function getAllTeachersHandler(req: Request, res: Response): Promise<void> {
const full = req.query.full === 'true';
@ -23,7 +16,7 @@ export async function getAllTeachersHandler(req: Request, res: Response): Promis
return;
}
res.json({teachers});
res.json({ teachers });
}
export async function getTeacherHandler(req: Request, res: Response): Promise<void> {
@ -98,7 +91,7 @@ export async function getTeacherStudentHandler(req: Request, res: Response): Pro
const students: StudentDTO[] | string[] = await getStudentsByTeacher(username, full);
res.json({students});
res.json({ students });
}
export async function getTeacherQuestionHandler(req: Request, res: Response): Promise<void> {
@ -112,5 +105,5 @@ export async function getTeacherQuestionHandler(req: Request, res: Response): Pr
const questions: QuestionDTO[] | QuestionId[] = await getQuestionsByTeacher(username, full);
res.json({questions});
res.json({ questions });
}

View file

@ -1,7 +1,7 @@
export const MISSING_USERNAME_ERROR = { error: 'Missing required field: username' };
export function NAME_NOT_FOUND_ERROR(username: string){
return {error: `User with username '${username}' not found.`};
export function NAME_NOT_FOUND_ERROR(username: string) {
return { error: `User with username '${username}' not found.` };
}
export const MISSING_FIELDS_ERROR = { error: 'Missing required fields: username, firstName, lastName'}
export const MISSING_FIELDS_ERROR = { error: 'Missing required fields: username, firstName, lastName' };

View file

@ -58,8 +58,7 @@ export class QuestionRepository extends DwengoEntityRepository<Question> {
public findAllByAuthor(author: Student): Promise<Question[]> {
return this.findAll({
where: { author },
orderBy: { timestamp: 'DESC' }, // new to old
orderBy: { timestamp: 'DESC' }, // New to old
});
}
}

View file

@ -6,7 +6,8 @@ import {
getStudentAssignmentsHandler,
getStudentClassesHandler,
getStudentGroupsHandler,
getStudentHandler, getStudentQuestionsHandler,
getStudentHandler,
getStudentQuestionsHandler,
getStudentSubmissionsHandler,
} from '../controllers/students.js';
import { getStudentGroups } from '../services/students.js';

View file

@ -3,7 +3,7 @@ import {
getGroupRepository,
getQuestionRepository,
getStudentRepository,
getSubmissionRepository
getSubmissionRepository,
} from '../data/repositories.js';
import { AssignmentDTO } from '../interfaces/assignment.js';
import { ClassDTO, mapToClassDTO } from '../interfaces/class.js';
@ -11,7 +11,7 @@ import { GroupDTO, mapToGroupDTO, mapToGroupDTOId } from '../interfaces/group.js
import { mapToStudent, mapToStudentDTO, StudentDTO } from '../interfaces/student.js';
import { mapToSubmissionDTO, SubmissionDTO } from '../interfaces/submission.js';
import { getAllAssignments } from './assignments.js';
import {mapToQuestionDTO, mapToQuestionId, QuestionDTO, QuestionId} from "../interfaces/question";
import { mapToQuestionDTO, mapToQuestionId, QuestionDTO, QuestionId } from '../interfaces/question';
export async function getAllStudents(full: boolean): Promise<StudentDTO[] | string[]> {
const studentRepository = getStudentRepository();

View file

@ -14,8 +14,9 @@ export async function getAllTeachers(full: boolean): Promise<TeacherDTO[]> {
const teacherRepository = getTeacherRepository();
const users = await teacherRepository.findAll();
if (full)
if (full) {
return users.map(mapToTeacherDTO);
}
return users.map((user) => user.username);
}
@ -73,17 +74,19 @@ async function fetchClassesByTeacher(username: string): Promise<ClassDTO[]> {
export async function getClassesByTeacher(username: string, full: boolean): Promise<ClassDTO[] | string[]> {
const classes = await fetchClassesByTeacher(username);
if (full)
if (full) {
return classes;
}
return classes.map((cls) => cls.id);
}
export async function getStudentsByTeacher(username: string, full: boolean) {
const classes = await getClassesByTeacher(username, false);
const students = (await Promise.all(classes.map(async (id) => getClassStudents(id)))).flat();
if (full)
return students
const students = (await Promise.all(classes.map(async (id) => getClassStudents(id)))).flat();
if (full) {
return students;
}
return students.map((student) => student.username);
}
@ -102,9 +105,9 @@ export async function getTeacherQuestions(username: string, full: boolean): Prom
const questionRepository = getQuestionRepository();
const questions = await questionRepository.findAllByLearningObjects(learningObjects);
if (full)
if (full) {
return questions.map(mapToQuestionDTO);
}
return questions.map(mapToQuestionId);
}

View file

@ -1,4 +1,4 @@
import {API_BASE} from "../../config.ts";
import { API_BASE } from "../../config.ts";
export class BaseController {
protected baseUrl: string;
@ -12,7 +12,9 @@ export class BaseController {
if (queryParams) {
const query = new URLSearchParams();
Object.entries(queryParams).forEach(([key, value]) => {
if (value !== undefined && value !== null) query.append(key, value.toString());
if (value !== undefined && value !== null) {
query.append(key, value.toString());
}
});
url += `?${query.toString()}`;
}
@ -68,5 +70,4 @@ export class BaseController {
return res.json();
}
}

View file

@ -1,5 +1,5 @@
import {StudentController} from "@/controllers/student-controller.ts";
import {TeacherController} from "@/controllers/teacher-controller.ts";
import { StudentController } from "@/controllers/student-controller.ts";
import { TeacherController } from "@/controllers/teacher-controller.ts";
export function controllerGetter<T>(Factory: new () => T): () => T {
let instance: T | undefined;

View file

@ -1,4 +1,4 @@
import {BaseController} from "@/controllers/base-controller.ts";
import { BaseController } from "@/controllers/base-controller.ts";
export class StudentController extends BaseController {
constructor() {
@ -40,5 +40,4 @@ export class StudentController extends BaseController {
getQuestions(username: string, full = true) {
return this.get<{ questions: any[] }>(`/${username}/questions`, { full });
}
}

View file

@ -1,4 +1,4 @@
import {BaseController} from "@/controllers/base-controller.ts";
import { BaseController } from "@/controllers/base-controller.ts";
export class TeacherController extends BaseController {
constructor() {
@ -33,5 +33,5 @@ export class TeacherController extends BaseController {
return this.get<{ questions: any[] }>(`/${username}/questions`, { full });
}
// getInvitations(id: string) {return this.get<{ invitations: string[] }>(`/${id}/invitations`);}
// GetInvitations(id: string) {return this.get<{ invitations: string[] }>(`/${id}/invitations`);}
}