@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
JavaScript
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
};