diff --git a/backend/src/controllers/groups.ts b/backend/src/controllers/groups.ts index 3faf4ff0..446a6a7e 100644 --- a/backend/src/controllers/groups.ts +++ b/backend/src/controllers/groups.ts @@ -8,7 +8,6 @@ export async function getGroupHandler(req: Request, res: Response): Promise member.username), diff --git a/backend/src/interfaces/submission.ts b/backend/src/interfaces/submission.ts index b4ed4a2b..91882c35 100644 --- a/backend/src/interfaces/submission.ts +++ b/backend/src/interfaces/submission.ts @@ -1,6 +1,9 @@ +import { getSubmissionRepository } from '../data/repositories.js'; +import { Group } from '../entities/assignments/group.entity.js'; import { Submission } from '../entities/assignments/submission.entity.js'; +import { Student } from '../entities/users/student.entity.js'; import { mapToGroupDTO } from './group.js'; -import { mapToStudent, mapToStudentDTO } from './student.js'; +import { mapToStudentDTO } from './student.js'; import { SubmissionDTO, SubmissionDTOId } from '@dwengo-1/common/interfaces/submission'; export function mapToSubmissionDTO(submission: Submission): SubmissionDTO { @@ -29,17 +32,14 @@ export function mapToSubmissionDTOId(submission: Submission): SubmissionDTOId { }; } -export function mapToSubmission(submissionDTO: SubmissionDTO): Submission { - const submission = new Submission(); - submission.learningObjectHruid = submissionDTO.learningObjectIdentifier.hruid; - submission.learningObjectLanguage = submissionDTO.learningObjectIdentifier.language; - submission.learningObjectVersion = submissionDTO.learningObjectIdentifier.version!; - // 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; +export function mapToSubmission(submissionDTO: SubmissionDTO, submitter: Student, onBehalfOf: Group | undefined): Submission { + return getSubmissionRepository().create({ + learningObjectHruid: submissionDTO.learningObjectIdentifier.hruid, + learningObjectLanguage: submissionDTO.learningObjectIdentifier.language, + learningObjectVersion: submissionDTO.learningObjectIdentifier.version || 1, + submitter: submitter, + submissionTime: new Date(), + content: submissionDTO.content, + onBehalfOf: onBehalfOf, + }); } diff --git a/backend/src/services/classes.ts b/backend/src/services/classes.ts index 92fd158d..4c8d4caf 100644 --- a/backend/src/services/classes.ts +++ b/backend/src/services/classes.ts @@ -26,7 +26,7 @@ export async function fetchClass(classid: string): Promise { export async function getAllClasses(full: boolean): Promise { const classRepository = getClassRepository(); - const classes = await classRepository.find({}, { populate: ['students', 'teachers'] }); + const classes = await classRepository.findAll({ populate: ['students', 'teachers'] }); if (full) { return classes.map(mapToClassDTO); @@ -34,13 +34,12 @@ export async function getAllClasses(full: boolean): Promise cls.classId!); } -export async function getClass(classId: string): Promise { +export async function getClass(classId: string): Promise { const cls = await fetchClass(classId); - return mapToClassDTO(cls); } -export async function createClass(classData: ClassDTO): Promise { +export async function createClass(classData: ClassDTO): Promise { const teacherUsernames = classData.teachers || []; const teachers = (await Promise.all(teacherUsernames.map(async (id) => fetchTeacher(id) ))); @@ -48,7 +47,6 @@ export async function createClass(classData: ClassDTO): Promise const students = (await Promise.all(studentUsernames.map(async (id) => fetchStudent(id) ))); const classRepository = getClassRepository(); - const newClass = classRepository.create({ displayName: classData.displayName, teachers: teachers, diff --git a/backend/src/services/groups.ts b/backend/src/services/groups.ts index 9dfb1596..94f96d54 100644 --- a/backend/src/services/groups.ts +++ b/backend/src/services/groups.ts @@ -14,80 +14,58 @@ import { GroupDTO } from '@dwengo-1/common/interfaces/group'; import { SubmissionDTO, SubmissionDTOId } from '@dwengo-1/common/interfaces/submission'; import { getLogger } from '../logging/initalize.js'; import { fetchAssignment } from './assignments.js'; +import { NotFoundException } from '../exceptions/not-found-exception.js'; +import { fetchClass } from './classes.js'; -async function fetchGroup(classId: string, assignmentNumber: number, groupNumber: number): Promise { +export async function fetchGroup(classId: string, assignmentNumber: number, groupNumber: number): Promise { const assignment = await fetchAssignment(classId, assignmentNumber); - if (!assignment) { - return null; - } - const groupRepository = getGroupRepository(); const group = await groupRepository.findByAssignmentAndGroupNumber(assignment, groupNumber); + if (!group) { + throw new NotFoundException('Could not find group'); + } + return group; } -export async function getGroup(classId: string, assignmentNumber: number, groupNumber: number, full: boolean): Promise { +export async function getGroup(classId: string, assignmentNumber: number, groupNumber: number): Promise { const group = await fetchGroup(classId, assignmentNumber, groupNumber); - - if (!group) { - return null; - } - - if (full) { - return mapToGroupDTO(group); - } - - return mapToGroupDTOId(group); + return mapToGroupDTO(group); } -export async function createGroup(groupData: GroupDTO, classid: string, assignmentNumber: number): Promise { +export async function getExistingGroupFromGroupDTO(groupData: GroupDTO) { + const classId = typeof(groupData.class) === 'string' ? groupData.class : groupData.class.id; + const assignmentNumber = typeof(groupData.assignment) === 'number' ? groupData.assignment : groupData.assignment.id; + const groupNumber = groupData.groupNumber; + + return await fetchGroup(classId, assignmentNumber, groupNumber); +} + +export async function createGroup(groupData: GroupDTO, classid: string, assignmentNumber: number): Promise { const studentRepository = getStudentRepository(); - const memberUsernames = (groupData.members as string[]) || []; // TODO check if groupdata.members is a list + const memberUsernames = (groupData.members as string[]) || []; const members = (await Promise.all([...memberUsernames].map(async (id) => studentRepository.findByUsername(id)))).filter( (student) => student !== null ); - getLogger().debug(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 assignment = await fetchAssignment(classid, assignmentNumber); const groupRepository = getGroupRepository(); - try { - const newGroup = groupRepository.create({ - assignment: assignment, - members: members, - }); - await groupRepository.save(newGroup); + const newGroup = groupRepository.create({ + assignment: assignment, + members: members, + }); + await groupRepository.save(newGroup); - return newGroup; - } catch (e) { - getLogger().error(e); - return null; - } + return mapToGroupDTO(newGroup); } export async function getAllGroups(classId: string, assignmentNumber: number, full: boolean): Promise { const assignment = await fetchAssignment(classId, assignmentNumber); - if (!assignment) { - return []; - } - const groupRepository = getGroupRepository(); const groups = await groupRepository.findAllGroupsForAssignment(assignment); @@ -106,10 +84,6 @@ export async function getGroupSubmissions( ): Promise { const group = await fetchGroup(classId, assignmentNumber, groupNumber); - if (!group) { - return []; - } - const submissionRepository = getSubmissionRepository(); const submissions = await submissionRepository.findAllSubmissionsForGroup(group); diff --git a/backend/src/services/submissions.ts b/backend/src/services/submissions.ts index e80b53ee..f3ee0f10 100644 --- a/backend/src/services/submissions.ts +++ b/backend/src/services/submissions.ts @@ -4,11 +4,14 @@ import { NotFoundException } from '../exceptions/not-found-exception.js'; import { mapToSubmission, mapToSubmissionDTO } from '../interfaces/submission.js'; import { SubmissionDTO } from '@dwengo-1/common/interfaces/submission'; import { Language } from '@dwengo-1/common/util/language'; +import { fetchStudent } from './students.js'; +import { fetchGroup, getExistingGroupFromGroupDTO } from './groups.js'; +import { Submission } from '../entities/assignments/submission.entity.js'; -export async function getSubmission( +export async function fetchSubmission( loId: LearningObjectIdentifier, - submissionNumber: number -): Promise { + submissionNumber: number, +): Promise { const submissionRepository = getSubmissionRepository(); const submission = await submissionRepository.findSubmissionByLearningObjectAndSubmissionNumber(loId, submissionNumber); @@ -16,6 +19,14 @@ export async function getSubmission( throw new NotFoundException('Could not find submission'); } + return submission; +} + +export async function getSubmission( + loId: LearningObjectIdentifier, + submissionNumber: number +): Promise { + const submission = await fetchSubmission(loId, submissionNumber); return mapToSubmissionDTO(submission); } @@ -28,30 +39,22 @@ export async function getAllSubmissions( return submissions.map(mapToSubmissionDTO); } -export async function createSubmission(submissionDTO: SubmissionDTO): Promise { - const submissionRepository = getSubmissionRepository(); - const submission = mapToSubmission(submissionDTO); +export async function createSubmission(submissionDTO: SubmissionDTO): Promise { + const submitter = await fetchStudent(submissionDTO.submitter.username); + const group = submissionDTO.group ? await getExistingGroupFromGroupDTO(submissionDTO.group) : undefined; - try { - const newSubmission = submissionRepository.create(submission); - await submissionRepository.save(newSubmission); - } catch (_) { - return null; - } + const submissionRepository = getSubmissionRepository(); + const submission = mapToSubmission(submissionDTO, submitter, group); + await submissionRepository.save(submission); return mapToSubmissionDTO(submission); } export async function deleteSubmission(loId: LearningObjectIdentifier, submissionNumber: number): Promise { + const submission = await fetchSubmission(loId, submissionNumber); + const submissionRepository = getSubmissionRepository(); - - const submission = await getSubmission(loId, submissionNumber); - - if (!submission) { - throw new NotFoundException('Could not delete submission because it does not exist'); - } - await submissionRepository.deleteSubmissionByLearningObjectAndSubmissionNumber(loId, submissionNumber); - return submission; + return mapToSubmissionDTO(submission); } diff --git a/common/src/interfaces/group.ts b/common/src/interfaces/group.ts index ca95770a..742f2c75 100644 --- a/common/src/interfaces/group.ts +++ b/common/src/interfaces/group.ts @@ -1,7 +1,9 @@ import { AssignmentDTO } from './assignment'; +import { ClassDTO } from './class'; import { StudentDTO } from './student'; export interface GroupDTO { + class: string | ClassDTO; assignment: number | AssignmentDTO; groupNumber: number; members: string[] | StudentDTO[];