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 {