import type { ApiFailure } from "../../../contracts/errors.js"; import type { ReferenceGateway, ReferenceListFilters, } from "../application/reference-feature-api.js"; import type { ReferenceResource } from "../domain/reference-resource.js"; type HttpResult = | Readonly<{ ok: true; value: unknown }> | Readonly<{ ok: false; error: ApiFailure }>; type HttpExecutor = Readonly<{ execute( request: Readonly<{ operationId: string; routeId: string; pathParams?: Record; searchParams?: unknown; body?: unknown; signal?: AbortSignal; }>, ): Promise; }>; export function createReferenceHttpGateway( http: HttpExecutor, ): ReferenceGateway { return Object.freeze({ async list( filters: ReferenceListFilters, context?: Readonly<{ signal?: AbortSignal }>, ) { const result = await http.execute({ operationId: "LIST_REFERENCE_RESOURCES", routeId: "REFERENCE_RESOURCE_LIST", searchParams: filters, signal: context?.signal, }); return result.ok ? { ok: true as const, value: result.value as readonly ReferenceResource[], } : result; }, async create(command: Readonly<{ name: string; note?: string }>) { const result = await http.execute({ operationId: "CREATE_REFERENCE_RESOURCE", routeId: "REFERENCE_RESOURCE_LIST", body: command, }); return result.ok ? { ok: true as const, value: result.value as ReferenceResource } : result; }, async get( resourceId: string, context?: Readonly<{ signal?: AbortSignal }>, ) { const result = await http.execute({ operationId: "GET_REFERENCE_RESOURCE", routeId: "REFERENCE_RESOURCE_DETAIL", pathParams: { resourceId }, signal: context?.signal, }); return result.ok ? { ok: true as const, value: result.value as ReferenceResource } : result; }, }); }