feat(search): migrate to backend endpoint

This commit is contained in:
zetaloop
2026-02-28 12:17:52 +08:00
parent db02313801
commit 8463e9ea1c
3 changed files with 18 additions and 124 deletions
+18 -11
View File
@@ -1,5 +1,8 @@
import { isApiError } from "@/lib/errors"
import type { SearchResponse, SearchSort } from "@/lib/search/types"
import { httpJson } from "./http"
export interface SearchCatalogParams {
q?: string
selectedGames?: string[]
@@ -19,26 +22,30 @@ export async function searchCatalog(params: SearchCatalogParams): Promise<Search
if (params.q) searchParams.set("q", params.q)
for (const game of params.selectedGames ?? []) {
searchParams.append("game", game)
searchParams.append("selectedGames", 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.onlyOnline !== undefined) searchParams.set("onlyOnline", String(params.onlyOnline))
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}`)
try {
return await httpJson<SearchResponse>(`/api/v1/search?${searchParams.toString()}`, {
cache: "no-store",
signal: params.signal,
})
} catch (error) {
if (error instanceof Error && error.message === "UNAUTHORIZED") {
throw error
}
if (isApiError(error)) {
throw new Error(`Search API request failed: ${error.code} ${error.msg}`)
}
throw error
}
return (await res.json()) as SearchResponse
}