# Plan de Refactorización - Mejora de Mantenibilidad

**Fecha:** 2024
**Estado:** Propuesto
**Objetivo:** Mejorar la mantenibilidad del código eliminando duplicación y reduciendo la complejidad de archivos grandes.

## Resumen Ejecutivo

El proyecto ha crecido orgánicamente y presenta varios problemas de mantenibilidad:
- **19 duplicaciones** de la función `toIsoSql`
- **Múltiples duplicaciones** de `sha256Hex` en tests
- **Archivos excesivamente grandes**: `group-sync.ts` (1307 líneas), `server.ts` (665 líneas)
- **Código compartido duplicado** entre `src/` (bot) y `apps/web/`
- **Setup repetitivo** en tests (60+ archivos)

Este plan aborda estos problemas en 4 fases priorizadas.

---

## 🔴 Fase 1: Eliminación de Duplicación de Utilidades (1-2 horas)

**Prioridad:** CRÍTICA  
**Impacto:** Alto (reduce ~150 líneas duplicadas)  
**Riesgo:** Bajo (cambio mecánico)

### Objetivos
1. Centralizar función `toIsoSql` en un único lugar
2. Centralizar función `sha256Hex` para tests
3. Eliminar todas las duplicaciones mediante imports

### Archivos a Crear

#### `src/utils/date.ts`
- Exportar función `toIsoSql(d?: Date): string`
- Documentar formato de salida (ISO SQL: `YYYY-MM-DD HH:MM:SS.mmm`)

#### `tests/helpers/crypto.ts`
- Exportar función `sha256Hex(input: string): Promise<string>`
- Reutilizar en todos los tests web y unit

### Archivos a Modificar

**Archivos con `toIsoSql` duplicada (19 archivos):**
- `apps/web/src/hooks.server.ts`
- `apps/web/src/routes/api/tasks/[id]/claim/+server.ts`
- `apps/web/src/routes/api/tasks/[id]/uncomplete/+server.ts`
- `src/services/group-sync.ts`
- `tests/unit/services/cleanup-inactive.test.ts`
- `tests/unit/tasks/complete-reaction.test.ts`
- `tests/unit/services/metrics-health.test.ts`
- `tests/unit/services/response-queue.cleanup.test.ts`
- `tests/web/api.integrations.feeds.test.ts`
- `tests/web/api.me.preferences.test.ts`
- `tests/web/api.me.tasks.test.ts`
- `tests/web/api.tasks.complete.reaction.test.ts`
- `tests/web/app.integrations.page.test.ts`
- `tests/web/app.preferences.page.test.ts`
- Y otros según `grep -rn "function toIsoSql"`

**Archivos con `sha256Hex` duplicada:**
- `tests/web/api.integrations.feeds.test.ts`
- `tests/web/api.me.preferences.test.ts`
- `tests/web/api.me.tasks.test.ts`
- `tests/web/app.integrations.page.test.ts`
- `tests/web/app.preferences.page.test.ts`
- Verificar que `src/utils/crypto.ts` y `apps/web/src/lib/server/crypto.ts` no estén duplicados

### Pasos de Ejecución
1. Crear `src/utils/date.ts` con implementación de referencia
2. Crear `tests/helpers/crypto.ts` con implementación de referencia
3. Buscar y reemplazar imports en todos los archivos afectados
4. Eliminar definiciones locales de las funciones
5. Ejecutar suite completa de tests: `bun test`
6. Verificar que no hay regresiones

### Criterios de Éxito
- ✅ Todos los tests pasan
- ✅ Solo existe 1 definición de `toIsoSql` en el código fuente
- ✅ Solo existe 1 definición de `sha256Hex` en tests
- ✅ Reducción de ~150 líneas de código

---

## 🔴 Fase 2: División de `group-sync.ts` (3-4 horas)

**Prioridad:** CRÍTICA  
**Impacto:** Alto (mejora legibilidad y testabilidad)  
**Riesgo:** Medio (requiere análisis cuidadoso)

### Objetivos
1. Dividir archivo monolítico de 1307 líneas en módulos cohesivos
2. Separar responsabilidades claramente
3. Facilitar testing unitario de cada componente
4. Mantener API pública compatible

### Análisis Previo Necesario

**Archivos a consultar para entender el alcance:**
- `src/services/group-sync.ts` (archivo principal a dividir)
- `tests/unit/services/group-sync.test.ts`
- `tests/unit/services/group-sync.onboarding.test.ts`
- `tests/unit/services/group-sync.coverage.test.ts`
- `tests/unit/services/group-sync.gating.test.ts`
- `tests/unit/services/group-sync.label-update.test.ts`
- `tests/unit/services/group-sync.sync-members.test.ts`
- `tests/unit/services/group-sync.members.test.ts`
- `tests/unit/services/group-sync.fetch-members.test.ts`
- `tests/unit/services/group-sync.scheduler.test.ts`
- `tests/unit/services/group-sync.scheduler.gating.test.ts`

**Identificar en el código:**
- Funciones públicas vs privadas
- Responsabilidades principales (sincronización, scheduling, gating, eventos)
- Dependencias entre funciones
- Estado compartido (si existe)

### Estructura Propuesta

