diff --git a/frontend/src/network/index.ts b/frontend/src/network/index.ts new file mode 100644 index 0000000..9a31eb3 --- /dev/null +++ b/frontend/src/network/index.ts @@ -0,0 +1,97 @@ +import { + array, + InferOutput, + null as Null, + 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, + image: BlobPart, +): Promise> => { + const data = new Blob([image]); + const request = getBaseRequest({ + path: `image/${imageName}`, + body: data, + method: "POST", + }); + + request.headers.set("Content-Type", "aplication/oclet-stream"); + + 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: nullable( + array( + object({ + ID: pipe(string(), uuid()), + Tag: string(), + ImageID: pipe(string(), uuid()), + }), + ), + ), + Links: nullable( + array( + object({ + ID: pipe(string(), uuid()), + Links: string(), + ImageID: pipe(string(), uuid()), + }), + ), + ), + 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); +};