Swadhin Biswas Feature/ai code reviewer (#79) · 8/16/2026
cfd400d
36 lines · 1.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import type { APIRoute } from "astro";
import { unauthorized, success } from "@/lib/api";
import { withErrorHandler } from "@/lib/errors";

/**
 * GET /api/oauth/userinfo
 * Authorization: Bearer <access_token>
 * → { id, username, displayName, avatarUrl, email? }
 */
export const GET: APIRoute = withErrorHandler(async ({ request }) => {
  const auth = request.headers.get("authorization") || "";
  const token = auth.startsWith("Bearer ") ? auth.slice(7) : null;
  if (!token) return unauthorized();

  const { verifyAccessToken } = await import("@/lib/oauth-provider");
  const payload = await verifyAccessToken(token);
  if (!payload) return unauthorized();

  const { getDatabase, schema } = await import("@/db");
  const { eq } = await import("drizzle-orm");
  const db = getDatabase() as any;
  const user = await db.query.users.findFirst({
    where: eq(schema.users.id, payload.userId),
    columns: { id: true, username: true, displayName: true, avatarUrl: true, email: true },
  });
  if (!user) return unauthorized();

  return success({
    id: user.id,
    username: user.username,
    displayName: user.displayName,
    avatarUrl: user.avatarUrl,
    email: payload.scopes.includes("user:read") ? user.email : undefined,
  });
});