diff --git a/apps/worker/src/jobs/events.create-session-end.ts b/apps/worker/src/jobs/events.create-session-end.ts index 8fa4ca2f..57f0f420 100644 --- a/apps/worker/src/jobs/events.create-session-end.ts +++ b/apps/worker/src/jobs/events.create-session-end.ts @@ -11,6 +11,27 @@ import { import { createLogger } from '@openpanel/logger'; import type { EventsQueuePayloadCreateSessionEnd } from '@openpanel/queue'; +async function getCompleteSession({ + projectId, + sessionId, + hoursInterval, +}: { + projectId: string; + sessionId: string; + hoursInterval: number; +}) { + const sql = ` + SELECT * FROM ${TABLE_NAMES.events} + WHERE + session_id = '${sessionId}' + AND project_id = '${projectId}' + AND created_at > now() - interval ${hoursInterval} HOUR + ORDER BY created_at DESC + `; + + return getEvents(sql); +} + export async function createSessionEnd( job: Job, ) { @@ -26,26 +47,22 @@ export async function createSessionEnd( (item) => item.session_id === payload.sessionId, ); - const sql = ` - SELECT * FROM ${TABLE_NAMES.events} - WHERE - session_id = '${payload.sessionId}' - ${payload.projectId ? `AND project_id = '${payload.projectId}' ` : ''} - AND created_at >= ( - SELECT created_at - FROM ${TABLE_NAMES.events} - WHERE - session_id = '${payload.sessionId}' - AND name = 'session_start' - ${payload.projectId ? `AND project_id = '${payload.projectId}' ` : ''} - AND created_at > now() - interval 24 HOUR - ORDER BY created_at DESC - LIMIT 1 - ) - ORDER BY created_at DESC -`; - job.log(sql); - const eventsInDb = await getEvents(sql); + let eventsInDb = await getCompleteSession({ + projectId: payload.projectId, + sessionId: payload.sessionId, + hoursInterval: 12, + }); + + // If session_start does not exist, try to find it the last 24 hours + if (!eventsInDb.find((event) => event.name === 'session_start')) { + logger.warn('Checking last 24 hours for session_start'); + eventsInDb = await getCompleteSession({ + projectId: payload.projectId, + sessionId: payload.sessionId, + hoursInterval: 24, + }); + } + // sort last inserted first const events = [...eventsInBuffer, ...eventsInDb].sort( (a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime(), diff --git a/apps/worker/src/jobs/events.incoming-event.ts b/apps/worker/src/jobs/events.incoming-event.ts index 19431904..0ec1c515 100644 --- a/apps/worker/src/jobs/events.incoming-event.ts +++ b/apps/worker/src/jobs/events.incoming-event.ts @@ -215,22 +215,26 @@ async function getSessionEnd({ currentDeviceId: string; previousDeviceId: string; }) { - const sessionEndKeys = await getRedisQueue().keys( - `*:sessionEnd:${projectId}:*`, + const currentSessionEndKeys = await getRedisQueue().keys( + `*:sessionEnd:${projectId}:${currentDeviceId}:*`, ); const sessionEndJobCurrentDeviceId = await findJobByPrefix( sessionsQueue, - sessionEndKeys, + currentSessionEndKeys, `sessionEnd:${projectId}:${currentDeviceId}:`, ); if (sessionEndJobCurrentDeviceId) { return { deviceId: currentDeviceId, job: sessionEndJobCurrentDeviceId }; } + const previousSessionEndKeys = await getRedisQueue().keys( + `*:sessionEnd:${projectId}:${previousDeviceId}:*`, + ); + const sessionEndJobPreviousDeviceId = await findJobByPrefix( sessionsQueue, - sessionEndKeys, + previousSessionEndKeys, `sessionEnd:${projectId}:${previousDeviceId}:`, ); if (sessionEndJobPreviousDeviceId) { diff --git a/packages/common/src/url.ts b/packages/common/src/url.ts index 1ae1358d..32af023f 100644 --- a/packages/common/src/url.ts +++ b/packages/common/src/url.ts @@ -21,8 +21,18 @@ export function parsePath(path?: string): { }; } + const hasOrigin = path.startsWith('http'); + + // If path does not have a leading /, + // its probably a named route + if (!path.startsWith('/') && !hasOrigin) { + return { + path, + origin: '', + }; + } + try { - const hasOrigin = path.startsWith('http'); const url = new URL(path, hasOrigin ? undefined : 'http://localhost'); return { query: parseSearchParams(url.searchParams),