From cbb62a8bb57e2dd0eedd4257e68c2e5d96aae34f Mon Sep 17 00:00:00 2001 From: BuildTools <59115290+BanTheNons@users.noreply.github.com> Date: Sat, 7 Aug 2021 19:51:11 +0300 Subject: [PATCH 1/3] Implemented guild icons and banners --- src/routes/guilds/#guild_id/index.ts | 29 +++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/src/routes/guilds/#guild_id/index.ts b/src/routes/guilds/#guild_id/index.ts index 3af49106..051b44c4 100644 --- a/src/routes/guilds/#guild_id/index.ts +++ b/src/routes/guilds/#guild_id/index.ts @@ -17,6 +17,7 @@ import { HTTPError } from "lambert-server"; import { GuildUpdateSchema } from "../../../schema/Guild"; import { emitEvent } from "../../../util/Event"; import { check } from "../../../util/instanceOf"; +import { uploadFile } from "../../../util/cdn"; import "missing-native-js-functions"; const router = Router(); @@ -42,6 +43,32 @@ router.patch("/", check(GuildUpdateSchema), async (req: Request, res: Response) const perms = await getPermission(req.user_id, guild_id); perms.hasThrow("MANAGE_GUILD"); + if (body.icon && body.icon.startsWith('data')) { + try { + const mimetype = body.icon.split(":")[1].split(";")[0]; + const buffer = Buffer.from(body.icon.split(",")[1], "base64"); + + // @ts-ignore + const { id } = await uploadFile(`/icons/${guild_id}`, { buffer, mimetype, originalname: "icon" }); + body.icon = id; + } catch (error) { + throw new HTTPError("Invalid icon"); + } + } + + if (body.banner && body.banner.startsWith('data')) { + try { + const mimetype = body.banner.split(":")[1].split(";")[0]; + const buffer = Buffer.from(body.banner.split(",")[1], "base64"); + + // @ts-ignore + const { id } = await uploadFile(`/banners/${guild_id}`, { buffer, mimetype, originalname: "banner" }); + body.banner = id; + } catch (error) { + throw new HTTPError("Invalid banner"); + } + } + const guild = await GuildModel.findOneAndUpdate({ id: guild_id }, body) .populate({ path: "joined_at", match: { id: req.user_id } }) .exec(); @@ -50,7 +77,7 @@ router.patch("/", check(GuildUpdateSchema), async (req: Request, res: Response) emitEvent({ event: "GUILD_UPDATE", data: data, guild_id } as GuildUpdateEvent); - return res.send(data); + return res.json(data); }); export default router; From c396fac204c6ba9e433d5fcee5d39d03d5985a89 Mon Sep 17 00:00:00 2001 From: Flam3rboy <34555296+Flam3rboy@users.noreply.github.com> Date: Sat, 7 Aug 2021 19:15:48 +0200 Subject: [PATCH 2/3] :art: add handleFile() --- package-lock.json | Bin 677545 -> 677545 bytes package.json | 2 +- src/routes/guilds/#guild_id/index.ts | 29 +++------------------------ src/routes/users/@me/index.ts | 16 ++------------- src/util/cdn.ts | 15 ++++++++++++++ 5 files changed, 21 insertions(+), 41 deletions(-) diff --git a/package-lock.json b/package-lock.json index fc8bff16bd2c6455a0d236f3c8ad6db082c7b791..e18715bcb64c1f6519e0e04054fbb3bafa562634 100644 GIT binary patch delta 300 zcmZ3vR&(WA%?Y0wEjND2jhUXP!K6QVLagTW!kvr?p~cxQVMf8ePQ~87l?Hz4Rp!Qt z5gwVAe%TonW?^P-9+m}}mLa8?UWvJu=4RQgQRx3<5Sj@pby;GTufBV%ttP2?@Cy4Pi3n#P-Colpr6A&{4 rG0S%01lGgV^l;Sl4{Gc((;dXvAg*c$x(bNdfS4VKIe@O@yiy4OQBY~h delta 301 zcmZ3vR&(WA%?Y0wEjE71jhWtP#bz*_?GCHPWX59(VIh%8#g_Vh { router.patch("/", check(UserModifySchema), async (req: Request, res: Response) => { const body = req.body as UserModifySchema; - - if (body.avatar) { - try { - const mimetype = body.avatar.split(":")[1].split(";")[0]; - const buffer = Buffer.from(body.avatar.split(",")[1], "base64"); - - // @ts-ignore - const { id } = await uploadFile(`/avatars/${req.user_id}`, { buffer, mimetype, originalname: "avatar" }); - body.avatar = id; - } catch (error) { - throw new HTTPError("Invalid avatar"); - } - } + body.avatar = await handleFile(body.avatar as string); const user = await UserModel.findOneAndUpdate({ id: req.user_id }, body, { projection: PublicUserProjection }).exec(); // TODO: dispatch user update event diff --git a/src/util/cdn.ts b/src/util/cdn.ts index a66e2215..fb0cfb53 100644 --- a/src/util/cdn.ts +++ b/src/util/cdn.ts @@ -1,5 +1,6 @@ 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) { @@ -22,3 +23,17 @@ export async function uploadFile(path: string, file: Express.Multer.File) { if (response.status !== 200) throw result; return result; } + +export async function handleFile(path: string, body?: string): Promise { + 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}/${guild_id}`, { buffer, mimetype, originalname: "banner" }); + return id; + } catch (error) { + throw new HTTPError("Invalid " + path); + } +} From 30e05fdb86df8393cefa299ac7ffa53d2af2b5a2 Mon Sep 17 00:00:00 2001 From: Flam3rboy <34555296+Flam3rboy@users.noreply.github.com> Date: Sat, 7 Aug 2021 19:21:00 +0200 Subject: [PATCH 3/3] :bug: fix handleFile() --- src/routes/guilds/#guild_id/index.ts | 4 ++-- src/routes/users/@me/index.ts | 2 +- src/util/cdn.ts | 5 +++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/routes/guilds/#guild_id/index.ts b/src/routes/guilds/#guild_id/index.ts index a2dfeeda..8e052f6d 100644 --- a/src/routes/guilds/#guild_id/index.ts +++ b/src/routes/guilds/#guild_id/index.ts @@ -43,8 +43,8 @@ router.patch("/", check(GuildUpdateSchema), async (req: Request, res: Response) const perms = await getPermission(req.user_id, guild_id); perms.hasThrow("MANAGE_GUILD"); - body.icon = await handleFile("icons", body.icon); - body.banner = await handleFile("banners", body.banner); + body.icon = await handleFile(`/icons/${guild_id}`, body.icon); + body.banner = await handleFile(`/banners/${guild_id}`, body.banner); const guild = await GuildModel.findOneAndUpdate({ id: guild_id }, body) .populate({ path: "joined_at", match: { id: req.user_id } }) diff --git a/src/routes/users/@me/index.ts b/src/routes/users/@me/index.ts index 25a05da3..185e44d4 100644 --- a/src/routes/users/@me/index.ts +++ b/src/routes/users/@me/index.ts @@ -14,7 +14,7 @@ router.get("/", async (req: Request, res: Response) => { router.patch("/", check(UserModifySchema), async (req: Request, res: Response) => { const body = req.body as UserModifySchema; - body.avatar = await handleFile(body.avatar as string); + body.avatar = await handleFile(`/avatars/${req.user_id}`, body.avatar as string); const user = await UserModel.findOneAndUpdate({ id: req.user_id }, body, { projection: PublicUserProjection }).exec(); // TODO: dispatch user update event diff --git a/src/util/cdn.ts b/src/util/cdn.ts index fb0cfb53..b0d0f62a 100644 --- a/src/util/cdn.ts +++ b/src/util/cdn.ts @@ -31,9 +31,10 @@ export async function handleFile(path: string, body?: string): Promise