feat: group verbinding tussen databank en api aangemaakt
This commit is contained in:
parent
baf43e91de
commit
3f62ab70e1
6 changed files with 104 additions and 24 deletions
34
backend/src/controllers/groups.ts
Normal file
34
backend/src/controllers/groups.ts
Normal file
|
@ -0,0 +1,34 @@
|
|||
import { Request, Response } from 'express';
|
||||
import { getGroup } from '../services/groups';
|
||||
|
||||
// typescript is annoywith with parameter forwarding from class.ts
|
||||
interface GroupParams {
|
||||
classid: string;
|
||||
assignmentid: string;
|
||||
groupid: string;
|
||||
}
|
||||
|
||||
export async function getGroupHandler(
|
||||
req: Request<GroupParams>,
|
||||
res: Response,
|
||||
): Promise<void> {
|
||||
const classId = req.params.classid;
|
||||
const full = req.query.full === "true";
|
||||
const assignmentId = +req.params.assignmentid;
|
||||
|
||||
if (isNaN(assignmentId)) {
|
||||
res.status(400).json({ error: "Assignment id must be a number" });
|
||||
return;
|
||||
}
|
||||
|
||||
const groupId = +req.params.groupid;
|
||||
|
||||
if (isNaN(groupId)) {
|
||||
res.status(400).json({ error: "Group id must be a number" });
|
||||
return;
|
||||
}
|
||||
|
||||
const group = await getGroup(classId, assignmentId, groupId, full);
|
||||
|
||||
res.json(group);
|
||||
}
|
|
@ -7,10 +7,13 @@ export class GroupRepository extends DwengoEntityRepository<Group> {
|
|||
assignment: Assignment,
|
||||
groupNumber: number
|
||||
): Promise<Group | null> {
|
||||
return this.findOne({
|
||||
return this.findOne(
|
||||
{
|
||||
assignment: assignment,
|
||||
groupNumber: groupNumber,
|
||||
});
|
||||
},
|
||||
{ populate: ["members"] },
|
||||
);
|
||||
}
|
||||
public findAllGroupsForAssignment(
|
||||
assignment: Assignment
|
||||
|
|
|
@ -1,3 +1,25 @@
|
|||
import { Group } from "../entities/assignments/group.entity";
|
||||
import { AssignmentDTO, mapToAssignmentDTO } from "./assignments";
|
||||
import { mapToStudentDTO, StudentDTO } from "./students";
|
||||
|
||||
export interface GroupDTO {
|
||||
assignment: number | AssignmentDTO,
|
||||
groupNumber: number,
|
||||
members: string[] | StudentDTO[],
|
||||
};
|
||||
|
||||
export function mapToGroupDTO(group: Group): GroupDTO {
|
||||
return {
|
||||
assignment: mapToAssignmentDTO(group.assignment, group.assignment.within),
|
||||
groupNumber: group.groupNumber,
|
||||
members: group.members.map(mapToStudentDTO),
|
||||
}
|
||||
}
|
||||
|
||||
export function mapToGroupDTOId(group: Group): GroupDTO {
|
||||
return {
|
||||
assignment: group.assignment.id,
|
||||
groupNumber: group.groupNumber,
|
||||
members: group.members.map(member => member.username),
|
||||
}
|
||||
}
|
|
@ -1,9 +1,9 @@
|
|||
import express from 'express'
|
||||
import { getAssignmentHandler } from '../controllers/assignments';
|
||||
import groupRouter from './group.js';
|
||||
|
||||
const router = express.Router({ mergeParams: true });
|
||||
|
||||
|
||||
|
||||
// root endpoint used to search objects
|
||||
router.get('/', (req, res) => {
|
||||
res.json({
|
||||
|
@ -25,14 +25,6 @@ router.get('/:id/submissions', (req, res) => {
|
|||
});
|
||||
});
|
||||
|
||||
router.get('/:id/groups', (req, res) => {
|
||||
res.json({
|
||||
groups: [
|
||||
'0'
|
||||
],
|
||||
});
|
||||
});
|
||||
|
||||
router.get('/:id/questions', (req, res) => {
|
||||
res.json({
|
||||
questions: [
|
||||
|
@ -41,4 +33,6 @@ router.get('/:id/questions', (req, res) => {
|
|||
});
|
||||
});
|
||||
|
||||
router.use('/:assignmentid/groups', groupRouter);
|
||||
|
||||
export default router
|
|
@ -1,5 +1,6 @@
|
|||
import express from 'express'
|
||||
const router = express.Router();
|
||||
import { getGroupHandler } from '../controllers/groups';
|
||||
const router = express.Router({ mergeParams: true });
|
||||
|
||||
// root endpoint used to search objects
|
||||
router.get('/', (req, res) => {
|
||||
|
@ -12,17 +13,7 @@ router.get('/', (req, res) => {
|
|||
});
|
||||
|
||||
// information about a group (members, ... [TODO DOC])
|
||||
router.get('/:id', (req, res) => {
|
||||
res.json({
|
||||
id: req.params.id,
|
||||
assignment: '0',
|
||||
students: [ '0' ],
|
||||
submissions: [ '0' ],
|
||||
// reference to other endpoint
|
||||
// should be less hardcoded
|
||||
questions: `/group/${req.params.id}/question`,
|
||||
});
|
||||
})
|
||||
router.get('/:groupid', getGroupHandler);
|
||||
|
||||
// the list of questions a group has made
|
||||
router.get('/:id/question', (req, res) => {
|
||||
|
|
36
backend/src/services/groups.ts
Normal file
36
backend/src/services/groups.ts
Normal file
|
@ -0,0 +1,36 @@
|
|||
import { getAssignmentRepository, getClassRepository, getGroupRepository } from "../data/repositories";
|
||||
import { GroupDTO, mapToGroupDTO, mapToGroupDTOId } from "../interfaces/groups";
|
||||
|
||||
export async function getGroup(
|
||||
classId: string,
|
||||
assignmentNumber: number,
|
||||
groupNumber: number,
|
||||
full: boolean,
|
||||
): Promise<GroupDTO | null> {
|
||||
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();
|
||||
const group = await groupRepository.findByAssignmentAndGroupNumber(assignment, groupNumber);
|
||||
|
||||
if (!group) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (full) {
|
||||
return mapToGroupDTO(group);
|
||||
}
|
||||
|
||||
return mapToGroupDTOId(group);
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue