@dpkit/ckan
Version:
Fast TypeScript data management framework built on top of the Data Package standard and Polars DataFrames
52 lines (42 loc) • 1.24 kB
text/typescript
import type { Descriptor } from "@dpkit/core"
export async function makeCkanApiRequest<T = Descriptor>(options: {
ckanUrl: string
action: string
payload: Descriptor
upload?: { name: string; data: Blob }
apiKey?: string
}) {
let body: string | FormData
const headers: Record<string, any> = {}
const url = new URL(options.ckanUrl)
url.pathname = `/api/3/action/${options.action}`
if (options.apiKey) {
headers.Authorization = options.apiKey
}
if (options.upload) {
body = new FormData()
body.append("upload", options.upload.data, options.upload.name)
for (const [key, value] of Object.entries(options.payload)) {
body.append(key, value)
}
} else {
body = JSON.stringify(options.payload)
headers["Content-Type"] = "application/json"
}
const response = await fetch(url.toString(), {
method: "POST",
headers,
body,
})
if (!response.ok) {
const errorText = await response.text()
throw new Error(
`CKAN API error: ${response.status} ${response.statusText}\n${errorText}`,
)
}
const data = (await response.json()) as Descriptor
if (!data.success) {
throw new Error(`CKAN API error: ${data.error}`)
}
return data.result as T
}