55 lines
1.4 KiB
TypeScript
55 lines
1.4 KiB
TypeScript
import { prisma } from "@/prisma/prismaClient";
|
|
|
|
export async function isEmailVerified(id: string) {
|
|
const user = await prisma.user.findUnique({
|
|
where: { id },
|
|
select: {
|
|
emailVerified: true,
|
|
email: true,
|
|
accounts: { select: { provider: true, access_token: true } },
|
|
},
|
|
});
|
|
if (!user) return false;
|
|
|
|
if (user?.emailVerified) return true;
|
|
|
|
const discordAccount = user.accounts.find((a) => a.provider === "discord");
|
|
if (user && discordAccount?.access_token) {
|
|
const dcUser = await getDiscordUserInfo(discordAccount.access_token);
|
|
if (!dcUser.verified) return false;
|
|
prisma.user.update({ where: { id }, data: { emailVerified: new Date() } });
|
|
return true;
|
|
}
|
|
}
|
|
|
|
async function getDiscordUserInfo(accessToken: string): Promise<{
|
|
id: string;
|
|
username: string;
|
|
discriminator: string;
|
|
avatar: string;
|
|
verified: boolean;
|
|
email: string;
|
|
flags: number;
|
|
banner: string;
|
|
accent_color: number;
|
|
premium_type: number;
|
|
public_flags: number;
|
|
avatar_decoration_data: {
|
|
sku_id: string;
|
|
asset: string;
|
|
};
|
|
}> {
|
|
try {
|
|
const response = await fetch("https://discord.com/api/users/@me", {
|
|
headers: {
|
|
Authorization: `Bearer ${accessToken}`,
|
|
},
|
|
});
|
|
|
|
return await response.json();
|
|
} catch (error) {
|
|
console.error("Error fetching user info from Discord:", error);
|
|
throw error;
|
|
}
|
|
}
|