Add counter award type support and debug logging

- Handle 'counter' type awards that count unique callsigns
- Add debug logging to track QSO filtering progress
- Normalize counter awards to use entityType: 'callsign'

This fixes RS-44 satellite award to count unique callsigns worked
via RS-44 satellite.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-16 09:00:59 +01:00
parent 111d6d5dd4
commit b3567100c0

View File

@@ -74,6 +74,17 @@ function normalizeAwardRules(rules) {
}; };
} }
// Handle "counter" type awards (like RS-44)
// These count unique callsigns instead of entities
if (rules.type === 'counter') {
return {
type: 'entity',
entityType: rules.countBy === 'qso' ? 'callsign' : 'callsign',
target: rules.target,
filters: rules.filters,
};
}
return rules; return rules;
} }
@@ -88,16 +99,27 @@ export async function calculateAwardProgress(userId, award) {
// Normalize rules to handle different formats // Normalize rules to handle different formats
rules = normalizeAwardRules(rules); rules = normalizeAwardRules(rules);
logger.debug('Calculating award progress', {
userId,
awardId: award.id,
awardType: rules.type,
entityType: rules.entityType,
hasFilters: !!rules.filters,
});
// Get all QSOs for user // Get all QSOs for user
const allQSOs = await db const allQSOs = await db
.select() .select()
.from(qsos) .from(qsos)
.where(eq(qsos.userId, userId)); .where(eq(qsos.userId, userId));
logger.debug('Total QSOs for user', { count: allQSOs.length });
// Apply filters if defined // Apply filters if defined
let filteredQSOs = allQSOs; let filteredQSOs = allQSOs;
if (rules.filters) { if (rules.filters) {
filteredQSOs = applyFilters(allQSOs, rules.filters); filteredQSOs = applyFilters(allQSOs, rules.filters);
logger.debug('QSOs after filters', { count: filteredQSOs.length });
} }
// Calculate worked and confirmed entities // Calculate worked and confirmed entities