From e1ac28c90fb3a4a70c0128dff7f12efbb05a9650 Mon Sep 17 00:00:00 2001 From: Taken Date: Sat, 28 Jun 2025 16:07:43 +0200 Subject: [PATCH] Forwarding query params --- src/app/r/[slug]/page.tsx | 40 ++++++++++++++++++++++++++++++++++++--- src/lib/db/urls.ts | 6 ------ 2 files changed, 37 insertions(+), 9 deletions(-) diff --git a/src/app/r/[slug]/page.tsx b/src/app/r/[slug]/page.tsx index 2ba5da9..dd45626 100644 --- a/src/app/r/[slug]/page.tsx +++ b/src/app/r/[slug]/page.tsx @@ -3,9 +3,11 @@ import { headers } from "next/headers" import { notFound, redirect } from "next/navigation" export default async function RedirectPage({ - params + params, + searchParams }: { params: Promise<{ slug: string }> + searchParams: Promise<{ [key: string]: string | string[] | undefined }> }) { const { slug } = await params @@ -26,10 +28,10 @@ export default async function RedirectPage({ } const headersList = await headers() - const userAgent = headersList.get("user-agent") || "Unknown" + const userAgent = headersList.get("user-agent") ?? "Unknown" const forwardedFor = headersList.get("x-forwarded-for") const realIp = headersList.get("x-real-ip") - const ipAddress = forwardedFor?.split(",")[0] || realIp || "Unknown" + const ipAddress = forwardedFor?.split(",")[0] ?? realIp ?? "Unknown" await trackVisit({ urlId: urlRecord.id, @@ -37,5 +39,37 @@ export default async function RedirectPage({ userAgent }) + const parsedParams = parseSearchParams( + urlRecord.url, + await searchParams + ) + + if (urlRecord.forwardQueryParams && parsedParams) { + return redirect(parsedParams) + } + redirect(urlRecord.url) } + +function parseSearchParams( + url: string, + searchParams: { [key: string]: string | string[] | undefined } +) { + if (Object.keys(searchParams).length === 0) { + return null + } + + const newUrl = new URL(url) + const params = new URLSearchParams() + + for (const [key, value] of Object.entries(searchParams)) { + if (Array.isArray(value)) { + value.forEach((v) => params.append(key, v)) + } else if (value !== undefined) { + params.set(key, value) + } + } + + newUrl.search = params.toString() + return newUrl.toString() +} diff --git a/src/lib/db/urls.ts b/src/lib/db/urls.ts index e856541..196ec2a 100644 --- a/src/lib/db/urls.ts +++ b/src/lib/db/urls.ts @@ -56,15 +56,9 @@ export async function deleteUrl(id: string) { } export async function getVisitsBySlugById(id: string) { - "use cache" - - cacheTag("visits") - return await db.select({ count: count() }).from(visits).where(eq(visits.urlId, id)) } export async function trackVisit(data: typeof visits.$inferInsert) { - revalidateTag("visits") - return await db.insert(visits).values(data) }