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

85 lines
2.3 KiB
TypeScript

import { requireAdmin } from '~/server/utils/auth';
import { getNocoDbConfiguration, updateInterest, deleteInterest } from '~/server/utils/nocodb';
export default defineEventHandler(async (event) => {
console.log('[ADMIN] Merge duplicates request');
try {
// Require admin authentication
await requireAdmin(event);
const body = await readBody(event);
const { masterId, duplicateIds, mergeData } = body;
if (!masterId || !duplicateIds || !Array.isArray(duplicateIds)) {
throw createError({
statusCode: 400,
statusMessage: 'Invalid merge request: masterId and duplicateIds array required'
});
}
console.log('[ADMIN] Merging duplicates:', {
masterId,
duplicateIds,
fieldsToMerge: Object.keys(mergeData || {})
});
// Update the master record with merged data
if (mergeData && Object.keys(mergeData).length > 0) {
console.log('[ADMIN] Updating master record with merged data');
await updateInterest(masterId.toString(), mergeData);
}
// Delete the duplicate records
const deletionResults = [];
for (const duplicateId of duplicateIds) {
try {
console.log('[ADMIN] Deleting duplicate record:', duplicateId);
await deleteInterest(duplicateId.toString());
deletionResults.push({ id: duplicateId, success: true });
} catch (error: any) {
console.error('[ADMIN] Failed to delete duplicate:', duplicateId, error);
deletionResults.push({
id: duplicateId,
success: false,
error: error.message
});
}
}
console.log('[ADMIN] Merge operation completed');
return {
success: true,
data: {
masterId,
mergedCount: duplicateIds.length,
deletionResults,
updatedFields: Object.keys(mergeData || {})
}
};
} catch (error: any) {
console.error('[ADMIN] Failed to merge duplicates:', error);
if (error.statusCode === 403) {
return {
success: false,
error: 'Insufficient permissions. Admin access required.'
};
}
if (error.statusCode === 400) {
return {
success: false,
error: error.statusMessage
};
}
return {
success: false,
error: 'Failed to merge duplicate records'
};
}
});