-- Better Auth Core Tables Migration -- Creates user, session, account, and verification tables for Better Auth -- User table CREATE TABLE IF NOT EXISTS "user" ( id TEXT PRIMARY KEY, name TEXT NOT NULL, email TEXT NOT NULL UNIQUE, email_verified BOOLEAN NOT NULL DEFAULT FALSE, image TEXT, role TEXT DEFAULT 'user', banned BOOLEAN DEFAULT FALSE, banned_reason TEXT, ban_expires TIMESTAMP, requires_setup BOOLEAN DEFAULT FALSE, created_at TIMESTAMP NOT NULL DEFAULT NOW(), updated_at TIMESTAMP NOT NULL DEFAULT NOW() ); -- Session table CREATE TABLE IF NOT EXISTS "session" ( id TEXT PRIMARY KEY, user_id TEXT NOT NULL REFERENCES "user"(id) ON DELETE CASCADE, token TEXT NOT NULL UNIQUE, expires_at TIMESTAMP NOT NULL, ip_address TEXT, user_agent TEXT, created_at TIMESTAMP NOT NULL DEFAULT NOW(), updated_at TIMESTAMP NOT NULL DEFAULT NOW() ); -- Account table (for OAuth providers) CREATE TABLE IF NOT EXISTS "account" ( id TEXT PRIMARY KEY, user_id TEXT NOT NULL REFERENCES "user"(id) ON DELETE CASCADE, account_id TEXT NOT NULL, provider_id TEXT NOT NULL, access_token TEXT, refresh_token TEXT, access_token_expires_at TIMESTAMP, refresh_token_expires_at TIMESTAMP, scope TEXT, id_token TEXT, password TEXT, created_at TIMESTAMP NOT NULL DEFAULT NOW(), updated_at TIMESTAMP NOT NULL DEFAULT NOW() ); -- Verification table (for magic links, email verification, etc.) CREATE TABLE IF NOT EXISTS "verification" ( id TEXT PRIMARY KEY, identifier TEXT NOT NULL, value TEXT NOT NULL, expires_at TIMESTAMP NOT NULL, created_at TIMESTAMP NOT NULL DEFAULT NOW(), updated_at TIMESTAMP NOT NULL DEFAULT NOW() ); -- Two-factor authentication table CREATE TABLE IF NOT EXISTS "two_factor" ( id TEXT PRIMARY KEY, user_id TEXT NOT NULL REFERENCES "user"(id) ON DELETE CASCADE, secret TEXT NOT NULL, backup_codes TEXT NOT NULL, created_at TIMESTAMP NOT NULL DEFAULT NOW(), updated_at TIMESTAMP NOT NULL DEFAULT NOW() ); -- Indexes for performance CREATE INDEX IF NOT EXISTS idx_session_user_id ON "session"(user_id); CREATE INDEX IF NOT EXISTS idx_session_token ON "session"(token); CREATE INDEX IF NOT EXISTS idx_account_user_id ON "account"(user_id); CREATE INDEX IF NOT EXISTS idx_account_provider ON "account"(provider_id, account_id); CREATE INDEX IF NOT EXISTS idx_verification_identifier ON "verification"(identifier); CREATE INDEX IF NOT EXISTS idx_user_email ON "user"(email); CREATE INDEX IF NOT EXISTS idx_two_factor_user_id ON "two_factor"(user_id);