Files
fullstack-fuware/src/lib/auth.ts
Sam a4e96fe045 - added settings page and function
- add Role Ring for avatar and display role for user nav
2026-01-06 21:37:53 +07:00

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',
},
});
},
},
},
},
});