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({ | ||||
|             where: { | ||||
|                 onBehalfOf: { | ||||
|                     members: { | ||||
|                         $some: { | ||||
|                             username: studentUsername | ||||
|                         } | ||||
|                     }, | ||||
|     /** | ||||
|      * Looks up all submissions for the given learning object which were submitted as part of the given assignment. | ||||
|      * When forStudentUsername is set, only the submissions of the given user's group are shown. | ||||
|      */ | ||||
|     public async findAllSubmissionsForLearningObjectAndAssignment( | ||||
|         loId: LearningObjectIdentifier, | ||||
|         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({ | ||||
|             where: { | ||||
|                 onBehalfOf: { | ||||
|                     assignment | ||||
|                 } | ||||
|                 learningObjectHruid: loId.hruid, | ||||
|                 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 {ClassRepository} from '../../../src/data/classes/class-repository'; | ||||
| 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[]) { | ||||
|     sortSubmissions(result); | ||||
|  | @ -79,40 +81,48 @@ describe('SubmissionRepository', () => { | |||
|         expect(submission?.submissionTime.getDate()).toBe(25); | ||||
|     }); | ||||
| 
 | ||||
|     it('should find all submissions for all groups of a student', async () => { | ||||
|         const result = await submissionRepository.findAllSubmissionsForAllGroupsOfStudent("Noordkaap"); | ||||
|         expect(result.length).toBe(5); | ||||
| 
 | ||||
|         checkSubmissionsForStudentNoordkaap(result); | ||||
|     }); | ||||
| 
 | ||||
|     it('should find all submissions for a certain assignment', async () => { | ||||
|         const clazz = await classRepository.findById('id01'); | ||||
|         const assignment = await assignmentRepository.findByClassAndId(clazz!, 1); | ||||
|         const result = await submissionRepository.findAllSubmissionsForAssignment(assignment!); | ||||
| 
 | ||||
|     let clazz: Class | null; | ||||
|     let assignment: Assignment | null; | ||||
|     let loId: LearningObjectIdentifier; | ||||
|     it('should find all submissions for a certain learning object and assignment', async () => { | ||||
|         clazz = await classRepository.findById('id01'); | ||||
|         assignment = await assignmentRepository.findByClassAndId(clazz!, 1); | ||||
|         loId = { | ||||
|             hruid: "id02", | ||||
|             language: Language.English, | ||||
|             version: 1 | ||||
|         }; | ||||
|         const result = await submissionRepository.findAllSubmissionsForLearningObjectAndAssignment(loId, assignment!); | ||||
|         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[1].learningObjectHruid).toBe("id02"); | ||||
|         expect(result[1].submissionNumber).toBe(1); | ||||
|         // submission4 should be found (for learning object 'id02' by group #1 for Assignment #1 in class 'id01')
 | ||||
|         expect(result[1].learningObjectHruid).toBe(loId.hruid); | ||||
|         expect(result[1].submissionNumber).toBe(2); | ||||
| 
 | ||||
|         expect(result[2].learningObjectHruid).toBe("id02"); | ||||
|         expect(result[2].submissionNumber).toBe(2); | ||||
|         // submission8 should be found (for learning object 'id02' by group #2 for Assignment #1 in class 'id01')
 | ||||
|         expect(result[2].learningObjectHruid).toBe(loId.hruid); | ||||
|         expect(result[2].submissionNumber).toBe(3); | ||||
|     }); | ||||
| 
 | ||||
|         expect(result[3].learningObjectHruid).toBe("id03"); | ||||
|         expect(result[3].submissionNumber).toBe(1); | ||||
|     it("should find only the submissions for a certain learning object and assignment made for the user's group", async () => { | ||||
|         const result = | ||||
|             await submissionRepository.findAllSubmissionsForLearningObjectAndAssignment(loId, assignment!, "Tool"); | ||||
|         // (student Tool is in group #2)
 | ||||
| 
 | ||||
|         expect(result[4].learningObjectHruid).toBe("id03"); | ||||
|         expect(result[4].submissionNumber).toBe(2); | ||||
|         expect(result).toHaveLength(1); | ||||
| 
 | ||||
|         // 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 () => { | ||||
|  |  | |||
|  | @ -4,30 +4,50 @@ import { Assignment } from '../../../src/entities/assignments/assignment.entity' | |||
| import { Student } from '../../../src/entities/users/student.entity'; | ||||
| 
 | ||||
| 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, { | ||||
|         assignment: assignments[0], | ||||
|         groupNumber: 1, | ||||
|         members: students.slice(0, 2), | ||||
|     }); | ||||
| 
 | ||||
|     /* | ||||
|      * Group #2 for Assignment #1 in class 'id01' | ||||
|      * => Assigned to do learning path 'id02' | ||||
|      */ | ||||
|     const group02 = em.create(Group, { | ||||
|         assignment: assignments[0], | ||||
|         groupNumber: 2, | ||||
|         members: students.slice(2, 4), | ||||
|     }); | ||||
| 
 | ||||
|     /* | ||||
|      * Group #3 for Assignment #1 in class 'id01' | ||||
|      * => Assigned to do learning path 'id02' | ||||
|      */ | ||||
|     const group03 = em.create(Group, { | ||||
|         assignment: assignments[0], | ||||
|         groupNumber: 3, | ||||
|         members: students.slice(4, 6), | ||||
|     }); | ||||
| 
 | ||||
|     /* | ||||
|      * Group #4 for Assignment #2 in class 'id02' | ||||
|      * => Assigned to do learning path 'id01' | ||||
|      */ | ||||
|     const group04 = em.create(Group, { | ||||
|         assignment: assignments[1], | ||||
|         groupNumber: 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, { | ||||
|         assignment: assignments[3], | ||||
|         groupNumber: 1, | ||||
|  |  | |||
|  | @ -12,7 +12,7 @@ export function makeTestSubmissions(em: EntityManager, students: Student[], grou | |||
|         submissionNumber: 1, | ||||
|         submitter: students[0], | ||||
|         submissionTime: new Date(2025, 2, 20), | ||||
|         onBehalfOf: groups[0], | ||||
|         onBehalfOf: groups[0], // group #1 for Assignment #1 in class 'id01'
 | ||||
|         content: 'sub1', | ||||
|     }); | ||||
| 
 | ||||
|  | @ -23,7 +23,7 @@ export function makeTestSubmissions(em: EntityManager, students: Student[], grou | |||
|         submissionNumber: 2, | ||||
|         submitter: students[0], | ||||
|         submissionTime: new Date(2025, 2, 25), | ||||
|         onBehalfOf: groups[0], | ||||
|         onBehalfOf: groups[0], // group #1 for Assignment #1 in class 'id01'
 | ||||
|         content: '', | ||||
|     }); | ||||
| 
 | ||||
|  | @ -34,7 +34,7 @@ export function makeTestSubmissions(em: EntityManager, students: Student[], grou | |||
|         submissionNumber: 1, | ||||
|         submitter: students[0], | ||||
|         submissionTime: new Date(2025, 2, 20), | ||||
|         onBehalfOf: groups[0], | ||||
|         onBehalfOf: groups[0], // group #1 for Assignment #1 in class 'id01'
 | ||||
|         content: '', | ||||
|     }); | ||||
| 
 | ||||
|  | @ -45,7 +45,7 @@ export function makeTestSubmissions(em: EntityManager, students: Student[], grou | |||
|         submissionNumber: 2, | ||||
|         submitter: students[0], | ||||
|         submissionTime: new Date(2025, 2, 25), | ||||
|         onBehalfOf: groups[0], | ||||
|         onBehalfOf: groups[0], // group #1 for Assignment #1 in class 'id01'
 | ||||
|         content: '', | ||||
|     }); | ||||
| 
 | ||||
|  | @ -56,7 +56,7 @@ export function makeTestSubmissions(em: EntityManager, students: Student[], grou | |||
|         submissionNumber: 1, | ||||
|         submitter: students[1], | ||||
|         submissionTime: new Date(2025, 2, 20), | ||||
|         onBehalfOf: groups[1], | ||||
|         onBehalfOf: groups[1], // Group #2 for Assignment #1 in class 'id01'
 | ||||
|         content: '', | ||||
|     }); | ||||
| 
 | ||||
|  | @ -67,7 +67,7 @@ export function makeTestSubmissions(em: EntityManager, students: Student[], grou | |||
|         submissionNumber: 2, | ||||
|         submitter: students[1], | ||||
|         submissionTime: new Date(2025, 2, 25), | ||||
|         onBehalfOf: groups[4], | ||||
|         onBehalfOf: groups[4], // Group #5 for Assignment #4 in class 'id01'
 | ||||
|         content: '', | ||||
|     }); | ||||
| 
 | ||||
|  | @ -78,9 +78,20 @@ export function makeTestSubmissions(em: EntityManager, students: Student[], grou | |||
|         submissionNumber: 3, | ||||
|         submitter: students[3], | ||||
|         submissionTime: new Date(2025, 3, 25), | ||||
|         onBehalfOf: groups[3], | ||||
|         onBehalfOf: groups[3], // Group #4 for Assignment #2 in class 'id02'
 | ||||
|         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
	
	 Gerald Schmittinger
						Gerald Schmittinger