@ragrabbit/mcp
by madarco
Verified
- packages
- auth
import NextAuth, { DefaultSession, NextAuthResult, Session } from "./auth";
import authConfig from "./config";
import { logger } from "@repo/logger";
import { redirect } from "next/navigation";
import { DrizzleAdapter } from "@auth/drizzle-adapter";
import db from "@repo/db";
import {
User,
usersTable,
accountsTable,
sessionsTable,
verificationTokensTable,
authenticatorsTable,
} from "@repo/db/schema";
const log = logger.child({ context: "auth" });
declare module "next-auth" {
interface Session extends DefaultSession {
user: {
organizationId: number;
} & DefaultSession["user"];
}
}
log.info({ providers: authConfig.providers.map((p) => p?.name) }, "Auth config");
const result: NextAuthResult = NextAuth({
adapter: DrizzleAdapter(db, {
usersTable,
accountsTable,
sessionsTable,
verificationTokensTable,
authenticatorsTable,
}),
...authConfig,
callbacks: {
/** Extends the session.user object to keep also the id and organizationId values */
session({ session, token }) {
session.user.id = token.sub as string;
session.user.organizationId = token.orgId as number;
return session;
},
/** Extends the JWT token to keep also the orgId value */
async jwt({ token, account, user }) {
if (account && user && "organizationId" in user) {
log.info({ user }, "New user registered");
if (!user.organizationId) {
const defaultOrg = await db.query.organizationsTable.findFirst();
if (defaultOrg) {
user.organizationId = defaultOrg.id;
await db.insert(usersTable).values({
where: { id: user.id },
data: { organizationId: defaultOrg.id },
});
}
}
token.orgId = user.organizationId;
}
return token;
},
},
logger: {
error(error) {
log.error(error);
},
warn(code) {
log.warn(code);
},
debug(message, meta: any) {
log.trace({ ...meta }, message);
},
},
});
export const handlers: NextAuthResult["handlers"] = result.handlers;
export const signIn: NextAuthResult["signIn"] = result.signIn;
export const signOut: NextAuthResult["signOut"] = result.signOut;
export const auth: NextAuthResult["auth"] = result.auth;
export async function authOrLogin(): Promise<Session> {
const session = await auth();
log.info({ session }, "authOrLogin");
if (!session || !session.user || !session.user.id) {
log.info("Redirecting to signin");
redirect("/api/auth/signin");
}
return session;
}