@@ -37,6 +37,48 @@ const websiteCache = createDrizzleCache({ redis, namespace: "websites" });
3737const CACHE_DURATION = 60 ; // seconds
3838const TREND_THRESHOLD = 5 ; // percentage
3939
40+ type EventsCheckResult = {
41+ hasEvents : boolean ;
42+ error : string | null ;
43+ } ;
44+
45+ async function getTrackingEventsStatus (
46+ websiteId : string
47+ ) : Promise < EventsCheckResult > {
48+ try {
49+ const trackingCheckResult = await Promise . race ( [
50+ chQuery < { count : number } > (
51+ `SELECT COUNT(*) as count FROM analytics.events WHERE client_id = {websiteId:String} AND event_name = 'screen_view' LIMIT 1` ,
52+ { websiteId }
53+ ) ,
54+ new Promise < never > ( ( _ , reject ) =>
55+ setTimeout ( ( ) => reject ( new Error ( "ClickHouse query timeout" ) ) , 10_000 )
56+ ) ,
57+ ] ) ;
58+
59+ return {
60+ hasEvents : ( trackingCheckResult [ 0 ] ?. count ?? 0 ) > 0 ,
61+ error : null ,
62+ } ;
63+ } catch ( error ) {
64+ const message =
65+ error instanceof Error ? error . message : "Unknown error checking events" ;
66+ logger . error ( { websiteId } , `Error checking tracking events: ${ message } ` ) ;
67+ return { hasEvents : false , error : message } ;
68+ }
69+ }
70+
71+ const buildStatusMessage = ( hasEvents : boolean , eventsError : string | null ) => {
72+ if ( hasEvents ) {
73+ return "Tracking is active and receiving events." ;
74+ }
75+
76+ if ( eventsError ) {
77+ return `Unable to check events: ${ eventsError } ` ;
78+ }
79+
80+ return "Tracking not set up. Please install the script tag." ;
81+ } ;
4082type ChartDataPoint = {
4183 websiteId : string ;
4284 date : string ;
@@ -593,35 +635,25 @@ export const websitesRouter = {
593635 try {
594636 await authorizeWebsiteAccess ( context , input . websiteId , "read" ) ;
595637
596- let hasTrackingEvents = false ;
597- try {
598- const trackingCheckResult = await Promise . race ( [
599- chQuery < { count : number } > (
600- `SELECT COUNT(*) as count FROM analytics.events WHERE client_id = {websiteId:String} AND event_name = 'screen_view' LIMIT 1` ,
601- { websiteId : input . websiteId }
602- ) ,
603- new Promise < never > ( ( _ , reject ) =>
604- setTimeout (
605- ( ) => reject ( new Error ( "ClickHouse query timeout" ) ) ,
606- 10_000
607- )
608- ) ,
609- ] ) ;
610-
611- hasTrackingEvents = ( trackingCheckResult [ 0 ] ?. count ?? 0 ) > 0 ;
612- } catch ( error ) {
613- logger . error (
614- { websiteId : input . websiteId } ,
615- `Error checking tracking events: ${ error instanceof Error ? error . message : String ( error ) } `
616- ) ;
617- hasTrackingEvents = false ;
618- }
638+ const { hasEvents, error : eventsError } = await getTrackingEventsStatus (
639+ input . websiteId
640+ ) ;
619641
620642 return {
621- tracking_setup : hasTrackingEvents ,
622- integration_type : hasTrackingEvents ? "manual" : null ,
643+ tracking_setup : hasEvents ,
644+ integration_type : hasEvents ? "manual" : null ,
645+ has_events : hasEvents ,
646+ status_message : buildStatusMessage ( hasEvents , eventsError ) ,
623647 } ;
624648 } catch ( error ) {
649+ if ( error instanceof ORPCError ) {
650+ if ( error . code === "NOT_FOUND" ) {
651+ throw new ORPCError ( "NOT_FOUND" , {
652+ message : `Website with ID "${ input . websiteId } " not found. Please verify the website ID is correct.` ,
653+ } ) ;
654+ }
655+ throw error ;
656+ }
625657 logger . error (
626658 { websiteId : input . websiteId } ,
627659 `Error in isTrackingSetup: ${ error instanceof Error ? error . message : String ( error ) } `
0 commit comments