From c666d13c96d09db8c68c0e81923df9bd94100e1e Mon Sep 17 00:00:00 2001 From: Miodec Date: Tue, 29 Apr 2025 13:53:02 +0200 Subject: [PATCH] impr: parse response from discord api with zod !nuf --- backend/src/utils/discord.ts | 33 ++++++++++++++------------------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/backend/src/utils/discord.ts b/backend/src/utils/discord.ts index b3b74381f..946ab9fb3 100644 --- a/backend/src/utils/discord.ts +++ b/backend/src/utils/discord.ts @@ -3,38 +3,33 @@ import { isDevEnvironment } from "./misc"; import * as RedisClient from "../init/redis"; import { randomBytes } from "crypto"; import MonkeyError from "./error"; +import { z } from "zod"; +import { parseWithSchema as parseJsonWithSchema } from "@monkeytype/util/json"; const BASE_URL = "https://discord.com/api"; -type DiscordUser = { - id: string; - username: string; - discriminator: string; - avatar?: string; - bot?: boolean; - system?: boolean; - mfa_enabled?: boolean; - banner?: string; - accent_color?: number; - locale?: string; - verified?: boolean; - email?: string; - flags?: number; - premium_type?: number; - public_flags?: number; -}; +const DiscordIdAndAvatarSchema = z.object({ + id: z.string(), + avatar: z.string().optional(), +}); +type DiscordIdAndAvatar = z.infer; export async function getDiscordUser( tokenType: string, accessToken: string -): Promise { +): Promise { const response = await fetch(`${BASE_URL}/users/@me`, { headers: { authorization: `${tokenType} ${accessToken}`, }, }); - return (await response.json()) as DiscordUser; + const parsed = parseJsonWithSchema( + await response.text(), + DiscordIdAndAvatarSchema + ); + + return parsed; } export async function getOauthLink(uid: string): Promise {