diff options
Diffstat (limited to 'api/src/util/cdn.ts')
-rw-r--r-- | api/src/util/cdn.ts | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/api/src/util/cdn.ts b/api/src/util/cdn.ts new file mode 100644 index 00000000..aed8ca0a --- /dev/null +++ b/api/src/util/cdn.ts @@ -0,0 +1,40 @@ +import { Config } from "@fosscord/server-util"; +import FormData from "form-data"; +import { HTTPError } from "lambert-server"; +import fetch from "node-fetch"; + +export async function uploadFile(path: string, file: Express.Multer.File) { + const form = new FormData(); + form.append("file", file.buffer, { + contentType: file.mimetype, + filename: file.originalname + }); + + const response = await fetch(`${Config.get().cdn.endpoint || "http://localhost:3003"}${path}`, { + headers: { + signature: Config.get().security.requestSignature, + ...form.getHeaders() + }, + method: "POST", + body: form + }); + const result = await response.json(); + + if (response.status !== 200) throw result; + return result; +} + +export async function handleFile(path: string, body?: string): Promise<string | undefined> { + if (!body || !body.startsWith("data:")) return body; + try { + const mimetype = body.split(":")[1].split(";")[0]; + const buffer = Buffer.from(body.split(",")[1], "base64"); + + // @ts-ignore + const { id } = await uploadFile(path, { buffer, mimetype, originalname: "banner" }); + return id; + } catch (error) { + console.error(error); + throw new HTTPError("Invalid " + path); + } +} |