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:
@@ -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);
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user