import { DwengoEntityRepository } from '../dwengo-entity-repository.js'; import { Group } from '../../entities/assignments/group.entity.js'; import { Submission } from '../../entities/assignments/submission.entity.js'; import { LearningObjectIdentifier } from '../../entities/content/learning-object-identifier.js'; import { Student } from '../../entities/users/student.entity.js'; import { Assignment } from '../../entities/assignments/assignment.entity'; export class SubmissionRepository extends DwengoEntityRepository { public async findSubmissionByLearningObjectAndSubmissionNumber( loId: LearningObjectIdentifier, submissionNumber: number ): Promise { return this.findOne({ learningObjectHruid: loId.hruid, learningObjectLanguage: loId.language, learningObjectVersion: loId.version, submissionNumber: submissionNumber, }); } public async findByLearningObject(loId: LearningObjectIdentifier): Promise { return this.find({ learningObjectHruid: loId.hruid, learningObjectLanguage: loId.language, learningObjectVersion: loId.version, }); } public async findMostRecentSubmissionForStudent(loId: LearningObjectIdentifier, submitter: Student): Promise { return this.findOne( { learningObjectHruid: loId.hruid, learningObjectLanguage: loId.language, learningObjectVersion: loId.version, submitter: submitter, }, { orderBy: { submissionNumber: 'DESC' } } ); } public async findMostRecentSubmissionForGroup(loId: LearningObjectIdentifier, group: Group): Promise { return this.findOne( { learningObjectHruid: loId.hruid, learningObjectLanguage: loId.language, learningObjectVersion: loId.version, onBehalfOf: group, }, { orderBy: { submissionNumber: 'DESC' } } ); } public async findAllSubmissionsForGroup(group: Group): Promise { return this.find( { onBehalfOf: group }, { populate: ['onBehalfOf.members'], } ); } /** * Looks up all submissions for the given learning object which were submitted as part of the given assignment. */ public async findAllSubmissionsForLearningObjectAndAssignment(loId: LearningObjectIdentifier, assignment: Assignment): Promise { return this.findAll({ where: { learningObjectHruid: loId.hruid, learningObjectLanguage: loId.language, learningObjectVersion: loId.version, onBehalfOf: { assignment, }, }, }); } /** * Looks up all submissions for the given learning object which were submitted by the given group */ public async findAllSubmissionsForLearningObjectAndGroup(loId: LearningObjectIdentifier, group: Group): Promise { return this.findAll({ where: { learningObjectHruid: loId.hruid, learningObjectLanguage: loId.language, learningObjectVersion: loId.version, onBehalfOf: group, }, }); } public async findAllSubmissionsForStudent(student: Student): Promise { const result = await this.find( { submitter: student }, { populate: ['onBehalfOf.members'], } ); // Workaround: For some reason, without this MikroORM generates an UPDATE query with a syntax error in some tests this.em.clear(); return result; } public async deleteSubmissionByLearningObjectAndSubmissionNumber(loId: LearningObjectIdentifier, submissionNumber: number): Promise { return this.deleteWhere({ learningObjectHruid: loId.hruid, learningObjectLanguage: loId.language, learningObjectVersion: loId.version, submissionNumber: submissionNumber, }); } }