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)) }