From 06895d67208a8e5a92127967e5252283b0705bb2 Mon Sep 17 00:00:00 2001 From: Hamza-Ayed Date: Wed, 19 Aug 2026 16:44:59 +0300 Subject: [PATCH] fix(roads): replace ON CONFLICT with delete and insert for bulletproof candidate approval --- apps/api/src/maps/road-refinement.controller.ts | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/apps/api/src/maps/road-refinement.controller.ts b/apps/api/src/maps/road-refinement.controller.ts index 538d8e8..0161315 100644 --- a/apps/api/src/maps/road-refinement.controller.ts +++ b/apps/api/src/maps/road-refinement.controller.ts @@ -227,19 +227,15 @@ export class RoadRefinementController { CREATE UNIQUE INDEX IF NOT EXISTS approved_roads_cand_uidx ON approved_roads(candidate_id) WHERE candidate_id IS NOT NULL; `); - // 2. Direct insert/upsert into approved_roads immediately + // 2. Direct insert into approved_roads immediately (Delete existing first to ensure idempotency) await this.dataSource.query(` + DELETE FROM approved_roads WHERE candidate_id = $1::uuid; INSERT INTO approved_roads ( candidate_id, geometry, name, highway, confidence, "uniqueDriverCount", oneway, approved_at ) SELECT id, geometry::geometry, COALESCE(name, 'Unnamed Road'), COALESCE(highway, 'residential'), confidence, "uniqueDriverCount", COALESCE(oneway, 0), NOW() - FROM candidate_roads WHERE id = $1 - ON CONFLICT (candidate_id) DO UPDATE SET - geometry = EXCLUDED.geometry, - name = EXCLUDED.name, - highway = EXCLUDED.highway, - confidence = EXCLUDED.confidence; + FROM candidate_roads WHERE id = $1::uuid; `, [id]); // 3. Mark candidate as approved