import { type InferOutput, null as Null, any, array, nullable, object, parse, pipe, string, uuid, } from "valibot"; type BaseRequestParams = Partial<{ path: string; body: RequestInit["body"]; method: "GET" | "POST"; }>; const getBaseRequest = ({ path, body, method }: BaseRequestParams): Request => { return new Request(`http://localhost:3040/${path}`, { headers: { userId: "fcc22dbb-7792-4595-be8e-d0439e13990a" }, body, method, }); }; const sendImageResponseValidator = object({ ID: pipe(string(), uuid()), ImageID: pipe(string(), uuid()), UserID: pipe(string(), uuid()), }); export const sendImage = async ( imageName: string, base64Image: string, ): Promise> => { const request = getBaseRequest({ path: `image/${imageName}`, body: base64Image, method: "POST", }); request.headers.set("Content-Type", "application/base64"); const res = await fetch(request).then((res) => res.json()); return parse(sendImageResponseValidator, res); }; const getUserImagesResponseValidator = array( object({ ID: pipe(string(), uuid()), Image: object({ ID: pipe(string(), uuid()), ImageName: string(), Image: Null(), }), Tags: any(), Links: any(), Text: nullable( array( object({ ID: pipe(string(), uuid()), ImageText: string(), ImageID: pipe(string(), uuid()), }), ), ), }), ); export const getUserImages = async (): Promise< InferOutput > => { const request = getBaseRequest({ path: "image" }); const res = await fetch(request).then((res) => res.json()); return parse(getUserImagesResponseValidator, res); };