Files
web/lib/api/index.ts
2024-05-14 10:33:15 +02:00

66 lines
1.5 KiB
TypeScript

import merge from "deepmerge"
import { env } from "@/env/server"
import type {
RequestOptionsWithJSONBody,
RequestOptionsWithOutBody,
} from "@/types/fetch"
import type { Endpoint } from "./endpoints"
export { endpoints } from "./endpoints"
const defaultOptions: RequestInit = {
cache: "no-store",
headers: {
"Content-Type": "application/json",
},
mode: "cors",
}
export async function get(
endpoint: Endpoint,
options: RequestOptionsWithOutBody,
params?: URLSearchParams
) {
defaultOptions.method = "GET"
const url = new URL(
`${env.API_BASEURL}/${endpoint}${params ? `?${params.toString()}` : ""}`
)
return fetch(url, merge(defaultOptions, options))
}
export async function patch(
endpoint: Endpoint,
options: RequestOptionsWithJSONBody
) {
const { body, ...requestOptions } = options
defaultOptions.body = JSON.stringify(body)
defaultOptions.method = "PATCH"
return fetch(
`${env.API_BASEURL}/${endpoint}`,
merge(defaultOptions, requestOptions)
)
}
export async function post(
endpoint: Endpoint,
options: RequestOptionsWithJSONBody
) {
const { body, ...requestOptions } = options
defaultOptions.body = JSON.stringify(body)
defaultOptions.method = "POST"
return fetch(
`${env.API_BASEURL}/${endpoint}`,
merge(defaultOptions, requestOptions)
)
}
export async function remove(
endpoint: Endpoint,
options: RequestOptionsWithOutBody
) {
defaultOptions.method = "DELETE"
return fetch(`${env.API_BASEURL}/${endpoint}`, merge(defaultOptions, options))
}