feat(search): add api-backed filtering and sorting
This commit is contained in:
@@ -0,0 +1,44 @@
|
||||
import type { SearchResponse, SearchSort } from "@/lib/search/types"
|
||||
|
||||
export interface SearchCatalogParams {
|
||||
q?: string
|
||||
selectedGames?: string[]
|
||||
min?: string
|
||||
max?: string
|
||||
onlyOnline?: boolean
|
||||
minRating?: string
|
||||
sort?: SearchSort
|
||||
limit?: number
|
||||
offset?: number
|
||||
signal?: AbortSignal
|
||||
}
|
||||
|
||||
export async function searchCatalog(params: SearchCatalogParams): Promise<SearchResponse> {
|
||||
const searchParams = new URLSearchParams()
|
||||
|
||||
if (params.q) searchParams.set("q", params.q)
|
||||
|
||||
for (const game of params.selectedGames ?? []) {
|
||||
searchParams.append("game", game)
|
||||
}
|
||||
|
||||
if (params.min) searchParams.set("min", params.min)
|
||||
if (params.max) searchParams.set("max", params.max)
|
||||
if (params.onlyOnline) searchParams.set("online", "1")
|
||||
if (params.minRating && params.minRating !== "0") searchParams.set("minRating", params.minRating)
|
||||
if (params.sort && params.sort !== "composite") searchParams.set("sort", params.sort)
|
||||
|
||||
if (params.limit !== undefined) searchParams.set("limit", String(params.limit))
|
||||
if (params.offset !== undefined) searchParams.set("offset", String(params.offset))
|
||||
|
||||
const res = await fetch(`/api/search?${searchParams.toString()}`, {
|
||||
cache: "no-store",
|
||||
signal: params.signal,
|
||||
})
|
||||
|
||||
if (!res.ok) {
|
||||
throw new Error(`Search API request failed: ${res.status} ${res.statusText}`)
|
||||
}
|
||||
|
||||
return (await res.json()) as SearchResponse
|
||||
}
|
||||
Reference in New Issue
Block a user