import { requireAuth, requireSalesOrAdmin } from '~/server/utils/auth'; import { getNocoDbConfiguration } from '~/server/utils/nocodb'; import { findDuplicates, createInterestConfig } from '~/server/utils/duplicate-detection'; export default defineEventHandler(async (event) => { console.log('[ADMIN] Find duplicates request'); try { // Require sales or admin access for duplicate detection await requireSalesOrAdmin(event); const query = getQuery(event); const threshold = query.threshold ? parseFloat(query.threshold as string) : 0.8; // Get all interests from NocoDB const config = getNocoDbConfiguration(); const interestTableId = "mbs9hjauug4eseo"; // Interest table ID from nocodb.ts const response = await $fetch(`${config.url}/api/v2/tables/${interestTableId}/records`, { headers: { 'xc-token': config.token }, params: { limit: 5000 // Get a large batch for duplicate detection } }) as any; const interests = response.list || []; console.log('[ADMIN] Analyzing', interests.length, 'interests for duplicates'); // Find duplicate groups using the new centralized utility const duplicateConfig = createInterestConfig(); const duplicateGroups = findDuplicates(interests, duplicateConfig); // Convert to the expected format const formattedGroups = duplicateGroups.map(group => ({ id: group.id, interests: group.items, matchReason: group.matchReason, confidence: group.confidence, masterCandidate: group.masterCandidate })); console.log('[ADMIN] Found', formattedGroups.length, 'duplicate groups'); return { success: true, data: { duplicateGroups: formattedGroups, totalInterests: interests.length, duplicateCount: formattedGroups.reduce((sum, group) => sum + group.interests.length, 0), threshold } }; } catch (error: any) { console.error('[ADMIN] Failed to find duplicates:', error); if (error.statusCode === 403) { return { success: false, error: 'Insufficient permissions. Admin access required.' }; } return { success: false, error: 'Failed to find duplicates' }; } });