# ChatApp

Plataforma de comunicación tipo Slack construida como monorepo con arquitectura de microservicios.

## 📋 Descripción

ChatApp es una aplicación de mensajería empresarial inspirada en Slack, construida con un backend NestJS (API REST + WebSockets + Workers), un frontend Next.js, y servicios de infraestructura incluyendo PostgreSQL (con pgvector), Redis, MinIO y Meilisearch.

### Características principales

- **Autenticación completa**: JWT, registro, login, refresh tokens, sesiones
- **Canales**: públicos, privados, archivación, miembros, invitaciones
- **Mensajería**: envío, edición, eliminación (soft delete), threads, reacciones, guardado
- **Tiempo real**: WebSocket gateway con Socket.io + Redis adapter
- **Búsqueda full-text**: Integración con Meilisearch
- **Almacenamiento de archivos**: MinIO (S3-compatible)
- **Background jobs**: BullMQ workers para emails, notificaciones, indexación
- **IA**: Embeddings vectoriales, resúmenes, conversaciones
- **Multi-tenant**: Workspaces con roles, permisos y configuraciones

## 🛠️ Stack Tecnológico

| Componente    | Tecnología                                      |
|---------------|------------------------------------------------|
| **Backend**   | NestJS 11, TypeScript, Node.js 20              |
| **Frontend**  | Next.js 14 (App Router), React 18, Tailwind CSS |
| **Database**  | PostgreSQL 16 + pgvector                       |
| **ORM**       | Prisma 6 (multi-schema)                        |
| **Cache/PubSub** | Redis 7                                     |
| **Storage**   | MinIO (S3-compatible)                          |
| **Search**    | Meilisearch                                    |
| **Realtime**  | Socket.io + Redis adapter                      |
| **Queue**     | BullMQ                                          |
| **Monorepo**  | npm workspaces + Turborepo                     |
| **Containers**| Docker + Docker Compose                         |

## 🚀 Cómo arrancar

### Prerrequisitos

- Docker y Docker Compose
- Node.js 20+
- npm 10+

### 1. Levantar infraestructura

```bash
# Iniciar PostgreSQL, Redis, MinIO, Meilisearch y Mailhog
docker compose up -d
```

### 2. Instalar dependencias

```bash
npm install --legacy-peer-deps
```

### 3. Configurar base de datos

```bash
# Generar Prisma Client
npm run db:generate

# Ejecutar migraciones
npm run db:migrate

# (Opcional) Cargar datos de prueba
npx ts-node scripts/seed.ts
```

### 4. Desarrollo

```bash
# Levantar todos los servicios en modo desarrollo
npm run dev

# O individualmente:
npm run dev:api       # API en puerto 3010
npm run dev:realtime  # WebSocket en puerto 3002
npm run dev:web       # Frontend en puerto 3001
```

### 5. Producción con Docker

```bash
# Construir y levantar todos los servicios
docker compose -f docker-compose.prod.yml up -d --build
```

## 📁 Estructura del Monorepo

```
chatapp/
├── backend/
│   ├── apps/
│   │   ├── api/          # REST API (NestJS) - Puerto 3010
│   │   │   ├── src/
│   │   │   │   ├── modules/
│   │   │   │   │   ├── auth/       # Autenticación JWT
│   │   │   │   │   ├── channels/   # Gestión de canales
│   │   │   │   │   ├── messages/   # Mensajería y threads
│   │   │   │   │   ├── users/      # Perfiles de usuario
│   │   │   │   │   ├── workspaces/ # Multi-tenancy
│   │   │   │   │   ├── files/      # Subida de archivos
│   │   │   │   │   ├── search/     # Búsqueda full-text
│   │   │   │   │   ├── dms/        # Mensajes directos
│   │   │   │   │   ├── notifications/
│   │   │   │   │   ├── integrations/
│   │   │   │   │   ├── lists/
│   │   │   │   │   ├── canvas/
│   │   │   │   │   ├── huddles/
│   │   │   │   │   ├── admin/
│   │   │   │   │   └── ai/
│   │   │   │   ├── common/          # Guards, decorators, filters, interceptors
│   │   │   │   └── main.ts
│   │   │   ├── test/
│   │   │   │   └── e2e/            # Tests E2E (Jest + Supertest)
│   │   │   ├── Dockerfile
│   │   │   └── package.json
│   │   ├── realtime/      # WebSocket Gateway - Puerto 3002
│   │   │   ├── src/
│   │   │   ├── Dockerfile
│   │   │   └── package.json
│   │   └── workers/       # Background Workers (BullMQ)
│   │       ├── src/
│   │       ├── Dockerfile
│   │       └── package.json
│   └── libs/
│       ├── database/      # PrismaService + schema.prisma + migraciones
│       ├── redis/         # RedisService (cache, presence, typing)
│       ├── constants/
│       ├── dtos/
│       ├── types/
│       └── utils/
├── frontend/
│   ├── src/
│   │   ├── app/           # Next.js App Router
│   │   ├── components/
│   │   └── lib/
│   ├── Dockerfile
│   └── package.json
├── scripts/
│   ├── backup-postgres.sh
│   ├── restore-postgres.sh
│   ├── seed.ts
│   └── health-check.sh
├── k8s/                   # Kubernetes manifests
├── docker-compose.yml     # Infraestructura de desarrollo
├── package.json           # Workspace root
├── turbo.json             # Turborepo config
└── tsconfig.json
```

## 📡 API Endpoints Principales

### Autenticación
| Método | Endpoint                        | Descripción                    |
|--------|---------------------------------|-------------------------------|
| POST   | `/api/v1/auth/register`         | Registrar nuevo usuario       |
| POST   | `/api/v1/auth/login`            | Iniciar sesión                |
| POST   | `/api/v1/auth/refresh`          | Refrescar access token        |
| POST   | `/api/v1/auth/logout`           | Cerrar sesión                 |
| POST   | `/api/v1/auth/forgot-password`  | Solicitar reset de password   |
| POST   | `/api/v1/auth/reset-password`   | Resetear password              |
| GET    | `/api/v1/auth/sessions`         | Listar sesiones activas       |

### Canales
| Método | Endpoint                        | Descripción                    |
|--------|---------------------------------|-------------------------------|
| GET    | `/api/v1/channels`              | Listar canales del workspace  |
| POST   | `/api/v1/channels`              | Crear canal                   |
| GET    | `/api/v1/channels/:id`          | Obtener canal por ID          |
| PATCH  | `/api/v1/channels/:id`          | Actualizar canal               |
| POST   | `/api/v1/channels/:id/join`     | Unirse a un canal              |
| POST   | `/api/v1/channels/:id/leave`     | Salir de un canal              |
| POST   | `/api/v1/channels/:id/invite`    | Invitar usuarios               |
| GET    | `/api/v1/channels/:id/members`  | Listar miembros                |
| POST   | `/api/v1/channels/:id/archive`   | Archivar canal                 |
| GET    | `/api/v1/channels/:id/messages` | Mensajes del canal             |

### Mensajes
| Método | Endpoint                          | Descripción                   |
|--------|-----------------------------------|-------------------------------|
| POST   | `/api/v1/messages/:channelId`     | Enviar mensaje                |
| PATCH  | `/api/v1/messages/:id`            | Editar mensaje                |
| DELETE | `/api/v1/messages/:id`            | Eliminar mensaje (soft delete) |
| GET    | `/api/v1/messages/:id/thread`     | Ver thread / respuestas       |
| POST   | `/api/v1/messages/:id/reactions`  | Añadir reacción               |
| DELETE | `/api/v1/messages/:id/reactions/:emoji` | Quitar reacción          |
| POST   | `/api/v1/messages/:id/save`       | Guardar mensaje               |
| DELETE | `/api/v1/messages/:id/save`       | Desguardar mensaje            |

### Documentación
- **Swagger UI**: `http://localhost:3010/docs`
- **Health check**: `GET http://localhost:3010/api/v1/health`

## 🔧 Scripts Disponibles

### Scripts NPM (raíz)
| Script             | Descripción                          |
|--------------------|--------------------------------------|
| `npm run dev`      | Levantar todos los servicios (dev)   |
| `npm run dev:api`  | Solo API en modo watch               |
| `npm run build`    | Construir todos los servicios        |
| `npm run db:migrate`| Ejecutar migraciones de Prisma      |
| `npm run db:generate`| Generar Prisma Client              |
| `npm run db:seed`  | Cargar datos de prueba               |
| `npm run docker:up`| Levantar Docker Compose              |
| `npm run docker:down`| Detener Docker Compose             |

### Scripts de Utilidad
| Script                        | Descripción                                    |
|-------------------------------|------------------------------------------------|
| `./scripts/backup-postgres.sh`| Backup comprimido de PostgreSQL                |
| `./scripts/restore-postgres.sh <file>` | Restaurar backup de PostgreSQL        |
| `npx ts-node scripts/seed.ts` | Cargar datos: 1 workspace, 3 canales, 5 users, 20 mensajes |
| `./scripts/health-check.sh`   | Verificar que todos los servicios están up     |

### Tests E2E
```bash
cd backend/apps/api
npx jest --config jest.config.ts
```

## 🗄️ Base de Datos

El esquema de Prisma cubre **7 schemas PostgreSQL** con **53 tablas**:

| Schema       | Tablas principales                                    |
|--------------|-------------------------------------------------------|
| `auth`       | users, sessions, user_identities, two_factor_auth, password_resets |
| `workspace`  | workspaces, workspace_members, workspace_invitations, user_groups, custom_emojis, workspace_settings, lists, canvases, templates, huddles, notification_preferences, data_retention_policies, legal_holds, information_barriers |
| `messaging`  | channels, channel_members, messages, message_reactions, message_pins, channel_bookmarks, saved_messages, scheduled_messages, shared_channels |
| `files`      | files, file_shares, file_comments                      |
| `automation`  | workflows, workflow_executions, apps, bot_users, slash_commands, incoming_webhooks, event_subscriptions |
| `analytics`  | audit_logs, usage_stats, message_activity              |
| `ai`         | message_embeddings (pgvector), ai_summaries, ai_conversations, ai_search_cache |

## 🔐 Variables de Entorno

Configurar en `backend/.env`:

```env
DATABASE_URL="postgresql://chatapp:chatapp_dev_password_2024@localhost:5432/chatapp?schema=public"
REDIS_URL="redis://localhost:6379"
JWT_SECRET="your-secret-key"
JWT_ACCESS_EXPIRES="15m"
JWT_REFRESH_EXPIRES="30d"
API_PORT=3010
API_PREFIX=api/v1
MEILI_URL="http://localhost:7700"
MEILI_MASTER_KEY="chatapp_meili_dev_key_2024"
```

## 📄 Licencia

Private - All rights reserved.