1
0
Fork 0
mirror of https://gitbruv.vercel.app/api/git/bruv/gitbruv.git synced 2025-12-20 23:24:09 +01:00
gitbruv/lib/api-auth.ts
2025-12-20 14:06:02 +00:00

69 lines
1.8 KiB
TypeScript

import { NextRequest } from "next/server";
import { db } from "@/db";
import { users } from "@/db/schema";
import { eq } from "drizzle-orm";
import { auth } from "@/lib/auth";
import { getSession } from "@/lib/session";
export interface AuthenticatedUser {
id: string;
username: string;
}
export async function authenticateRequest(request: NextRequest): Promise<AuthenticatedUser | null> {
const session = await getSession();
if (session?.user) {
const user = await db.query.users.findFirst({
where: eq(users.id, session.user.id),
});
if (user) {
return { id: user.id, username: user.username };
}
}
const authHeader = request.headers.get("authorization");
if (authHeader?.startsWith("Basic ")) {
const credentials = Buffer.from(authHeader.split(" ")[1], "base64").toString("utf-8");
const [email, password] = credentials.split(":");
if (email && password) {
try {
const result = await auth.api.signInEmail({
body: { email, password },
asResponse: false,
});
if (result?.user) {
const user = await db.query.users.findFirst({
where: eq(users.email, email),
});
if (user) {
return { id: user.id, username: user.username };
}
}
} catch {
return null;
}
}
}
const bearerMatch = request.headers.get("authorization")?.match(/^Bearer (.+)$/);
if (bearerMatch) {
try {
const tokenSession = await auth.api.getSession({
headers: request.headers,
});
if (tokenSession?.user) {
const user = await db.query.users.findFirst({
where: eq(users.id, tokenSession.user.id),
});
if (user) {
return { id: user.id, username: user.username };
}
}
} catch {
return null;
}
}
return null;
}