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.

This commit is contained in:
Torsten Schulz (local)
2026-02-06 07:44:49 +01:00
parent 971da3e57c
commit a60c6d173c

View File

@@ -3793,6 +3793,37 @@ class FalukantService extends BaseService {
return Math.round(cfg.min + (cfg.max - cfg.min) * p); 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) { async sendToSchool(hashedUserId, item, student, studentId) {
const falukantUser = await getFalukantUserOrFail(hashedUserId); const falukantUser = await getFalukantUserOrFail(hashedUserId);
@@ -3812,11 +3843,14 @@ class FalukantService extends BaseService {
let percent; let percent;
if (item === 'all') { if (item === 'all') {
const all = await this.getKnowledgeForAll(hashedUserId, student, studentId); const all = await this.getKnowledgeForAll(hashedUserId, student, studentId);
const sum = all.reduce((s, k) => s + k.knowledge, 0); if (!all.length) percent = 0;
percent = sum / all.length; else {
const sum = all.reduce((s, k) => s + (k.knowledge || 0), 0);
percent = sum / all.length;
}
} else { } else {
const single = await this.getKnowledgeSingle(hashedUserId, student, studentId, item); const single = await this.getKnowledgeSingle(hashedUserId, student, studentId, item);
percent = single.knowledge; percent = single.knowledge ?? 0;
} }
// 4) Kosten berechnen // 4) Kosten berechnen