40 lines
1.2 KiB
TypeScript
40 lines
1.2 KiB
TypeScript
import "server-only";
|
|
|
|
import { eq } from "drizzle-orm";
|
|
import { getServerSession } from "next-auth";
|
|
import { db } from "@/db";
|
|
import { users } from "@/db/schema";
|
|
import type { SessionWithDiscord } from "@/lib/auth/auth";
|
|
import { authOptions } from "@/lib/auth/auth-options";
|
|
import { getDiscordMemberProfile } from "@/lib/discord/discord";
|
|
import { ShareHttpError } from "@/lib/share/http-error";
|
|
import { requireShareSessionIdentity } from "@/lib/share/session";
|
|
|
|
export async function requireShareAuthor() {
|
|
const session = await getServerSession(authOptions);
|
|
const { discordId, userId } = requireShareSessionIdentity(
|
|
session as SessionWithDiscord | null,
|
|
);
|
|
|
|
const [user] = await db
|
|
.select({ id: users.id, name: users.name, image: users.image })
|
|
.from(users)
|
|
.where(eq(users.id, userId))
|
|
.limit(1);
|
|
if (!user) throw new ShareHttpError("Unauthorized", 401);
|
|
|
|
const profile = await getDiscordMemberProfile(discordId);
|
|
|
|
return {
|
|
userId: user.id,
|
|
discordId,
|
|
displayName:
|
|
profile?.globalName?.trim() ||
|
|
profile?.username ||
|
|
user.name ||
|
|
session?.user?.name ||
|
|
"Discord user",
|
|
avatarUrl: profile?.avatarUrl || user.image || session?.user?.image || null,
|
|
};
|
|
}
|