Files
juwan-frontend/lib/api/services.ts
T
zetaloop 4037816998 fix(api): align API layer with backend response formats
- wallet: parse {balance: string} response
- favorites: addFavorite returns void (EmptyResp)
- services: handle paginated response from listServicesByPlayer
- files: use query param ?key= instead of path param /:id
- search: remove unsupported selectedGames/minRating params
2026-04-23 21:14:57 +08:00

51 lines
1.4 KiB
TypeScript

import { isApiError } from "@/lib/errors"
import type { PlayerService } from "@/lib/types"
import { httpJson } from "./http"
type Paginated<T> = {
items: T[]
meta: {
total: number
offset: number
limit: number
}
}
export async function listServices(): Promise<PlayerService[]> {
const res = await httpJson<unknown>("/api/v1/services", { cache: "no-store" })
if (typeof res === "object" && res !== null && "items" in res) {
return (res as Paginated<PlayerService>).items
}
return res as PlayerService[]
}
export async function getServiceById(serviceId: string): Promise<PlayerService | undefined> {
try {
return await httpJson<PlayerService>(`/api/v1/services/${encodeURIComponent(serviceId)}`, {
cache: "no-store",
})
} catch (error) {
if (error instanceof Error && error.message === "UNAUTHORIZED") {
throw error
}
if (isApiError(error) && error.code === 404) {
return undefined
}
throw error
}
}
export async function listServicesByPlayer(playerId: string): Promise<PlayerService[]> {
const res = await httpJson<Paginated<PlayerService> | PlayerService[]>(
`/api/v1/players/${encodeURIComponent(playerId)}/services`,
{
cache: "no-store",
},
)
if (typeof res === "object" && res !== null && "items" in res) {
return (res as Paginated<PlayerService>).items
}
return res as PlayerService[]
}