summary refs log tree commit diff
path: root/api/src/util/cdn.ts
diff options
context:
space:
mode:
Diffstat (limited to 'api/src/util/cdn.ts')
-rw-r--r--api/src/util/cdn.ts40
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);
+	}
+}