codalware-auth
Version:
Complete authentication system with enterprise security, attack protection, team workspaces, waitlist, billing, UI components, 2FA, and account recovery - production-ready in 5 minutes. Enhanced CLI with verification, rollback, and App Router scaffolding.
143 lines (126 loc) • 4.38 kB
text/typescript
export type ID = string;
export type User = {
id: ID;
email: string;
emailVerified?: Date | null;
name?: string | null;
createdAt: Date;
updatedAt: Date;
metadata?: Record<string, any> | null;
};
export type Session = {
id: ID;
userId: ID;
createdAt: Date;
expiresAt: Date;
handle?: string | null;
metadata?: Record<string, any> | null;
};
export type MagicToken = {
id: ID;
tokenHash: string;
userId: ID | null;
createdAt: Date;
expiresAt: Date;
consumedAt?: Date | null;
ip?: string | null;
userAgent?: string | null;
};
export type SecuritySettings = {
id: ID;
tenantId: ID;
signUpMode: string;
enableEmailVerification: boolean;
enableLockoutPolicy: boolean;
maxLoginAttempts: number;
lockoutDuration: number;
resetAfter: number;
enableUserEnumerationProtection: boolean;
enableBotProtection: boolean;
blockDisposableEmails: boolean;
blockEmailSubaddresses: boolean;
applyToSignIn: boolean;
passwordMinLength: number;
passwordRequireUppercase: boolean;
passwordRequireLowercase: boolean;
passwordRequireNumbers: boolean;
passwordRequireSpecialChars: boolean;
passwordExpiryDays: number | null;
sessionTimeoutMinutes: number;
maxConcurrentSessions: number;
enableRemoteLogout: boolean;
enableIPWhitelist: boolean;
enableIPBlacklist: boolean;
requireMFAForAdmins: boolean;
createdAt: Date;
updatedAt: Date;
};
export type EmailRule = {
id: ID;
tenantId: ID;
emailOrDomain: string;
description?: string | null;
createdAt: Date;
};
export type LoginAttempt = {
id: ID;
tenantId: ID;
email: string;
ipAddress: string;
userAgent: string;
success: boolean;
failureReason?: string | null;
attemptedAt: Date;
};
export type AccountLockout = {
id: ID;
userId: ID;
tenantId: ID;
lockedAt: Date;
lockedUntil: Date;
reason: string;
};
export interface Adapter {
// Users
createUser(user: { email: string; name?: string; metadata?: any }): Promise<User>;
getUserById(id: ID): Promise<User | null>;
getUserByEmail(email: string): Promise<User | null>;
updateUser(id: ID, patch: Partial<User>): Promise<User>;
// Sessions
createSession(session: Partial<Session> & { userId: ID; expiresAt: Date }): Promise<Session>;
getSessionById(id: ID): Promise<Session | null>;
deleteSession(id: ID): Promise<void>;
deleteSessionsByUserId(userId: ID): Promise<void>;
// Magic link tokens
storeMagicToken(token: {
tokenHash: string;
userId?: ID | null;
expiresAt: Date;
ip?: string | null;
userAgent?: string | null;
}): Promise<MagicToken>;
findValidMagicToken(tokenHash: string): Promise<MagicToken | null>;
consumeMagicToken(id: ID): Promise<void>;
// Security Settings (optional - for security features)
getSecuritySettings?(tenantId: ID): Promise<SecuritySettings | null>;
createSecuritySettings?(data: Omit<SecuritySettings, 'id' | 'createdAt' | 'updatedAt'>): Promise<SecuritySettings>;
updateSecuritySettings?(tenantId: ID, updates: Partial<SecuritySettings>): Promise<SecuritySettings>;
// Email Allow/Block Lists (optional)
getEmailAllowlist?(tenantId: ID): Promise<EmailRule[]>;
addEmailToAllowlist?(data: { tenantId: ID; emailOrDomain: string; description?: string }): Promise<EmailRule>;
removeEmailFromAllowlist?(id: ID): Promise<void>;
getEmailBlocklist?(tenantId: ID): Promise<EmailRule[]>;
addEmailToBlocklist?(data: { tenantId: ID; emailOrDomain: string; description?: string }): Promise<EmailRule>;
removeEmailFromBlocklist?(id: ID): Promise<void>;
// Login Attempts (optional)
recordLoginAttempt?(data: Omit<LoginAttempt, 'id' | 'attemptedAt'>): Promise<LoginAttempt>;
getLoginAttempts?(tenantId: ID, options?: { limit?: number; offset?: number }): Promise<LoginAttempt[]>;
// Account Lockouts (optional)
getLockedAccounts?(tenantId: ID): Promise<(AccountLockout & { user?: any })[]>;
lockAccount?(data: { userId: ID; tenantId: ID; lockedUntil: Date; reason: string }): Promise<AccountLockout>;
unlockAccount?(id: ID): Promise<void>;
getAccountLockout?(userId: ID): Promise<AccountLockout | null>;
// Optional existing
linkAccount?(data: any): Promise<void>;
getAccount?(query: any): Promise<any>;
}