feat(backend): Submissions kunnen nu per leerobject, assignment en optioneel groepslid opgevraagd worden
This commit is contained in:
		
							parent
							
								
									9135b9c5b0
								
							
						
					
					
						commit
						64fd66a1de
					
				
					 4 changed files with 94 additions and 47 deletions
				
			
		|  | @ -51,26 +51,32 @@ export class SubmissionRepository extends DwengoEntityRepository<Submission> { | ||||||
|         ); |         ); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public async findAllSubmissionsForAllGroupsOfStudent(studentUsername: string): Promise<Submission[]> { |     /** | ||||||
|         return this.findAll({ |      * Looks up all submissions for the given learning object which were submitted as part of the given assignment. | ||||||
|             where: { |      * When forStudentUsername is set, only the submissions of the given user's group are shown. | ||||||
|                 onBehalfOf: { |      */ | ||||||
|                     members: { |     public async findAllSubmissionsForLearningObjectAndAssignment( | ||||||
|                         $some: { |         loId: LearningObjectIdentifier, | ||||||
|                             username: studentUsername |         assignment: Assignment, | ||||||
|                         } |         forStudentUsername?: string | ||||||
|                     }, |     ): Promise<Submission[]> { | ||||||
|  |         let onBehalfOf = forStudentUsername ? { | ||||||
|  |             assignment, | ||||||
|  |             members: { | ||||||
|  |                 $some: { | ||||||
|  |                     username: forStudentUsername | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         }); |         } : { | ||||||
|     } |             assignment | ||||||
|  |         }; | ||||||
| 
 | 
 | ||||||
|     public async findAllSubmissionsForAssignment(assignment: Assignment): Promise<Submission[]> { |  | ||||||
|         return this.findAll({ |         return this.findAll({ | ||||||
|             where: { |             where: { | ||||||
|                 onBehalfOf: { |                 learningObjectHruid: loId.hruid, | ||||||
|                     assignment |                 learningObjectLanguage: loId.language, | ||||||
|                 } |                 learningObjectVersion: loId.version, | ||||||
|  |                 onBehalfOf | ||||||
|             } |             } | ||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | @ -15,6 +15,8 @@ import {GroupRepository} from '../../../src/data/assignments/group-repository'; | ||||||
| import {AssignmentRepository} from '../../../src/data/assignments/assignment-repository'; | import {AssignmentRepository} from '../../../src/data/assignments/assignment-repository'; | ||||||
| import {ClassRepository} from '../../../src/data/classes/class-repository'; | import {ClassRepository} from '../../../src/data/classes/class-repository'; | ||||||
| import {Submission} from "../../../src/entities/assignments/submission.entity"; | import {Submission} from "../../../src/entities/assignments/submission.entity"; | ||||||
|  | import {Class} from "../../../src/entities/classes/class.entity"; | ||||||
|  | import {Assignment} from "../../../src/entities/assignments/assignment.entity"; | ||||||
| 
 | 
 | ||||||
| export function checkSubmissionsForStudentNoordkaap(result: Submission[]) { | export function checkSubmissionsForStudentNoordkaap(result: Submission[]) { | ||||||
|     sortSubmissions(result); |     sortSubmissions(result); | ||||||
|  | @ -79,40 +81,48 @@ describe('SubmissionRepository', () => { | ||||||
|         expect(submission?.submissionTime.getDate()).toBe(25); |         expect(submission?.submissionTime.getDate()).toBe(25); | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|     it('should find all submissions for all groups of a student', async () => { |     let clazz: Class | null; | ||||||
|         const result = await submissionRepository.findAllSubmissionsForAllGroupsOfStudent("Noordkaap"); |     let assignment: Assignment | null; | ||||||
|         expect(result.length).toBe(5); |     let loId: LearningObjectIdentifier; | ||||||
| 
 |     it('should find all submissions for a certain learning object and assignment', async () => { | ||||||
|         checkSubmissionsForStudentNoordkaap(result); |         clazz = await classRepository.findById('id01'); | ||||||
|     }); |         assignment = await assignmentRepository.findByClassAndId(clazz!, 1); | ||||||
| 
 |         loId = { | ||||||
|     it('should find all submissions for a certain assignment', async () => { |             hruid: "id02", | ||||||
|         const clazz = await classRepository.findById('id01'); |             language: Language.English, | ||||||
|         const assignment = await assignmentRepository.findByClassAndId(clazz!, 1); |             version: 1 | ||||||
|         const result = await submissionRepository.findAllSubmissionsForAssignment(assignment!); |         }; | ||||||
| 
 |         const result = await submissionRepository.findAllSubmissionsForLearningObjectAndAssignment(loId, assignment!); | ||||||
|         sortSubmissions(result); |         sortSubmissions(result); | ||||||
| 
 | 
 | ||||||
|         expect(result).toHaveLength(5); |         expect(result).toHaveLength(3); | ||||||
| 
 | 
 | ||||||
|         expect(result[0].learningObjectHruid).toBe("id01"); |         // submission3 should be found (for learning object 'id02' by group #1 for Assignment #1 in class 'id01')
 | ||||||
|  |         expect(result[0].learningObjectHruid).toBe(loId.hruid); | ||||||
|         expect(result[0].submissionNumber).toBe(1); |         expect(result[0].submissionNumber).toBe(1); | ||||||
| 
 | 
 | ||||||
|         expect(result[1].learningObjectHruid).toBe("id02"); |         // submission4 should be found (for learning object 'id02' by group #1 for Assignment #1 in class 'id01')
 | ||||||
|         expect(result[1].submissionNumber).toBe(1); |         expect(result[1].learningObjectHruid).toBe(loId.hruid); | ||||||
|  |         expect(result[1].submissionNumber).toBe(2); | ||||||
| 
 | 
 | ||||||
|         expect(result[2].learningObjectHruid).toBe("id02"); |         // submission8 should be found (for learning object 'id02' by group #2 for Assignment #1 in class 'id01')
 | ||||||
|         expect(result[2].submissionNumber).toBe(2); |         expect(result[2].learningObjectHruid).toBe(loId.hruid); | ||||||
|  |         expect(result[2].submissionNumber).toBe(3); | ||||||
|  |     }); | ||||||
| 
 | 
 | ||||||
|         expect(result[3].learningObjectHruid).toBe("id03"); |     it("should find only the submissions for a certain learning object and assignment made for the user's group", async () => { | ||||||
|         expect(result[3].submissionNumber).toBe(1); |         const result = | ||||||
|  |             await submissionRepository.findAllSubmissionsForLearningObjectAndAssignment(loId, assignment!, "Tool"); | ||||||
|  |         // (student Tool is in group #2)
 | ||||||
| 
 | 
 | ||||||
|         expect(result[4].learningObjectHruid).toBe("id03"); |         expect(result).toHaveLength(1); | ||||||
|         expect(result[4].submissionNumber).toBe(2); |  | ||||||
| 
 | 
 | ||||||
|         // But not submission7 (id01, submission number: 3), since it was submitted for an assignment
 |         // submission8 should be found (for learning object 'id02' by group #2 for Assignment #1 in class 'id01')
 | ||||||
|  |         expect(result[0].learningObjectHruid).toBe(loId.hruid); | ||||||
|  |         expect(result[0].submissionNumber).toBe(3); | ||||||
| 
 | 
 | ||||||
|         sortSubmissions(result); |         // The other submissions found in the previous test case should not be found anymore as they were made on
 | ||||||
|  |         // behalf of group #1 which Tool is no member of.
 | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|     it('should not find a deleted submission', async () => { |     it('should not find a deleted submission', async () => { | ||||||
|  |  | ||||||
|  | @ -4,30 +4,50 @@ import { Assignment } from '../../../src/entities/assignments/assignment.entity' | ||||||
| import { Student } from '../../../src/entities/users/student.entity'; | import { Student } from '../../../src/entities/users/student.entity'; | ||||||
| 
 | 
 | ||||||
| export function makeTestGroups(em: EntityManager, students: Student[], assignments: Assignment[]): Group[] { | export function makeTestGroups(em: EntityManager, students: Student[], assignments: Assignment[]): Group[] { | ||||||
|  |     /* | ||||||
|  |      * Group #1 for Assignment #1 in class 'id01' | ||||||
|  |      * => Assigned to do learning path 'id02' | ||||||
|  |      */ | ||||||
|     const group01 = em.create(Group, { |     const group01 = em.create(Group, { | ||||||
|         assignment: assignments[0], |         assignment: assignments[0], | ||||||
|         groupNumber: 1, |         groupNumber: 1, | ||||||
|         members: students.slice(0, 2), |         members: students.slice(0, 2), | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|  |     /* | ||||||
|  |      * Group #2 for Assignment #1 in class 'id01' | ||||||
|  |      * => Assigned to do learning path 'id02' | ||||||
|  |      */ | ||||||
|     const group02 = em.create(Group, { |     const group02 = em.create(Group, { | ||||||
|         assignment: assignments[0], |         assignment: assignments[0], | ||||||
|         groupNumber: 2, |         groupNumber: 2, | ||||||
|         members: students.slice(2, 4), |         members: students.slice(2, 4), | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|  |     /* | ||||||
|  |      * Group #3 for Assignment #1 in class 'id01' | ||||||
|  |      * => Assigned to do learning path 'id02' | ||||||
|  |      */ | ||||||
|     const group03 = em.create(Group, { |     const group03 = em.create(Group, { | ||||||
|         assignment: assignments[0], |         assignment: assignments[0], | ||||||
|         groupNumber: 3, |         groupNumber: 3, | ||||||
|         members: students.slice(4, 6), |         members: students.slice(4, 6), | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|  |     /* | ||||||
|  |      * Group #4 for Assignment #2 in class 'id02' | ||||||
|  |      * => Assigned to do learning path 'id01' | ||||||
|  |      */ | ||||||
|     const group04 = em.create(Group, { |     const group04 = em.create(Group, { | ||||||
|         assignment: assignments[1], |         assignment: assignments[1], | ||||||
|         groupNumber: 4, |         groupNumber: 4, | ||||||
|         members: students.slice(3, 4), |         members: students.slice(3, 4), | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|  |     /* | ||||||
|  |      * Group #5 for Assignment #4 in class 'id01' | ||||||
|  |      * => Assigned to do learning path 'id01' | ||||||
|  |      */ | ||||||
|     const group05 = em.create(Group, { |     const group05 = em.create(Group, { | ||||||
|         assignment: assignments[3], |         assignment: assignments[3], | ||||||
|         groupNumber: 1, |         groupNumber: 1, | ||||||
|  |  | ||||||
|  | @ -12,7 +12,7 @@ export function makeTestSubmissions(em: EntityManager, students: Student[], grou | ||||||
|         submissionNumber: 1, |         submissionNumber: 1, | ||||||
|         submitter: students[0], |         submitter: students[0], | ||||||
|         submissionTime: new Date(2025, 2, 20), |         submissionTime: new Date(2025, 2, 20), | ||||||
|         onBehalfOf: groups[0], |         onBehalfOf: groups[0], // group #1 for Assignment #1 in class 'id01'
 | ||||||
|         content: 'sub1', |         content: 'sub1', | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|  | @ -23,7 +23,7 @@ export function makeTestSubmissions(em: EntityManager, students: Student[], grou | ||||||
|         submissionNumber: 2, |         submissionNumber: 2, | ||||||
|         submitter: students[0], |         submitter: students[0], | ||||||
|         submissionTime: new Date(2025, 2, 25), |         submissionTime: new Date(2025, 2, 25), | ||||||
|         onBehalfOf: groups[0], |         onBehalfOf: groups[0], // group #1 for Assignment #1 in class 'id01'
 | ||||||
|         content: '', |         content: '', | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|  | @ -34,7 +34,7 @@ export function makeTestSubmissions(em: EntityManager, students: Student[], grou | ||||||
|         submissionNumber: 1, |         submissionNumber: 1, | ||||||
|         submitter: students[0], |         submitter: students[0], | ||||||
|         submissionTime: new Date(2025, 2, 20), |         submissionTime: new Date(2025, 2, 20), | ||||||
|         onBehalfOf: groups[0], |         onBehalfOf: groups[0], // group #1 for Assignment #1 in class 'id01'
 | ||||||
|         content: '', |         content: '', | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|  | @ -45,7 +45,7 @@ export function makeTestSubmissions(em: EntityManager, students: Student[], grou | ||||||
|         submissionNumber: 2, |         submissionNumber: 2, | ||||||
|         submitter: students[0], |         submitter: students[0], | ||||||
|         submissionTime: new Date(2025, 2, 25), |         submissionTime: new Date(2025, 2, 25), | ||||||
|         onBehalfOf: groups[0], |         onBehalfOf: groups[0], // group #1 for Assignment #1 in class 'id01'
 | ||||||
|         content: '', |         content: '', | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|  | @ -56,7 +56,7 @@ export function makeTestSubmissions(em: EntityManager, students: Student[], grou | ||||||
|         submissionNumber: 1, |         submissionNumber: 1, | ||||||
|         submitter: students[1], |         submitter: students[1], | ||||||
|         submissionTime: new Date(2025, 2, 20), |         submissionTime: new Date(2025, 2, 20), | ||||||
|         onBehalfOf: groups[1], |         onBehalfOf: groups[1], // Group #2 for Assignment #1 in class 'id01'
 | ||||||
|         content: '', |         content: '', | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|  | @ -67,7 +67,7 @@ export function makeTestSubmissions(em: EntityManager, students: Student[], grou | ||||||
|         submissionNumber: 2, |         submissionNumber: 2, | ||||||
|         submitter: students[1], |         submitter: students[1], | ||||||
|         submissionTime: new Date(2025, 2, 25), |         submissionTime: new Date(2025, 2, 25), | ||||||
|         onBehalfOf: groups[4], |         onBehalfOf: groups[4], // Group #5 for Assignment #4 in class 'id01'
 | ||||||
|         content: '', |         content: '', | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|  | @ -78,9 +78,20 @@ export function makeTestSubmissions(em: EntityManager, students: Student[], grou | ||||||
|         submissionNumber: 3, |         submissionNumber: 3, | ||||||
|         submitter: students[3], |         submitter: students[3], | ||||||
|         submissionTime: new Date(2025, 3, 25), |         submissionTime: new Date(2025, 3, 25), | ||||||
|         onBehalfOf: groups[3], |         onBehalfOf: groups[3], // Group #4 for Assignment #2 in class 'id02'
 | ||||||
|         content: '', |         content: '', | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|     return [submission01, submission02, submission03, submission04, submission05, submission06, submission07]; |     const submission08 = em.create(Submission, { | ||||||
|  |         learningObjectHruid: 'id02', | ||||||
|  |         learningObjectLanguage: Language.English, | ||||||
|  |         learningObjectVersion: 1, | ||||||
|  |         submissionNumber: 3, | ||||||
|  |         submitter: students[1], | ||||||
|  |         submissionTime: new Date(2025, 4, 7), | ||||||
|  |         onBehalfOf: groups[1], // Group #2 for Assignment #1 in class 'id01'
 | ||||||
|  |         content: '', | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  |     return [submission01, submission02, submission03, submission04, submission05, submission06, submission07, submission08]; | ||||||
| } | } | ||||||
|  |  | ||||||
		Reference in a new issue