import type { FindOptions, PayloadClient, PayloadClientResult, } from "./types"; export class HTTPPayloadClient implements PayloadClient { constructor(private baseURL: string) {} private async request(path: string, options?: RequestInit): Promise { const response = await fetch(`${this.baseURL}${path}`, { headers: { "Content-Type": "application/json" }, ...options, }); if (!response.ok) { throw new Error( `Payload API error: ${response.status} ${response.statusText}` ); } return response.json() as Promise; } async find>( collection: string, options?: FindOptions ): Promise> { const params = new URLSearchParams(); if (options?.limit) params.set("limit", String(options.limit)); if (options?.page) params.set("page", String(options.page)); if (options?.sort) params.set("sort", options.sort); if (options?.depth) params.set("depth", String(options.depth)); if (options?.where) params.set("where", JSON.stringify(options.where)); const query = params.toString(); return this.request>( `/api/${collection}${query ? `?${query}` : ""}` ); } async findByID>( collection: string, id: string, options?: { depth?: number } ): Promise { const params = new URLSearchParams(); if (options?.depth) params.set("depth", String(options.depth)); const query = params.toString(); return this.request( `/api/${collection}/${id}${query ? `?${query}` : ""}` ); } async create>( collection: string, data: Record, options?: { depth?: number } ): Promise { const params = new URLSearchParams(); if (options?.depth) params.set("depth", String(options.depth)); const query = params.toString(); return this.request( `/api/${collection}${query ? `?${query}` : ""}`, { method: "POST", body: JSON.stringify(data) } ); } async update>( collection: string, id: string, data: Record, options?: { depth?: number } ): Promise { const params = new URLSearchParams(); if (options?.depth) params.set("depth", String(options.depth)); const query = params.toString(); return this.request( `/api/${collection}/${id}${query ? `?${query}` : ""}`, { method: "PATCH", body: JSON.stringify(data) } ); } async delete>( collection: string, id: string ): Promise { return this.request(`/api/${collection}/${id}`, { method: "DELETE" }); } }