From a60c6d173c611062f6bd7ddf7302eba279119aad Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Fri, 6 Feb 2026 07:44:49 +0100 Subject: [PATCH] Add knowledge retrieval methods in FalukantService: Implemented _resolveLearningCharacterId to determine character IDs based on user input, and added getKnowledgeSingle and getKnowledgeForAll methods to fetch knowledge data for specific characters. Enhanced error handling for missing character IDs and improved knowledge aggregation logic. --- backend/services/falukantService.js | 40 ++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/backend/services/falukantService.js b/backend/services/falukantService.js index 4166b35..52a5fc9 100644 --- a/backend/services/falukantService.js +++ b/backend/services/falukantService.js @@ -3793,6 +3793,37 @@ class FalukantService extends BaseService { return Math.round(cfg.min + (cfg.max - cfg.min) * p); } + /** Resolve character id for education: self = user's character, children/director = studentId */ + async _resolveLearningCharacterId(hashedUserId, student, studentId) { + if (student === 'self') { + const user = await getFalukantUserOrFail(hashedUserId); + const char = await FalukantCharacter.findOne({ where: { userId: user.id }, attributes: ['id'] }); + return char?.id ?? null; + } + return studentId ?? null; + } + + async getKnowledgeSingle(hashedUserId, student, studentId, productId) { + const characterId = await this._resolveLearningCharacterId(hashedUserId, student, studentId); + if (!characterId) throw new Error('Character not found'); + const row = await Knowledge.findOne({ + where: { characterId, productId }, + attributes: ['knowledge'] + }); + return { knowledge: row?.knowledge ?? 0 }; + } + + async getKnowledgeForAll(hashedUserId, student, studentId) { + const characterId = await this._resolveLearningCharacterId(hashedUserId, student, studentId); + if (!characterId) throw new Error('Character not found'); + const [products, knowledges] = await Promise.all([ + ProductType.findAll({ attributes: ['id'] }), + Knowledge.findAll({ where: { characterId }, attributes: ['productId', 'knowledge'] }) + ]); + const knowledgeMap = new Map((knowledges || []).map(k => [k.productId, k.knowledge ?? 0])); + return products.map(p => ({ productId: p.id, knowledge: knowledgeMap.get(p.id) ?? 0 })); + } + async sendToSchool(hashedUserId, item, student, studentId) { const falukantUser = await getFalukantUserOrFail(hashedUserId); @@ -3812,11 +3843,14 @@ class FalukantService extends BaseService { let percent; if (item === 'all') { const all = await this.getKnowledgeForAll(hashedUserId, student, studentId); - const sum = all.reduce((s, k) => s + k.knowledge, 0); - percent = sum / all.length; + if (!all.length) percent = 0; + else { + const sum = all.reduce((s, k) => s + (k.knowledge || 0), 0); + percent = sum / all.length; + } } else { const single = await this.getKnowledgeSingle(hashedUserId, student, studentId, item); - percent = single.knowledge; + percent = single.knowledge ?? 0; } // 4) Kosten berechnen