Refactor VocabService to improve boolean parameter handling and enhance debugging

- Updated VocabService to convert string parameters for course retrieval into booleans, ensuring accurate filtering based on user input.
- Added detailed debug logging to track the state of query conditions and the final WHERE clause, aiding in troubleshooting and performance analysis.
- Improved comments for clarity on the logic and implications of the changes made.
This commit is contained in:
Torsten Schulz (local)
2026-01-19 13:52:27 +01:00
parent a7a0daaf82
commit 89ec084106

View File

@@ -563,20 +563,24 @@ export default class VocabService {
async getCourses(hashedUserId, { includePublic = true, includeOwn = true, languageId, nativeLanguageId, search } = {}) { async getCourses(hashedUserId, { includePublic = true, includeOwn = true, languageId, nativeLanguageId, search } = {}) {
const user = await this._getUserByHashedId(hashedUserId); const user = await this._getUserByHashedId(hashedUserId);
// Konvertiere String-Parameter zu Booleans
const includePublicBool = includePublic === 'true' || includePublic === true;
const includeOwnBool = includeOwn === 'true' || includeOwn === true;
const where = {}; const where = {};
const andConditions = []; const andConditions = [];
// Zugriffsbedingungen // Zugriffsbedingungen
if (includeOwn && includePublic) { if (includeOwnBool && includePublicBool) {
andConditions.push({ andConditions.push({
[Op.or]: [ [Op.or]: [
{ ownerUserId: user.id }, { ownerUserId: user.id },
{ isPublic: true } { isPublic: true }
] ]
}); });
} else if (includeOwn) { } else if (includeOwnBool) {
where.ownerUserId = user.id; where.ownerUserId = user.id;
} else if (includePublic) { } else if (includePublicBool) {
where.isPublic = true; where.isPublic = true;
} }
@@ -608,9 +612,19 @@ export default class VocabService {
// Kombiniere alle AND-Bedingungen // Kombiniere alle AND-Bedingungen
// Wenn sowohl andConditions als auch direkte where-Eigenschaften existieren, // Wenn sowohl andConditions als auch direkte where-Eigenschaften existieren,
// müssen sie kombiniert werden // müssen sie kombiniert werden
const directWhereProps = Object.keys(where).filter(key => key !== Op.and && key !== Op.or);
// Debug: Prüfe, ob direkte Eigenschaften gesetzt wurden
console.log(`[getCourses] Debug - Vor Kombination:`, {
directWhereProps,
whereKeys: Object.keys(where),
andConditionsLength: andConditions.length,
languageId,
nativeLanguageId
});
if (andConditions.length > 0) { if (andConditions.length > 0) {
// Wenn where bereits direkte Eigenschaften hat, füge sie zu andConditions hinzu // Wenn where bereits direkte Eigenschaften hat, füge sie zu andConditions hinzu
const directWhereProps = Object.keys(where).filter(key => key !== Op.and && key !== Op.or);
if (directWhereProps.length > 0) { if (directWhereProps.length > 0) {
const directWhere = {}; const directWhere = {};
for (const key of directWhereProps) { for (const key of directWhereProps) {
@@ -618,9 +632,15 @@ export default class VocabService {
delete where[key]; delete where[key];
} }
andConditions.push(directWhere); andConditions.push(directWhere);
console.log(`[getCourses] Debug - Direkte Eigenschaften zu andConditions hinzugefügt:`, directWhere);
} }
where[Op.and] = andConditions; where[Op.and] = andConditions;
console.log(`[getCourses] Debug - Finale andConditions:`, JSON.stringify(andConditions, null, 2));
} }
// Wenn nur direkte Eigenschaften existieren (undConditions.length === 0),
// bleiben sie in where (nichts zu tun, sie sind bereits dort)
console.log(`[getCourses] Debug - Finale WHERE-Klausel:`, JSON.stringify(where, null, 2));
const courses = await VocabCourse.findAll({ const courses = await VocabCourse.findAll({
where, where,
@@ -633,9 +653,12 @@ export default class VocabService {
languageId, languageId,
nativeLanguageId, nativeLanguageId,
search, search,
where: JSON.stringify(where, null, 2), whereBefore: JSON.stringify(where, null, 2),
includePublic, includePublic: includePublicBool,
includeOwn includeOwn: includeOwnBool,
andConditionsLength: andConditions.length,
directWherePropsBefore: Object.keys(where).filter(key => key !== Op.and && key !== Op.or),
whereAfter: JSON.stringify(where, null, 2)
}); });
const coursesData = courses.map(c => c.get({ plain: true })); const coursesData = courses.map(c => c.get({ plain: true }));