301 lines
6.6 KiB
Markdown
301 lines
6.6 KiB
Markdown
|
|
# 🎮 Feature Flags - Guía Rápida de Instalación
|
||
|
|
|
||
|
|
## 📦 Lo que se creó
|
||
|
|
|
||
|
|
1. **Schema de Prisma** (`prisma/schema.prisma`)
|
||
|
|
- Modelo `FeatureFlag` con todos los campos necesarios
|
||
|
|
|
||
|
|
2. **Servicio Principal** (`src/core/services/FeatureFlagService.ts`)
|
||
|
|
- Singleton con caché en memoria
|
||
|
|
- Evaluación de flags con contexto
|
||
|
|
- Estrategias de rollout (percentage, whitelist, blacklist, gradual, random)
|
||
|
|
- Sistema de estadísticas
|
||
|
|
|
||
|
|
3. **Tipos TypeScript** (`src/core/types/featureFlags.ts`)
|
||
|
|
- Tipos completos para el sistema
|
||
|
|
- Interfaces para configuración y evaluación
|
||
|
|
|
||
|
|
4. **Helpers y Decoradores** (`src/core/lib/featureFlagHelpers.ts`)
|
||
|
|
- `@RequireFeature` - Decorador para proteger métodos
|
||
|
|
- `featureGuard` - Guard con respuesta automática
|
||
|
|
- `isFeatureEnabled` - Check básico
|
||
|
|
- `abTest` - A/B testing
|
||
|
|
- Y más...
|
||
|
|
|
||
|
|
5. **Comando de Administración** (`src/commands/admin/featureflags.ts`)
|
||
|
|
- Crear, listar, actualizar, eliminar flags
|
||
|
|
- Configurar rollouts
|
||
|
|
- Ver estadísticas
|
||
|
|
|
||
|
|
6. **Loader** (`src/core/loaders/featureFlagsLoader.ts`)
|
||
|
|
- Inicialización automática del servicio
|
||
|
|
|
||
|
|
7. **Documentación** (`README/FEATURE_FLAGS_SYSTEM.md`)
|
||
|
|
- Guía completa con ejemplos
|
||
|
|
|
||
|
|
8. **Scripts** (`scripts/setupFeatureFlags.ts`)
|
||
|
|
- Setup inicial con flags de ejemplo
|
||
|
|
|
||
|
|
9. **Ejemplos** (`src/examples/featureFlagsUsage.ts`)
|
||
|
|
- 11 patrones de uso diferentes
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 🚀 Instalación (Paso a Paso)
|
||
|
|
|
||
|
|
### 1. Genera el cliente de Prisma
|
||
|
|
|
||
|
|
```bash
|
||
|
|
npx prisma generate
|
||
|
|
```
|
||
|
|
|
||
|
|
Esto creará los tipos TypeScript para el nuevo modelo `FeatureFlag`.
|
||
|
|
|
||
|
|
### 2. Ejecuta la migración
|
||
|
|
|
||
|
|
```bash
|
||
|
|
npx prisma migrate dev --name add_feature_flags
|
||
|
|
```
|
||
|
|
|
||
|
|
Esto creará la tabla en tu base de datos.
|
||
|
|
|
||
|
|
### 3. (Opcional) Crea flags de ejemplo
|
||
|
|
|
||
|
|
```bash
|
||
|
|
npx tsx scripts/setupFeatureFlags.ts
|
||
|
|
```
|
||
|
|
|
||
|
|
Esto creará 8 feature flags de ejemplo para que puedas probar el sistema.
|
||
|
|
|
||
|
|
### 4. Integra el loader en tu bot
|
||
|
|
|
||
|
|
Abre tu archivo principal donde cargas los servicios (probablemente `src/main.ts` o similar) y añade:
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
import { loadFeatureFlags } from './core/loaders/featureFlagsLoader';
|
||
|
|
|
||
|
|
// Antes de iniciar el bot
|
||
|
|
await loadFeatureFlags();
|
||
|
|
```
|
||
|
|
|
||
|
|
O si tienes un sistema de loaders centralizado, simplemente impórtalo ahí.
|
||
|
|
|
||
|
|
### 5. ¡Listo! Empieza a usar feature flags
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 💡 Uso Rápido
|
||
|
|
|
||
|
|
### En un comando nuevo o existente:
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
import { featureGuard } from '@/core/lib/featureFlagHelpers';
|
||
|
|
|
||
|
|
export async function execute(interaction: CommandInteraction) {
|
||
|
|
// Check si el flag está habilitado
|
||
|
|
if (!await featureGuard('new_feature', interaction)) {
|
||
|
|
return; // Automáticamente responde al usuario si está disabled
|
||
|
|
}
|
||
|
|
|
||
|
|
// Tu código aquí (solo se ejecuta si el flag está habilitado)
|
||
|
|
await interaction.reply('✨ Feature habilitada!');
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### Crear un flag desde Discord:
|
||
|
|
|
||
|
|
```
|
||
|
|
/featureflags create name:new_feature status:disabled target:global description:"Mi nueva feature"
|
||
|
|
```
|
||
|
|
|
||
|
|
### Habilitarlo:
|
||
|
|
|
||
|
|
```
|
||
|
|
/featureflags update flag:new_feature status:enabled
|
||
|
|
```
|
||
|
|
|
||
|
|
### Rollout progresivo (25% de usuarios):
|
||
|
|
|
||
|
|
```
|
||
|
|
/featureflags rollout flag:new_feature strategy:percentage percentage:25
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 🎯 Casos de Uso Comunes
|
||
|
|
|
||
|
|
### 1. Desplegar una feature nueva gradualmente
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Día 1: Deshabilitada, en desarrollo
|
||
|
|
/featureflags create name:pvp_system status:disabled target:global
|
||
|
|
|
||
|
|
# Día 5: Beta testing con usuarios específicos
|
||
|
|
/featureflags rollout flag:pvp_system strategy:whitelist
|
||
|
|
# (añade IDs mediante código o actualiza la config)
|
||
|
|
|
||
|
|
# Día 10: 10% de usuarios
|
||
|
|
/featureflags rollout flag:pvp_system strategy:percentage percentage:10
|
||
|
|
|
||
|
|
# Día 15: 50% de usuarios
|
||
|
|
/featureflags update flag:pvp_system
|
||
|
|
/featureflags rollout flag:pvp_system strategy:percentage percentage:50
|
||
|
|
|
||
|
|
# Día 20: 100% de usuarios
|
||
|
|
/featureflags update flag:pvp_system status:enabled
|
||
|
|
|
||
|
|
# Día 30: Eliminar el flag y el código del check
|
||
|
|
/featureflags delete flag:pvp_system
|
||
|
|
```
|
||
|
|
|
||
|
|
### 2. A/B Testing
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
import { abTest, extractContext } from '@/core/lib/featureFlagHelpers';
|
||
|
|
|
||
|
|
const context = extractContext(interaction);
|
||
|
|
|
||
|
|
await abTest('new_algorithm', context, {
|
||
|
|
variant: async () => {
|
||
|
|
// 50% de usuarios ven esto
|
||
|
|
return newAlgorithm();
|
||
|
|
},
|
||
|
|
control: async () => {
|
||
|
|
// 50% ven esto
|
||
|
|
return oldAlgorithm();
|
||
|
|
}
|
||
|
|
});
|
||
|
|
```
|
||
|
|
|
||
|
|
### 3. Kill Switch (emergencias)
|
||
|
|
|
||
|
|
Si hay un bug crítico en una feature:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
/featureflags update flag:problematic_feature status:maintenance
|
||
|
|
```
|
||
|
|
|
||
|
|
Esto la deshabilitará inmediatamente sin necesidad de redeploy.
|
||
|
|
|
||
|
|
### 4. Eventos temporales
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
// Configurar con fechas
|
||
|
|
await featureFlagService.setFlag({
|
||
|
|
name: 'christmas_event',
|
||
|
|
status: 'enabled',
|
||
|
|
target: 'global',
|
||
|
|
startDate: new Date('2025-12-15'),
|
||
|
|
endDate: new Date('2025-12-31')
|
||
|
|
});
|
||
|
|
|
||
|
|
// El flag se auto-deshabilitará el 1 de enero
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 📊 Monitoreo
|
||
|
|
|
||
|
|
### Ver estadísticas de uso:
|
||
|
|
|
||
|
|
```
|
||
|
|
/featureflags stats flag:nombre_flag
|
||
|
|
```
|
||
|
|
|
||
|
|
Te mostrará:
|
||
|
|
- Total de evaluaciones
|
||
|
|
- Cuántas veces se habilitó
|
||
|
|
- Cuántas veces se deshabilitó
|
||
|
|
- Tasa de habilitación (%)
|
||
|
|
|
||
|
|
### Ver todos los flags:
|
||
|
|
|
||
|
|
```
|
||
|
|
/featureflags list
|
||
|
|
```
|
||
|
|
|
||
|
|
### Refrescar caché:
|
||
|
|
|
||
|
|
```
|
||
|
|
/featureflags refresh
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 🔧 Troubleshooting
|
||
|
|
|
||
|
|
### Los flags no se aplican
|
||
|
|
|
||
|
|
1. Verifica que el servicio está inicializado:
|
||
|
|
```typescript
|
||
|
|
await loadFeatureFlags();
|
||
|
|
```
|
||
|
|
|
||
|
|
2. Refresca el caché:
|
||
|
|
```
|
||
|
|
/featureflags refresh
|
||
|
|
```
|
||
|
|
|
||
|
|
3. Verifica que el flag existe:
|
||
|
|
```
|
||
|
|
/featureflags info flag:nombre_flag
|
||
|
|
```
|
||
|
|
|
||
|
|
### Errores de TypeScript
|
||
|
|
|
||
|
|
Si ves errores tipo "Property 'featureFlag' does not exist":
|
||
|
|
|
||
|
|
```bash
|
||
|
|
npx prisma generate
|
||
|
|
```
|
||
|
|
|
||
|
|
Esto regenerará los tipos de Prisma.
|
||
|
|
|
||
|
|
### La migración falla
|
||
|
|
|
||
|
|
Si la migración falla, verifica tu conexión a la base de datos en `.env`:
|
||
|
|
|
||
|
|
```env
|
||
|
|
XATA_DB="postgresql://..."
|
||
|
|
XATA_SHADOW_DB="postgresql://..."
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 📚 Recursos
|
||
|
|
|
||
|
|
- **Documentación completa**: `README/FEATURE_FLAGS_SYSTEM.md`
|
||
|
|
- **Ejemplos de uso**: `src/examples/featureFlagsUsage.ts`
|
||
|
|
- **Tipos**: `src/core/types/featureFlags.ts`
|
||
|
|
- **Servicio**: `src/core/services/FeatureFlagService.ts`
|
||
|
|
- **Helpers**: `src/core/lib/featureFlagHelpers.ts`
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 🎉 ¡Listo!
|
||
|
|
|
||
|
|
Ahora tienes un sistema completo de Feature Flags. Puedes:
|
||
|
|
|
||
|
|
✅ Desplegar features sin miedo a romper producción
|
||
|
|
✅ Hacer rollouts progresivos
|
||
|
|
✅ A/B testing
|
||
|
|
✅ Kill switches para emergencias
|
||
|
|
✅ Eventos temporales
|
||
|
|
✅ Beta testing con usuarios específicos
|
||
|
|
✅ Monitorear el uso de cada feature
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
**Tip Pro**: Combina feature flags con tus deployments. Por ejemplo:
|
||
|
|
|
||
|
|
1. Despliega código nuevo con flag disabled
|
||
|
|
2. Verifica que el deploy fue exitoso
|
||
|
|
3. Habilita el flag progresivamente (10% → 50% → 100%)
|
||
|
|
4. Monitorea métricas/errores
|
||
|
|
5. Si hay problemas, desactiva el flag instantáneamente
|
||
|
|
6. Una vez estable, elimina el flag y el código antiguo
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
Creado con 🎮 para Amayo Bot
|