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: {
|
*/
|
||||||
|
public async findAllSubmissionsForLearningObjectAndAssignment(
|
||||||
|
loId: LearningObjectIdentifier,
|
||||||
|
assignment: Assignment,
|
||||||
|
forStudentUsername?: string
|
||||||
|
): Promise<Submission[]> {
|
||||||
|
let onBehalfOf = forStudentUsername ? {
|
||||||
|
assignment,
|
||||||
members: {
|
members: {
|
||||||
$some: {
|
$some: {
|
||||||
username: studentUsername
|
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];
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue