import { prisma } from '@/db'; import { User } from '@/generated/prisma/client'; import { SessionModel } from '@/generated/prisma/models'; import { acOrg, adminOrg, member, owner, } from '@/lib/auth/organization-permissions'; import { ac, admin, user } from '@/lib/auth/permissions'; import { betterAuth } from 'better-auth'; import { prismaAdapter } from 'better-auth/adapters/prisma'; import { admin as adminPlugin, organization } from 'better-auth/plugins'; export interface Session { session: SessionModel | null | undefined; user?: User; } export const auth = betterAuth({ database: prismaAdapter(prisma, { provider: 'postgresql', }), experimental: { joins: true }, emailAndPassword: { enabled: true, requireEmailVerification: false, }, trustedOrigins: ['http://localhost:3001'], advanced: { database: { generateId: false, }, }, plugins: [ adminPlugin({ ac, roles: { admin, user }, defaultRole: 'user', }), organization({ ac: acOrg, roles: { owner, admin: adminOrg, member }, schema: { organization: { additionalFields: { color: { type: 'string', defaultValue: '#000000', }, }, }, }, }), ], databaseHooks: { user: { create: { after: async (user) => { await auth.api.createOrganization({ body: { name: `${user.name || 'User'}'s Organization`, slug: `${user.name?.toLowerCase().replace(/\s+/g, '-')}-${Date.now()}`, userId: user.id, color: '#000000', }, }); }, }, }, }, });