Forwarding query params
This commit is contained in:
@@ -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()
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user