fix(frontend): Frontend kan nu omgaan met foutieve leerpaden

- Geen of meerdere startnodes
- Transities naar een leerobject dat niet voorkomt
- Transities naar een leerobject dat meer dan één keer voorkomt.
This commit is contained in:
Gerald Schmittinger 2025-04-02 10:03:54 +02:00
parent bb359b6c48
commit a047558f95
2 changed files with 19 additions and 18 deletions

View file

@ -34,24 +34,21 @@ export class LearningPathNode {
version: dto.version, version: dto.version,
language: dto.language, language: dto.language,
transitions: dto.transitions.map((transDto) => { transitions: dto.transitions.map((transDto) => {
const nextNodeDto = otherNodes.filter( const nextNodeDto = otherNodes.find(
(it) => (it) =>
it.learningobject_hruid === transDto.next.hruid && it.learningobject_hruid === transDto.next.hruid &&
it.language === transDto.next.language && it.language === transDto.next.language &&
it.version === transDto.next.version, it.version === transDto.next.version,
); );
if (nextNodeDto.length !== 1) { if (nextNodeDto) {
throw new Error( return {
`Invalid learning path! There is a transition to node` + next: LearningPathNode.fromDTOAndOtherNodes(nextNodeDto, otherNodes),
`${transDto.next.hruid}/${transDto.next.language}/${transDto.next.version}, but there are` + default: transDto.default,
`${nextNodeDto.length} such nodes.`, };
); } else {
return undefined
} }
return { }).filter(it => it !== undefined),
next: LearningPathNode.fromDTOAndOtherNodes(nextNodeDto[0], otherNodes),
default: transDto.default,
};
}),
createdAt: new Date(dto.created_at), createdAt: new Date(dto.created_at),
updatedAt: new Date(dto.updatedAt), updatedAt: new Date(dto.updatedAt),
done: dto.done, done: dto.done,

View file

@ -72,11 +72,6 @@ export class LearningPath {
} }
static fromDTO(dto: LearningPathDTO): LearningPath { static fromDTO(dto: LearningPathDTO): LearningPath {
const startNodeDto = dto.nodes.filter((it) => it.start_node === true);
if (startNodeDto.length !== 1) {
throw new Error(`Invalid learning path: ${dto.hruid}/${dto.language}!
Expected precisely one start node, but there were ${startNodeDto.length}.`);
}
return new LearningPath({ return new LearningPath({
language: dto.language, language: dto.language,
hruid: dto.hruid, hruid: dto.hruid,
@ -86,8 +81,17 @@ export class LearningPath {
amountOfNodesLeft: dto.num_nodes_left, amountOfNodesLeft: dto.num_nodes_left,
keywords: dto.keywords.split(" "), keywords: dto.keywords.split(" "),
targetAges: { min: dto.min_age, max: dto.max_age }, targetAges: { min: dto.min_age, max: dto.max_age },
startNode: LearningPathNode.fromDTOAndOtherNodes(startNodeDto[0], dto.nodes), startNode: LearningPathNode.fromDTOAndOtherNodes(LearningPath.getStartNode(dto), dto.nodes),
image: dto.image, image: dto.image,
}); });
} }
static getStartNode(dto: LearningPathDTO): LearningPathNodeDTO {
const startNodeDtos = dto.nodes.filter((it) => it.start_node === true);
if (startNodeDtos.length < 1) { // The learning path has no starting node -> use the first node.
return dto.nodes[0];
} else { // The learning path has 1 or more starting nodes -> use the first start node.
return startNodeDtos[0];
}
}
} }