Forwarding query params

This commit is contained in:
2025-06-28 16:07:43 +02:00
parent 75117b9248
commit e1ac28c90f
2 changed files with 37 additions and 9 deletions

View File

@@ -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()
}

View File

@@ -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)
}