From 3859170d357509561cc605b76b1acaddb0bed7b9 Mon Sep 17 00:00:00 2001 From: R0m1k3 Date: Thu, 12 Feb 2026 11:01:43 +0100 Subject: [PATCH] fix(analytics): upsert history one data point per day per page, add gte/lt imports --- server/services/analytics.ts | 45 ++++++++++++++++++++++++++++-------- 1 file changed, 36 insertions(+), 9 deletions(-) diff --git a/server/services/analytics.ts b/server/services/analytics.ts index 627b467..0488a1e 100644 --- a/server/services/analytics.ts +++ b/server/services/analytics.ts @@ -7,7 +7,7 @@ import { socialPages, tokenStatusEnum } from '../../shared/schema'; -import { eq, and, isNotNull, desc } from 'drizzle-orm'; +import { eq, and, isNotNull, desc, gte, lt } from 'drizzle-orm'; import { GraphAPIClient } from '../utils/graph_client'; import { TokenManager } from './token_manager'; @@ -232,16 +232,43 @@ export class AnalyticsService { }) .where(eq(socialPages.id, pageId)); - // 4. Insert History snapshot - await db.insert(pageAnalyticsHistory).values({ - pageId, - date: new Date(), - followersCount: followers, - pageReach, - pageViews, - pageEngagement, + // 4. Upsert History snapshot — one entry per day per page + const today = new Date(); + today.setHours(0, 0, 0, 0); + const tomorrow = new Date(today); + tomorrow.setDate(tomorrow.getDate() + 1); + + const existingEntry = await db.query.pageAnalyticsHistory.findFirst({ + where: and( + eq(pageAnalyticsHistory.pageId, pageId), + gte(pageAnalyticsHistory.date, today), + lt(pageAnalyticsHistory.date, tomorrow) + ) }); + if (existingEntry) { + // Update today's existing entry with latest values + await db.update(pageAnalyticsHistory) + .set({ + followersCount: followers, + pageReach, + pageViews, + pageEngagement, + date: new Date(), + }) + .where(eq(pageAnalyticsHistory.id, existingEntry.id)); + } else { + // Insert new entry for today + await db.insert(pageAnalyticsHistory).values({ + pageId, + date: new Date(), + followersCount: followers, + pageReach, + pageViews, + pageEngagement, + }); + } + console.log(`[AnalyticsService] Synced page ${pageId}: ${followers} followers, ${pageReach} reach, ${pageEngagement} engagement, ${pageViews} views`); }