port-nimara-client-portal/server/api/admin/duplicates/find.ts

71 lines
2.2 KiB
TypeScript

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'
};
}
});