import { Hono } from 'hono' import * as z from 'zod/mini' import type * as App from '../../../App.js' import * as Auth from '../../../internal/Auth.js' import * as Cache from '../../../internal/Cache.js' import * as FundingCatalog from '../../../internal/funding/Catalog.js' import * as FundingProvider from '../../../internal/funding/Provider.js' import * as OpenApi from '../../../internal/OpenApi.js' import * as Response from '../../../internal/Response.js' import * as Schema from '../../../internal/Schema.js' import * as Inventory from '../Inventory.js' /** Zod schemas owned by funding provider resources. */ export namespace schema { /** Funding provider catalog entry. */ export const Provider = Schema.describe( FundingProvider.schema.ProviderRef, 'One funding quote provider.', ) /** Schemas for the getFundingProviders operation. */ export namespace getFundingProviders { /** Non-paginated funding provider catalog. */ export const Response = OpenApi.component( Schema.describe( z.object({ data: z.array(Provider).check(z.describe("Providers in Tempo's funding quote catalog.")), }), 'A non-paginated list of funding quote providers.', ), 'FundingProviderList', ) } } const providersResponseExample = { data: [{ id: 'relay', name: 'Relay' }], } satisfies z.output /** Mounts funding provider inventory routes. */ export function providers() { return new Hono().get( '/v1/funding/providers', Auth.policy({ apiKey: { scopes: ['data:read'] }, mpp: true, public: true }), OpenApi.describeRoute({ description: 'Lists available transfer providers.', operationId: 'getFundingProviders', responses: OpenApi.responses({ errors: { 400: { codes: [] } }, success: { description: 'Funding quote providers supported by Tempo.', example: providersResponseExample, schema: schema.getFundingProviders.Response, }, }), summary: 'Get providers', tags: ['Providers'], }), Cache.response({ cacheControl: Cache.policies.stable, key: Inventory.key, name: 'tempo-api:funding-providers:v4', }), async (c) => { if (Auth.narrowAccess) return Auth.paidAccessError(c) const catalog = await FundingCatalog.snapshot(c) const providers = c.get('providers').filter(FundingProvider.is) return c.json( Response.validated(schema.getFundingProviders.Response, { data: FundingProvider.getProviders({ catalog, providers }), }), 200, ) }, ) }