-- ============================================================================== -- GAMILIT - SCHEMA AUTH -- ============================================================================== -- Tablas de autenticacion y usuarios -- Mantenido por: Database-Agent -- Actualizado: 2025-12-18 -- ============================================================================== -- ------------------------------------------------------------------------------ -- TABLA: USERS -- ------------------------------------------------------------------------------ CREATE TABLE IF NOT EXISTS users ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), email VARCHAR(255) UNIQUE NOT NULL, password_hash VARCHAR(255) NOT NULL, first_name VARCHAR(100), last_name VARCHAR(100), avatar_url TEXT, status VARCHAR(50) DEFAULT 'active', email_verified BOOLEAN DEFAULT false, email_verified_at TIMESTAMPTZ, last_login_at TIMESTAMPTZ, tenant_id UUID REFERENCES tenants(id) ON DELETE CASCADE, created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP, deleted_at TIMESTAMPTZ ); CREATE INDEX idx_users_email ON users(email); CREATE INDEX idx_users_tenant ON users(tenant_id); CREATE INDEX idx_users_status ON users(status); CREATE INDEX idx_users_deleted ON users(deleted_at) WHERE deleted_at IS NULL; CREATE TRIGGER update_users_updated_at BEFORE UPDATE ON users FOR EACH ROW EXECUTE FUNCTION update_updated_at_column(); -- ------------------------------------------------------------------------------ -- TABLA: USER_ROLES -- ------------------------------------------------------------------------------ CREATE TABLE IF NOT EXISTS user_roles ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, role_id UUID NOT NULL REFERENCES roles(id) ON DELETE CASCADE, assigned_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP, assigned_by UUID REFERENCES users(id), UNIQUE(user_id, role_id) ); CREATE INDEX idx_user_roles_user ON user_roles(user_id); CREATE INDEX idx_user_roles_role ON user_roles(role_id); -- ------------------------------------------------------------------------------ -- TABLA: REFRESH_TOKENS -- ------------------------------------------------------------------------------ CREATE TABLE IF NOT EXISTS refresh_tokens ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, token_hash VARCHAR(255) NOT NULL, expires_at TIMESTAMPTZ NOT NULL, revoked_at TIMESTAMPTZ, created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP, user_agent TEXT, ip_address VARCHAR(45) ); CREATE INDEX idx_refresh_tokens_user ON refresh_tokens(user_id); CREATE INDEX idx_refresh_tokens_expires ON refresh_tokens(expires_at); -- ------------------------------------------------------------------------------ -- TABLA: PASSWORD_RESETS -- ------------------------------------------------------------------------------ CREATE TABLE IF NOT EXISTS password_resets ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, token_hash VARCHAR(255) NOT NULL, expires_at TIMESTAMPTZ NOT NULL, used_at TIMESTAMPTZ, created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP ); CREATE INDEX idx_password_resets_user ON password_resets(user_id); CREATE INDEX idx_password_resets_expires ON password_resets(expires_at);