UNPKG

@oberoncms/core

Version:

OberonCMS is a cloud deployable CMS written in typescript based on the Puck visual editor

74 lines (73 loc) 2.01 kB
import { headers } from "next/headers"; import { toNextJsHandler } from "better-auth/next-js"; import { version, name } from "../packages/oberoncms/core/package.json.js"; import { createAuthServer } from "./server.js"; function normalizeEmail(email) { return email.trim().toLowerCase(); } const authPlugin = (adapter) => { const authServer = () => createAuthServer({ betterAuth: adapter.betterAuth, sendVerificationRequest: adapter.sendVerificationRequest }); const ensureMasterUser = async () => { const masterEmail = process.env.MASTER_EMAIL; if (!masterEmail) { return; } const normalizedMasterEmail = normalizeEmail(masterEmail); const users = await adapter.getAllUsers(); const hasMasterUser = users.some( (user) => normalizeEmail(user.email) === normalizedMasterEmail ); if (!hasMasterUser) { await adapter.addUser({ email: normalizedMasterEmail, role: "admin" }); } }; return { name: `${name}/auth`, version, handlers: { auth: () => toNextJsHandler(authServer()) }, adapter: { prebuild: async () => { await adapter.prebuild(); await ensureMasterUser(); }, getCurrentUser: async () => { try { const session = await authServer().api.getSession({ headers: await headers() }); if (!session?.user?.id || !session.user.email || !session.user.role) { return null; } return { id: session.user.id, email: session.user.email, role: session.user.role }; } catch { return null; } }, signOut: async () => { await authServer().api.signOut({ headers: await headers() }); }, signIn: async ({ email }) => { await authServer().api.sendVerificationOTP({ body: { email, type: "sign-in" } }); } } }; }; export { authPlugin };