import { eq } from "drizzle-orm";
import { db } from "../db";
import { siteAdmins, users } from "../db/schema";
import { grantSiteAdmin } from "./admin";
export function getEnvAdminUsername(): string | null {
const raw = process.env.SITE_ADMIN_USERNAME?.trim();
if (!raw) return null;
return raw.toLowerCase();
}
export async function ensureEnvSiteAdmin(): Promise<void> {
const username = getEnvAdminUsername();
if (!username) return;
try {
const [user] = await db
.select({ id: users.id })
.from(users)
.where(eq(users.username, username))
.limit(1);
if (!user) {
console.log(
`[admin-bootstrap] SITE_ADMIN_USERNAME=${username} but no such user yet — will retry next boot or on register`
);
return;
}
const [existing] = await db
.select({ userId: siteAdmins.userId })
.from(siteAdmins)
.where(eq(siteAdmins.userId, user.id))
.limit(1);
if (existing) {
console.log(`[admin-bootstrap] ${username} already has admin`);
return;
}
const granted = await grantSiteAdmin(user.id, null);
if (granted) {
console.log(`[admin-bootstrap] granted site admin to ${username}`);
} else {
console.warn(`[admin-bootstrap] failed to grant admin to ${username}`);
}
} catch (err) {
console.error("[admin-bootstrap] error:", err);
}
}
export async function ensureEnvAdminOnRegister(args: {
userId: string;
username: string;
}): Promise<void> {
const target = getEnvAdminUsername();
if (!target) return;
if (args.username.toLowerCase() !== target) return;
await grantSiteAdmin(args.userId, null);
console.log(
`[admin-bootstrap] auto-granted admin to ${args.username} on register`
);
}
|