fix: Merge dev into feat/assignment-page

This commit is contained in:
Joyelle Ndagijimana 2025-04-23 09:28:34 +02:00
commit bb3a242bf9
20 changed files with 207 additions and 37 deletions

View file

@ -3,8 +3,6 @@ import { createGroup, deleteGroup, getAllGroups, getGroup, getGroupSubmissions,
import { GroupDTO } from '@dwengo-1/common/interfaces/group';
import { requireFields } from './error-helper.js';
import { BadRequestException } from '../exceptions/bad-request-exception.js';
import { EntityDTO } from '@mikro-orm/core';
import { Group } from '../entities/assignments/group.entity.js';
function checkGroupFields(classId: string, assignmentId: number, groupId: number): void {
requireFields({ classId, assignmentId, groupId });
@ -35,7 +33,11 @@ export async function putGroupHandler(req: Request, res: Response): Promise<void
const groupId = parseInt(req.params.groupid);
checkGroupFields(classId, assignmentId, groupId);
const group = await putGroup(classId, assignmentId, groupId, req.body as Partial<EntityDTO<Group>>);
// Only members field can be changed
const members = req.body.members;
requireFields({ members });
const group = await putGroup(classId, assignmentId, groupId, { members } as Partial<GroupDTO>);
res.json({ group });
}

View file

@ -26,13 +26,15 @@ function initializeLogger(): Logger {
const consoleTransport = new transports.Console({
level: getEnvVar(envVars.LogLevel),
format: format.combine(format.cli(), format.colorize()),
format: format.combine(format.cli(), format.simple()),
});
if (getEnvVar(envVars.RunMode) === 'dev') {
return createLogger({
logger = createLogger({
transports: [consoleTransport],
});
logger.debug(`Logger initialized with level ${logLevel} to console`);
return logger;
}
const lokiHost = getEnvVar(envVars.LokiHost);

View file

@ -11,7 +11,7 @@ export class MikroOrmLogger extends DefaultLogger {
};
let message: string;
if (context?.label) {
if (context !== undefined && context.labels !== undefined) {
message = `[${namespace}] (${context.label}) ${messageArg}`;
} else {
message = `[${namespace}] ${messageArg}`;

View file

@ -7,8 +7,17 @@ import { GroupDTO, GroupDTOId } from '@dwengo-1/common/interfaces/group';
import { SubmissionDTO, SubmissionDTOId } from '@dwengo-1/common/interfaces/submission';
import { fetchAssignment } from './assignments.js';
import { NotFoundException } from '../exceptions/not-found-exception.js';
import { putObject } from './service-helper.js';
import { fetchStudents } from './students.js';
import { fetchClass } from './classes.js';
import { BadRequestException } from '../exceptions/bad-request-exception.js';
import { Student } from '../entities/users/student.entity.js';
import { Class } from '../entities/classes/class.entity.js';
async function assertMembersInClass(members: Student[], cls: Class): Promise<void> {
if (!members.every((student) => cls.students.contains(student))) {
throw new BadRequestException('Student does not belong to class');
}
}
export async function fetchGroup(classId: string, assignmentNumber: number, groupNumber: number): Promise<Group> {
const assignment = await fetchAssignment(classId, assignmentNumber);
@ -28,15 +37,18 @@ export async function getGroup(classId: string, assignmentNumber: number, groupN
return mapToGroupDTO(group, group.assignment.within);
}
export async function putGroup(
classId: string,
assignmentNumber: number,
groupNumber: number,
groupData: Partial<EntityDTO<Group>>
): Promise<GroupDTO> {
export async function putGroup(classId: string, assignmentNumber: number, groupNumber: number, groupData: Partial<GroupDTO>): Promise<GroupDTO> {
const group = await fetchGroup(classId, assignmentNumber, groupNumber);
await putObject<Group>(group, groupData, getGroupRepository());
const memberUsernames = groupData.members as string[];
const members = await fetchStudents(memberUsernames);
const cls = await fetchClass(classId);
await assertMembersInClass(members, cls);
const groupRepository = getGroupRepository();
groupRepository.assign(group, { members } as Partial<EntityDTO<Group>>);
await groupRepository.getEntityManager().persistAndFlush(group);
return mapToGroupDTO(group, group.assignment.within);
}
@ -63,6 +75,9 @@ export async function createGroup(groupData: GroupDTO, classid: string, assignme
const memberUsernames = (groupData.members as string[]) || [];
const members = await fetchStudents(memberUsernames);
const cls = await fetchClass(classid);
await assertMembersInClass(members, cls);
const assignment = await fetchAssignment(classid, assignmentNumber);
const groupRepository = getGroupRepository();