Forwarding query params
This commit is contained in:
@@ -3,9 +3,11 @@ import { headers } from "next/headers"
|
|||||||
import { notFound, redirect } from "next/navigation"
|
import { notFound, redirect } from "next/navigation"
|
||||||
|
|
||||||
export default async function RedirectPage({
|
export default async function RedirectPage({
|
||||||
params
|
params,
|
||||||
|
searchParams
|
||||||
}: {
|
}: {
|
||||||
params: Promise<{ slug: string }>
|
params: Promise<{ slug: string }>
|
||||||
|
searchParams: Promise<{ [key: string]: string | string[] | undefined }>
|
||||||
}) {
|
}) {
|
||||||
const { slug } = await params
|
const { slug } = await params
|
||||||
|
|
||||||
@@ -26,10 +28,10 @@ export default async function RedirectPage({
|
|||||||
}
|
}
|
||||||
|
|
||||||
const headersList = await headers()
|
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 forwardedFor = headersList.get("x-forwarded-for")
|
||||||
const realIp = headersList.get("x-real-ip")
|
const realIp = headersList.get("x-real-ip")
|
||||||
const ipAddress = forwardedFor?.split(",")[0] || realIp || "Unknown"
|
const ipAddress = forwardedFor?.split(",")[0] ?? realIp ?? "Unknown"
|
||||||
|
|
||||||
await trackVisit({
|
await trackVisit({
|
||||||
urlId: urlRecord.id,
|
urlId: urlRecord.id,
|
||||||
@@ -37,5 +39,37 @@ export default async function RedirectPage({
|
|||||||
userAgent
|
userAgent
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const parsedParams = parseSearchParams(
|
||||||
|
urlRecord.url,
|
||||||
|
await searchParams
|
||||||
|
)
|
||||||
|
|
||||||
|
if (urlRecord.forwardQueryParams && parsedParams) {
|
||||||
|
return redirect(parsedParams)
|
||||||
|
}
|
||||||
|
|
||||||
redirect(urlRecord.url)
|
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) {
|
export async function getVisitsBySlugById(id: string) {
|
||||||
"use cache"
|
|
||||||
|
|
||||||
cacheTag("visits")
|
|
||||||
|
|
||||||
return await db.select({ count: count() }).from(visits).where(eq(visits.urlId, id))
|
return await db.select({ count: count() }).from(visits).where(eq(visits.urlId, id))
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function trackVisit(data: typeof visits.$inferInsert) {
|
export async function trackVisit(data: typeof visits.$inferInsert) {
|
||||||
revalidateTag("visits")
|
|
||||||
|
|
||||||
return await db.insert(visits).values(data)
|
return await db.insert(visits).values(data)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user