Deduplicate performance snapshots: one row per platform per day

Added snapshot_date column with unique constraint on (platform_id,
snapshot_date). Worker now upserts instead of inserting, so repeated
scrapes on the same day update the existing row rather than creating
duplicates that cause inflated chart values. Cleaned up existing
duplicate rows in migration.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-23 15:13:48 -04:00
parent d1a26269bc
commit 3e5185e725
4 changed files with 20 additions and 5 deletions

View File

@@ -113,11 +113,13 @@ async function persistPerformanceSnapshot(snapshot: any): Promise<void> {
if (!db) return;
try {
const snapshotDate = snapshot.capturedAt.split('T')[0];
await db`
INSERT INTO performance_snapshots (platform_id, captured_at, period_label, views_search, views_listing, conversion_rate, bookings_count, occupancy_rate, avg_daily_rate, revenue_total, raw_json)
INSERT INTO performance_snapshots (platform_id, captured_at, snapshot_date, period_label, views_search, views_listing, conversion_rate, bookings_count, occupancy_rate, avg_daily_rate, revenue_total, raw_json)
VALUES (
${snapshot.platformId},
${snapshot.capturedAt},
${snapshotDate},
${snapshot.periodLabel},
${snapshot.viewsSearch},
${snapshot.viewsListing},
@@ -128,6 +130,16 @@ async function persistPerformanceSnapshot(snapshot: any): Promise<void> {
${snapshot.revenueTotal},
${JSON.stringify(snapshot.rawJson)}
)
ON CONFLICT (platform_id, snapshot_date) DO UPDATE SET
captured_at = EXCLUDED.captured_at,
views_search = EXCLUDED.views_search,
views_listing = EXCLUDED.views_listing,
conversion_rate = EXCLUDED.conversion_rate,
bookings_count = EXCLUDED.bookings_count,
occupancy_rate = EXCLUDED.occupancy_rate,
avg_daily_rate = EXCLUDED.avg_daily_rate,
revenue_total = EXCLUDED.revenue_total,
raw_json = EXCLUDED.raw_json
`;
} catch (err) {
console.error('[worker] Failed to persist performance snapshot:', err);