feat: submission route post delete

This commit is contained in:
Gabriellvl 2025-03-13 16:45:59 +01:00
parent 911e17771f
commit d9eb8def72
6 changed files with 100 additions and 17 deletions

View file

@ -1,28 +1,29 @@
import { Request, Response } from "express"; import { Request, Response } from "express";
import { getSubmission } from "../services/submissions.js"; import {createSubmission, deleteSubmission, getSubmission} from "../services/submissions.js";
import { Language, languageMap } from "../entities/content/language.js"; import { Language, languageMap } from "../entities/content/language.js";
import {SubmissionDTO} from "../interfaces/submission";
interface SubmissionParams { interface SubmissionParams {
lohruid: string, hruid: string,
submissionNumber: number; id: number;
} }
export async function getSubmissionHandler( export async function getSubmissionHandler(
req: Request<SubmissionParams>, req: Request<SubmissionParams>,
res: Response, res: Response,
): Promise<void> { ): Promise<void> {
const lohruid = req.params.lohruid; const lohruid = req.params.hruid;
const submissionNumber = +req.params.submissionNumber; const submissionNumber = +req.params.id;
if (isNaN(submissionNumber)) { if (isNaN(submissionNumber)) {
res.status(404).json({ error: 'Submission number is not a number' }); res.status(400).json({ error: 'Submission number is not a number' });
return; return;
} }
let lang = languageMap[req.query.language as string] || Language.Dutch; let lang = languageMap[req.query.language as string] || Language.Dutch;
let version = req.query.version as string || '1'; let version = req.query.version as string || '1';
const submission = getSubmission(lohruid, lang, version, submissionNumber); const submission = await getSubmission(lohruid, lang, version, submissionNumber);
if (!submission) { if (!submission) {
res.status(404).json({ error: 'Submission not found' }); res.status(404).json({ error: 'Submission not found' });
@ -31,3 +32,29 @@ export async function getSubmissionHandler(
res.json(submission); res.json(submission);
} }
export async function createSubmissionHandler(req: Request, res: Response){
const submissionDTO = req.body as SubmissionDTO;
const submission = await createSubmission(submissionDTO);
if (!submission)
res.status(404).json({ error: 'Submission not added' });
else
res.json(submission)
}
export async function deleteSubmissionHandler(req: Request, res: Response){
const hruid = req.params.hruid;
const submissionNumber = +req.params.id;
let lang = languageMap[req.query.language as string] || Language.Dutch;
let version = req.query.version as string || '1';
const submission = await deleteSubmission(hruid, lang, version, submissionNumber);
if (!submission)
res.status(404).json({ error: 'Submission not found' });
else
res.json(submission)
}

View file

@ -1,17 +1,19 @@
import { Submission } from "../entities/assignments/submission.entity.js"; import { Submission } from "../entities/assignments/submission.entity.js";
import { Language } from "../entities/content/language.js"; import { Language } from "../entities/content/language.js";
import { GroupDTO, mapToGroupDTO } from "./group.js"; import { GroupDTO, mapToGroupDTO } from "./group.js";
import { mapToStudentDTO, StudentDTO } from "./student.js"; import {mapToStudent, mapToStudentDTO, StudentDTO} from "./student.js";
import {mapToUser} from "./user";
import {Student} from "../entities/users/student.entity";
export interface SubmissionDTO { export interface SubmissionDTO {
learningObjectHruid: string, learningObjectHruid: string,
learningObjectLanguage: Language, learningObjectLanguage: Language,
learningObjectVersion: string, learningObjectVersion: string,
submissionNumber: number, submissionNumber?: number,
submitter: StudentDTO | string, submitter: StudentDTO,
time: Date, time?: Date,
group?: GroupDTO | string, group?: GroupDTO,
content: string, content: string,
} }
@ -28,3 +30,18 @@ export function mapToSubmissionDTO(submission: Submission): SubmissionDTO {
content: submission.content, content: submission.content,
} }
} }
export function mapToSubmission(submissionDTO: SubmissionDTO): Submission {
const submission = new Submission();
submission.learningObjectHruid = submissionDTO.learningObjectHruid;
submission.learningObjectLanguage = submissionDTO.learningObjectLanguage;
submission.learningObjectVersion = submissionDTO.learningObjectVersion;
// submission.submissionNumber = submissionDTO.submissionNumber;
submission.submitter = mapToStudent(submissionDTO.submitter) ;
// submission.submissionTime = submissionDTO.time;
// submission.onBehalfOf = submissionDTO.group!;
// TODO fix group
submission.content = submissionDTO.content;
return submission;
}

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

@ -12,7 +12,7 @@ router.get('/:groupid', getGroupHandler);
router.get('/:groupid', getGroupSubmissionsHandler); router.get('/:groupid', getGroupSubmissionsHandler);
// The list of questions a group has made // The list of questions a group has made
router.get('/:id/question', (req, res) => { router.get('/:id/questions', (req, res) => {
res.json({ res.json({
questions: ['0'], questions: ['0'],
}); });

View file

@ -1,5 +1,5 @@
import express from 'express'; import express from 'express';
import { getSubmissionHandler } from '../controllers/submissions.js'; import {createSubmissionHandler, deleteSubmissionHandler, getSubmissionHandler} from '../controllers/submissions.js';
const router = express.Router({ mergeParams: true }); const router = express.Router({ mergeParams: true });
@ -11,7 +11,11 @@ router.get('/', (req, res) => {
}); });
}); });
router.post('/:id', createSubmissionHandler);
// Information about an submission with id 'id' // Information about an submission with id 'id'
router.get('/:id', getSubmissionHandler); router.get('/:id', getSubmissionHandler);
router.delete('/:id', deleteSubmissionHandler);
export default router; export default router;

View file

@ -1,7 +1,7 @@
import { getSubmissionRepository } from "../data/repositories.js"; import {getGroupRepository, getSubmissionRepository} from "../data/repositories.js";
import { Language } from "../entities/content/language.js"; import { Language } from "../entities/content/language.js";
import { LearningObjectIdentifier } from "../entities/content/learning-object-identifier.js"; import { LearningObjectIdentifier } from "../entities/content/learning-object-identifier.js";
import { mapToSubmissionDTO, SubmissionDTO } from "../interfaces/submission.js"; import {mapToSubmission, mapToSubmissionDTO, SubmissionDTO} from "../interfaces/submission.js";
export async function getSubmission( export async function getSubmission(
learningObjectHruid: string, learningObjectHruid: string,
@ -20,3 +20,38 @@ export async function getSubmission(
return mapToSubmissionDTO(submission); return mapToSubmissionDTO(submission);
} }
export async function createSubmission(submissionDTO: SubmissionDTO) {
const submissionRepository = getSubmissionRepository();
const submission = mapToSubmission(submissionDTO);
try {
const newSubmission = await submissionRepository.create(submission);
await submissionRepository.save(newSubmission);
} catch (e) {
return null
}
return submission;
}
export async function deleteSubmission(
learningObjectHruid: string,
language: Language,
version: string,
submissionNumber: number
) {
const submissionRepository = getSubmissionRepository();
const submission = getSubmission(learningObjectHruid, language, version, submissionNumber);
if (!submission)
return null
const loId = new LearningObjectIdentifier(learningObjectHruid, language, version);
await submissionRepository.deleteSubmissionByLearningObjectAndSubmissionNumber(loId, submissionNumber);
return submission;
}