73 lines
1.7 KiB
TypeScript
73 lines
1.7 KiB
TypeScript
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',
|
|
},
|
|
});
|
|
},
|
|
},
|
|
},
|
|
},
|
|
});
|