feat: (broken) POST method voor groep

This commit is contained in:
Adriaan Jacquet 2025-03-13 15:49:13 +01:00
parent 6ad0e990c7
commit 4c76a82178
6 changed files with 81 additions and 7 deletions

View file

@ -1,5 +1,6 @@
import { Request, Response } from 'express'; import { Request, Response } from 'express';
import { getAllGroups, getGroup, getGroupSubmissions } from '../services/groups.js'; import { createGroup, getAllGroups, getGroup, getGroupSubmissions } from '../services/groups.js';
import { GroupDTO } from '../interfaces/group.js';
// Typescript is annoywith with parameter forwarding from class.ts // Typescript is annoywith with parameter forwarding from class.ts
interface GroupParams { interface GroupParams {
@ -54,6 +55,29 @@ export async function getAllGroupsHandler(
}); });
} }
export async function createGroupHandler(
req: Request,
res: Response,
): Promise<void> {
const classid = req.params.classid;
const assignmentId = +req.params.assignmentid;
if (isNaN(assignmentId)) {
res.status(400).json({ error: 'Assignment id must be a number' });
return;
}
const groupData = req.body as GroupDTO;
const group = createGroup(groupData, classid, assignmentId);
if (!group) {
res.status(500).json({ error: "Something went wrong while creating group" });
return
}
res.status(201).json({ group: group });
}
export async function getGroupSubmissionsHandler( export async function getGroupSubmissionsHandler(
req: Request, req: Request,
res: Response, res: Response,

View file

@ -17,8 +17,8 @@ export class Group {
}) })
assignment!: Assignment; assignment!: Assignment;
@PrimaryKey({ type: 'integer' }) @PrimaryKey({ type: 'integer', autoincrement: true })
groupNumber!: number; groupNumber?: number;
@ManyToMany({ @ManyToMany({
entity: () => { entity: () => {

View file

@ -11,7 +11,7 @@ export interface GroupDTO {
export function mapToGroupDTO(group: Group): GroupDTO { export function mapToGroupDTO(group: Group): GroupDTO {
return { return {
assignment: mapToAssignmentDTO(group.assignment), // ERROR: , group.assignment.within), assignment: mapToAssignmentDTO(group.assignment), // ERROR: , group.assignment.within),
groupNumber: group.groupNumber, groupNumber: group.groupNumber!,
members: group.members.map(mapToStudentDTO), members: group.members.map(mapToStudentDTO),
}; };
} }
@ -19,7 +19,7 @@ export function mapToGroupDTO(group: Group): GroupDTO {
export function mapToGroupDTOId(group: Group): GroupDTO { export function mapToGroupDTOId(group: Group): GroupDTO {
return { return {
assignment: group.assignment.id!, assignment: group.assignment.id!,
groupNumber: group.groupNumber, groupNumber: group.groupNumber!,
members: group.members.map((member) => { members: group.members.map((member) => {
return member.username; return member.username;
}), }),

View file

@ -24,6 +24,6 @@ export function mapToTeacherInvitationDTOIds(
return { return {
sender: invitation.sender.username, sender: invitation.sender.username,
receiver: invitation.receiver.username, receiver: invitation.receiver.username,
class: invitation.class.classId, class: invitation.class.classId!,
}; };
} }

View file

@ -1,11 +1,13 @@
import express from 'express'; import express from 'express';
import { getAllGroupsHandler, getGroupHandler, getGroupSubmissionsHandler } from '../controllers/groups.js'; import { createGroupHandler, getAllGroupsHandler, getGroupHandler, getGroupSubmissionsHandler } from '../controllers/groups.js';
const router = express.Router({ mergeParams: true }); const router = express.Router({ mergeParams: true });
// Root endpoint used to search objects // Root endpoint used to search objects
router.get('/', getAllGroupsHandler); router.get('/', getAllGroupsHandler);
router.post('/', createGroupHandler);
// Information about a group (members, ... [TODO DOC]) // Information about a group (members, ... [TODO DOC])
router.get('/:groupid', getGroupHandler); router.get('/:groupid', getGroupHandler);

View file

@ -1,9 +1,12 @@
import { GroupRepository } from '../data/assignments/group-repository.js';
import { import {
getAssignmentRepository, getAssignmentRepository,
getClassRepository, getClassRepository,
getGroupRepository, getGroupRepository,
getStudentRepository,
getSubmissionRepository, getSubmissionRepository,
} from '../data/repositories.js'; } from '../data/repositories.js';
import { Group } from '../entities/assignments/group.entity.js';
import { import {
GroupDTO, GroupDTO,
mapToGroupDTO, mapToGroupDTO,
@ -51,6 +54,51 @@ export async function getGroup(
return mapToGroupDTOId(group); return mapToGroupDTOId(group);
} }
export async function createGroup(
groupData: GroupDTO,
classid: string,
assignmentNumber: number,
): Promise<Group | null> {
const studentRepository = getStudentRepository();
const memberUsernames = groupData.members as string[] || []; // TODO check if groupdata.members is a list
const members = (await Promise.all([...memberUsernames].map(id => studentRepository.findByUsername(id))))
.filter(student => student != null);
console.log(members);
const classRepository = getClassRepository();
const cls = await classRepository.findById(classid);
if (!cls) {
return null;
}
const assignmentRepository = getAssignmentRepository();
const assignment = await assignmentRepository.findByClassAndId(cls, assignmentNumber);
if (!assignment) {
return null;
}
const groupRepository = getGroupRepository();
try {
console.log('EEEEE');
const newGroup = groupRepository.create({
assignment: assignment,
members: members,
});
console.log('OOOOOO');
await groupRepository.save(newGroup);
console.log('AAAAAA');
return newGroup;
} catch(e) {
console.log(e);
return null;
}
}
export async function getAllGroups( export async function getAllGroups(
classId: string, classId: string,
assignmentNumber: number, assignmentNumber: number,