diff --git a/backend/src/data/assignments/assignment-repository.ts b/backend/src/data/assignments/assignment-repository.ts index 2645de1e..8b9ebe22 100644 --- a/backend/src/data/assignments/assignment-repository.ts +++ b/backend/src/data/assignments/assignment-repository.ts @@ -4,10 +4,10 @@ import { Class } from '../../entities/classes/class.entity.js'; export class AssignmentRepository extends DwengoEntityRepository { public async findByClassAndId(within: Class, id: number): Promise { - return this.findOne({ within: within, id: id }, { populate: [ "groups" ]}); + return this.findOne({ within: within, id: id }, { populate: [ "groups", "groups.members" ]}); } public async findAllAssignmentsInClass(within: Class): Promise { - return this.findAll({ where: { within: within }, populate: [ "groups" ] }); + return this.findAll({ where: { within: within }, populate: [ "groups", "groups.members" ] }); } public async deleteByClassAndId(within: Class, id: number): Promise { return this.deleteWhere({ within: within, id: id }); diff --git a/backend/src/interfaces/assignment.ts b/backend/src/interfaces/assignment.ts index 510635ab..2df9d8bd 100644 --- a/backend/src/interfaces/assignment.ts +++ b/backend/src/interfaces/assignment.ts @@ -3,22 +3,17 @@ import { FALLBACK_LANG } from '../config.js'; import { Assignment } from '../entities/assignments/assignment.entity.js'; import { Class } from '../entities/classes/class.entity.js'; import { getLogger } from '../logging/initalize.js'; -import { AssignmentDTO } from '@dwengo-1/common/interfaces/assignment'; +import { AssignmentDTO, AssignmentDTOId } from '@dwengo-1/common/interfaces/assignment'; import { mapToGroupDTO, mapToGroupDTOId } from './group.js'; import { getAssignmentHandler } from '../controllers/assignments.js'; import { getAssignmentRepository, getClassRepository } from '../data/repositories.js'; -export function mapToAssignmentDTOId(assignment: Assignment): AssignmentDTO { - return { - id: assignment.id!, - within: assignment.within.classId!, - title: assignment.title, - description: assignment.description, - learningPath: assignment.learningPathHruid, - language: assignment.learningPathLanguage, - groups: assignment.groups.map(group => mapToGroupDTOId(group, assignment.within)), - }; -} +export function mapToAssignmentDTOId(assignment: Assignment): AssignmentDTOId { + return { + id: assignment.id!, + within: assignment.within.classId!, + }; + } export function mapToAssignmentDTO(assignment: Assignment): AssignmentDTO { return { diff --git a/backend/src/interfaces/group.ts b/backend/src/interfaces/group.ts index 9fd753e8..08a2adfc 100644 --- a/backend/src/interfaces/group.ts +++ b/backend/src/interfaces/group.ts @@ -3,22 +3,25 @@ import { Class } from '../entities/classes/class.entity.js'; import {mapToAssignmentDTOId} from './assignment.js'; import { mapToClassDTO } from './class.js'; import { mapToStudentDTO } from './student.js'; -import { GroupDTO } from '@dwengo-1/common/interfaces/group'; +import { GroupDTO, GroupDTOId } from '@dwengo-1/common/interfaces/group'; -export function mapToGroupDTO(group: Group, cls: Class): GroupDTO { - return { - class: mapToClassDTO(cls), - assignment: mapToAssignmentDTOId(group.assignment), - groupNumber: group.groupNumber!, - members: group.members.map(mapToStudentDTO), - }; -} - -export function mapToGroupDTOId(group: Group, cls: Class): GroupDTO { +export function mapToGroupDTO(group: Group, cls: Class, options?: { expandStudents: boolean }): GroupDTO { + return { + class: cls.classId!, + assignment: group.assignment.id!, + groupNumber: group.groupNumber!, + members: + options?.expandStudents + ? group.members.map(mapToStudentDTO) + : group.members.map((student) => student.username) + + }; +} + +export function mapToGroupDTOId(group: Group, cls: Class): GroupDTOId { return { class: cls.classId!, assignment: group.assignment.id!, groupNumber: group.groupNumber!, - members: group.members.map((member) => member.username), }; } diff --git a/backend/src/services/assignments.ts b/backend/src/services/assignments.ts index dfc81357..2e0d7b6d 100644 --- a/backend/src/services/assignments.ts +++ b/backend/src/services/assignments.ts @@ -1,4 +1,4 @@ -import { AssignmentDTO } from '@dwengo-1/common/interfaces/assignment'; +import { AssignmentDTO, AssignmentDTOId } from '@dwengo-1/common/interfaces/assignment'; import { getAssignmentRepository, getClassRepository, @@ -21,6 +21,9 @@ import { getLogger } from '../logging/initalize.js'; import { languageMap } from '@dwengo-1/common/util/language'; import { createGroup } from './groups.js'; import { GroupDTO } from 'dwengo-1-common/interfaces/group'; +import { fetchStudent } from './students.js'; +import { assert } from 'console'; +import { ServerErrorException } from '../exceptions/server-error-exception.js'; export async function fetchAssignment(classid: string, assignmentNumber: number): Promise { const classRepository = getClassRepository(); @@ -40,7 +43,7 @@ export async function fetchAssignment(classid: string, assignmentNumber: number) return assignment; } -export async function getAllAssignments(classid: string, full: boolean): Promise { +export async function getAllAssignments(classid: string, full: boolean): Promise { const cls = await fetchClass(classid); const assignmentRepository = getAssignmentRepository(); @@ -60,26 +63,32 @@ export async function createAssignment(classid: string, assignmentData: Assignme const assignment = mapToAssignment(assignmentData, cls); await assignmentRepository.save(assignment); - /* + if (assignmentData.groups) { + /* + For some reason when trying to add groups, it does not work when using the original assignment variable. + The assignment needs to be refetched in order for it to work. + */ + const assignmentCopy = await assignmentRepository.findByClassAndId(cls, assignment.id!); + + if (assignmentCopy === null) { + throw new ServerErrorException("Something has gone horribly wrong. Could not find newly added assignment which is needed to add groups."); + } + const groupRepository = getGroupRepository(); - const studentRepository = getStudentRepository(); (assignmentData.groups as string[][]).forEach(async (memberUsernames) => { - const members = (await Promise.all(memberUsernames.map(async (id) => studentRepository.findByUsername(id)))).filter( + const members = (await Promise.all(memberUsernames.map(async (id) => fetchStudent(id)))).filter( (student) => student !== null ); const newGroup = groupRepository.create({ - assignment: assignment, + assignment: assignmentCopy!, members: members, }); await groupRepository.save(newGroup); - console.log('NEW GROUP'); - console.log(newGroup); }); } - */ return mapToAssignmentDTO(assignment); } diff --git a/backend/src/services/groups.ts b/backend/src/services/groups.ts index ec152da4..5fceb67f 100644 --- a/backend/src/services/groups.ts +++ b/backend/src/services/groups.ts @@ -3,7 +3,7 @@ import { getGroupRepository, getStudentRepository, getSubmissionRepository } fro import { Group } from '../entities/assignments/group.entity.js'; import { mapToGroupDTO, mapToGroupDTOId } from '../interfaces/group.js'; import { mapToSubmissionDTO, mapToSubmissionDTOId } from '../interfaces/submission.js'; -import { GroupDTO } from '@dwengo-1/common/interfaces/group'; +import { GroupDTO, GroupDTOId } from '@dwengo-1/common/interfaces/group'; import { SubmissionDTO, SubmissionDTOId } from '@dwengo-1/common/interfaces/submission'; import { fetchAssignment } from './assignments.js'; import { NotFoundException } from '../exceptions/not-found-exception.js'; @@ -77,16 +77,12 @@ export async function createGroup(groupData: GroupDTO, classid: string, assignme members: members }); - try { - await groupRepository.save(newGroup); - } catch(e) { - console.log(e); - } + await groupRepository.save(newGroup); return mapToGroupDTO(newGroup, newGroup.assignment.within); } -export async function getAllGroups(classId: string, assignmentNumber: number, full: boolean): Promise { +export async function getAllGroups(classId: string, assignmentNumber: number, full: boolean): Promise { const assignment = await fetchAssignment(classId, assignmentNumber); const groupRepository = getGroupRepository(); diff --git a/backend/src/services/students.ts b/backend/src/services/students.ts index 121b382e..a585a85e 100644 --- a/backend/src/services/students.ts +++ b/backend/src/services/students.ts @@ -18,8 +18,8 @@ import { NotFoundException } from '../exceptions/not-found-exception.js'; import { fetchClass } from './classes.js'; import { StudentDTO } from '@dwengo-1/common/interfaces/student'; import { ClassDTO } from '@dwengo-1/common/interfaces/class'; -import { AssignmentDTO } from '@dwengo-1/common/interfaces/assignment'; -import { GroupDTO } from '@dwengo-1/common/interfaces/group'; +import { AssignmentDTO, AssignmentDTOId } from '@dwengo-1/common/interfaces/assignment'; +import { GroupDTO, GroupDTOId } from '@dwengo-1/common/interfaces/group'; import { SubmissionDTO, SubmissionDTOId } from '@dwengo-1/common/interfaces/submission'; import { QuestionDTO, QuestionId } from '@dwengo-1/common/interfaces/question'; import { ClassJoinRequestDTO } from '@dwengo-1/common/interfaces/class-join-request'; @@ -82,7 +82,7 @@ export async function getStudentClasses(username: string, full: boolean): Promis return classes.map((cls) => cls.classId!); } -export async function getStudentAssignments(username: string, full: boolean): Promise { +export async function getStudentAssignments(username: string, full: boolean): Promise { const student = await fetchStudent(username); const classRepository = getClassRepository(); @@ -91,7 +91,7 @@ export async function getStudentAssignments(username: string, full: boolean): Pr return (await Promise.all(classes.map(async (cls) => await getAllAssignments(cls.classId!, full)))).flat(); } -export async function getStudentGroups(username: string, full: boolean): Promise { +export async function getStudentGroups(username: string, full: boolean): Promise { const student = await fetchStudent(username); const groupRepository = getGroupRepository(); diff --git a/frontend/src/controllers/assignments.ts b/frontend/src/controllers/assignments.ts index a66f8e84..0d46e311 100644 --- a/frontend/src/controllers/assignments.ts +++ b/frontend/src/controllers/assignments.ts @@ -1,11 +1,11 @@ import { BaseController } from "./base-controller"; -import type { AssignmentDTO } from "@dwengo-1/common/interfaces/assignment"; +import type { AssignmentDTO, AssignmentDTOId } from "@dwengo-1/common/interfaces/assignment"; import type { SubmissionsResponse } from "./submissions"; import type { QuestionsResponse } from "./questions"; import type { GroupsResponse } from "./groups"; export interface AssignmentsResponse { - assignments: AssignmentDTO[] | string[]; + assignments: AssignmentDTO[] | AssignmentDTOId[]; } export interface AssignmentResponse { diff --git a/frontend/src/controllers/groups.ts b/frontend/src/controllers/groups.ts index de6592b5..70359eb6 100644 --- a/frontend/src/controllers/groups.ts +++ b/frontend/src/controllers/groups.ts @@ -1,10 +1,10 @@ import { BaseController } from "./base-controller"; -import type { GroupDTO } from "@dwengo-1/common/interfaces/group"; +import type { GroupDTO, GroupDTOId } from "@dwengo-1/common/interfaces/group"; import type { SubmissionsResponse } from "./submissions"; import type { QuestionsResponse } from "./questions"; export interface GroupsResponse { - groups: GroupDTO[]; + groups: GroupDTO[] | GroupDTOId[]; } export interface GroupResponse {