// Create Better Auth instance with organization plugin for multi-tenancy
export const createAuth = (
ctx: GenericCtx<DataModel>,
{ optionsOnly } = { optionsOnly: false },
) => {
return betterAuth({
// Disable logging when createAuth is called just to generate options
logger: {
disabled: optionsOnly,
},
baseURL: siteUrl,
database: authComponent.adapter(ctx),
// Email/password authentication (non-verified for now)
emailAndPassword: {
enabled: true,
requireEmailVerification: false,
// Optional: add password requirements
minPasswordLength: 8,
},
// User table configuration
user: {
// Additional user fields beyond Better Auth defaults
additionalFields: {
// Platform-level role - stored in userProfiles instead
// Don't add custom fields here as they cause validation errors
// Use triggers to sync to userProfiles table
},
},
plugins: [
// The Convex plugin is required for Convex compatibility
convex(),
// Organization plugin for multi-company support with custom RBAC
organization({
// Access Control configuration
ac,
// Custom roles with fine-grained permissions
roles: {
owner: ownerRole,
admin: adminRole,
contest_admin: contestAdminRole,
},
// Set creator as owner by default
creatorRole: "owner",
// We don't need teams - companies are top-level organizations
teams: {
enabled: false,
},
}),
],
});
};
// Create Better Auth instance with organization plugin for multi-tenancy
export const createAuth = (
ctx: GenericCtx<DataModel>,
{ optionsOnly } = { optionsOnly: false },
) => {
return betterAuth({
// Disable logging when createAuth is called just to generate options
logger: {
disabled: optionsOnly,
},
baseURL: siteUrl,
database: authComponent.adapter(ctx),
// Email/password authentication (non-verified for now)
emailAndPassword: {
enabled: true,
requireEmailVerification: false,
// Optional: add password requirements
minPasswordLength: 8,
},
// User table configuration
user: {
// Additional user fields beyond Better Auth defaults
additionalFields: {
// Platform-level role - stored in userProfiles instead
// Don't add custom fields here as they cause validation errors
// Use triggers to sync to userProfiles table
},
},
plugins: [
// The Convex plugin is required for Convex compatibility
convex(),
// Organization plugin for multi-company support with custom RBAC
organization({
// Access Control configuration
ac,
// Custom roles with fine-grained permissions
roles: {
owner: ownerRole,
admin: adminRole,
contest_admin: contestAdminRole,
},
// Set creator as owner by default
creatorRole: "owner",
// We don't need teams - companies are top-level organizations
teams: {
enabled: false,
},
}),
],
});
};