fix(entry-point-discovery): Self-healing duplicate detection
When resolving platform_dispensary_id, check if it already exists on another dispensary. If so, mark current dispensary as duplicate instead of failing with unique constraint violation. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -501,6 +501,35 @@ async function updateDispensaryWithPlatformId(
|
|||||||
source: string,
|
source: string,
|
||||||
slug: string
|
slug: string
|
||||||
): Promise<void> {
|
): Promise<void> {
|
||||||
|
// Self-healing: Check if platform_dispensary_id already exists on another dispensary
|
||||||
|
const existingResult = await pool.query(`
|
||||||
|
SELECT id, name FROM dispensaries
|
||||||
|
WHERE platform_dispensary_id = $1 AND id != $2
|
||||||
|
`, [platformId, dispensaryId]);
|
||||||
|
|
||||||
|
if (existingResult.rows.length > 0) {
|
||||||
|
const existing = existingResult.rows[0];
|
||||||
|
console.log(`[EntryPointDiscovery] Platform ID ${platformId} already exists on dispensary ${existing.id} (${existing.name})`);
|
||||||
|
console.log(`[EntryPointDiscovery] Marking dispensary ${dispensaryId} as duplicate of ${existing.id}`);
|
||||||
|
|
||||||
|
// Mark current dispensary as duplicate and disable it
|
||||||
|
await pool.query(`
|
||||||
|
UPDATE dispensaries
|
||||||
|
SET
|
||||||
|
id_resolution_status = 'duplicate',
|
||||||
|
id_resolution_error = $2,
|
||||||
|
crawl_enabled = false,
|
||||||
|
stage = 'duplicate',
|
||||||
|
updated_at = NOW(),
|
||||||
|
last_modified_at = NOW(),
|
||||||
|
last_modified_by_task = $3,
|
||||||
|
last_modified_task_id = $4
|
||||||
|
WHERE id = $1
|
||||||
|
`, [dispensaryId, `Duplicate of dispensary ${existing.id} (${existing.name})`, task.role, task.id]);
|
||||||
|
|
||||||
|
return; // Don't queue product_discovery for duplicates
|
||||||
|
}
|
||||||
|
|
||||||
// Update dispensary with platform ID and stage checkpoint
|
// Update dispensary with platform ID and stage checkpoint
|
||||||
// Stage transitions: discovered/validated → promoted (ready for crawling)
|
// Stage transitions: discovered/validated → promoted (ready for crawling)
|
||||||
await pool.query(`
|
await pool.query(`
|
||||||
|
|||||||
Reference in New Issue
Block a user