import { DIRECTUS_URL } from './env' export type DirectusListResponse = { data: T[] meta?: { filter_count?: number; total_count?: number } } export type DirectusItemResponse = { data: T } export type DirectusFilter = Record export type DirectusQuery = { fields?: string[] filter?: DirectusFilter sort?: string limit?: number page?: number meta?: string[] } function buildUrl(collection: string, q: DirectusQuery = {}): string { const url = new URL(`${DIRECTUS_URL}/items/${collection}`) for (const field of q.fields ?? []) url.searchParams.append('fields[]', field) for (const m of q.meta ?? []) url.searchParams.append('meta[]', m) if (q.filter) url.searchParams.append('filter', JSON.stringify(q.filter)) if (q.sort) url.searchParams.append('sort', q.sort) if (q.limit !== undefined) url.searchParams.append('limit', String(q.limit)) if (q.page !== undefined) url.searchParams.append('page', String(q.page)) return url.toString() } export async function directusList(collection: string, q: DirectusQuery = {}): Promise> { const res = await fetch(buildUrl(collection, q)) if (!res.ok) throw new Error(`Directus error ${res.status} on /items/${collection}`) return (await res.json()) as DirectusListResponse } export async function directusOne(collection: string, q: DirectusQuery = {}): Promise { const { data } = await directusList(collection, { ...q, limit: 1 }) return data[0] } export function assetUrl(fileId: string | null | undefined, key?: string): string { if (!fileId) return '' const url = new URL(`${DIRECTUS_URL}/assets/${fileId}`) if (key) url.searchParams.append('key', key) return url.toString() }