From 3a119acd1096f41f787729e1508eed934fba07ca Mon Sep 17 00:00:00 2001 From: Felix Bernal Date: Mon, 9 Jun 2025 12:06:42 +0200 Subject: [PATCH] improv: Improved performance of send due to slow session creation retrieving session every time. --- src/app/api/send/route.ts | 44 +++++++++------------ src/queries/sql/sessions/createSession.ts | 47 +++++++++++++++-------- 2 files changed, 49 insertions(+), 42 deletions(-) diff --git a/src/app/api/send/route.ts b/src/app/api/send/route.ts index 60d6f7af..16441efc 100644 --- a/src/app/api/send/route.ts +++ b/src/app/api/send/route.ts @@ -4,7 +4,7 @@ import { startOfHour, startOfMonth } from 'date-fns'; import clickhouse from '@/lib/clickhouse'; import { parseRequest } from '@/lib/request'; import { badRequest, json, forbidden, serverError } from '@/lib/response'; -import { fetchSession, fetchWebsite } from '@/lib/load'; +import { fetchWebsite } from '@/lib/load'; import { getClientInfo, hasBlockedIp } from '@/lib/detect'; import { createToken, parseToken } from '@/lib/jwt'; import { secret, uuid, hash } from '@/lib/crypto'; @@ -103,32 +103,24 @@ export async function POST(request: Request) { const sessionId = id ? uuid(websiteId, id) : uuid(websiteId, ip, userAgent, sessionSalt); - // Find session + // Create a session if not found if (!clickhouse.enabled && !cache?.sessionId) { - const session = await fetchSession(websiteId, sessionId); - - // Create a session if not found - if (!session) { - try { - await createSession({ - id: sessionId, - websiteId, - browser, - os, - device, - screen, - language, - country, - region, - city, - distinctId: id, - }); - } catch (e: any) { - if (!e.message.toLowerCase().includes('unique constraint')) { - return serverError(e); - } - } - } + await createSession( + { + id: sessionId, + websiteId, + browser, + os, + device, + screen, + language, + country, + region, + city, + distinctId: id, + }, + { skipDuplicates: true }, + ); } // Visit info diff --git a/src/queries/sql/sessions/createSession.ts b/src/queries/sql/sessions/createSession.ts index 9d1402b1..d2794c8f 100644 --- a/src/queries/sql/sessions/createSession.ts +++ b/src/queries/sql/sessions/createSession.ts @@ -1,7 +1,10 @@ import { Prisma } from '@prisma/client'; import prisma from '@/lib/prisma'; -export async function createSession(data: Prisma.SessionCreateInput) { +export async function createSession( + data: Prisma.SessionCreateInput, + options = { skipDuplicates: false }, +) { const { id, websiteId, @@ -16,19 +19,31 @@ export async function createSession(data: Prisma.SessionCreateInput) { distinctId, } = data; - return prisma.client.session.create({ - data: { - id, - websiteId, - browser, - os, - device, - screen, - language, - country, - region, - city, - distinctId, - }, - }); + try { + return await prisma.client.session.create({ + data: { + id, + websiteId, + browser, + os, + device, + screen, + language, + country, + region, + city, + distinctId, + }, + }); + } catch (e: any) { + // With skipDuplicates flag: ignore unique constraint error and return null + if ( + options.skipDuplicates && + e instanceof Prisma.PrismaClientKnownRequestError && + e.code === 'P2002' + ) { + return null; + } + throw e; + } }