--- id: "US-TRD-004" title: "Crear Watchlist Personalizada" type: "User Story" status: "Done" priority: "Alta" epic: "OQI-003" story_points: 3 created_date: "2025-12-05" updated_date: "2026-01-04" --- # US-TRD-004: Crear Watchlist Personalizada ## Metadata | Campo | Valor | |-------|-------| | **ID** | US-TRD-004 | | **Épica** | OQI-003 - Trading y Charts | | **Módulo** | trading | | **Prioridad** | P1 | | **Story Points** | 2 | | **Sprint** | Sprint 4 | | **Estado** | Pendiente | | **Asignado a** | Por asignar | --- ## Historia de Usuario **Como** trader, **quiero** crear una watchlist personalizada con los activos que me interesan, **para** monitorear rápidamente sus precios y cambios sin buscarlos individualmente. ## Descripción Detallada El usuario debe poder crear listas personalizadas de símbolos (watchlists) para organizar y seguir los activos que le interesan. Cada watchlist muestra precios en tiempo real, cambios porcentuales y volumen. ## Mockups/Wireframes ``` ┌─────────────────────────────────────┐ │ WATCHLISTS │ ├─────────────────────────────────────┤ │ [+ New Watchlist] │ │ │ │ ┌────────────────────────────────┐ │ │ │ CREATE NEW WATCHLIST │ │ │ ├────────────────────────────────┤ │ │ │ Name: │ │ │ │ ┌────────────────────────────┐ │ │ │ │ │ My Crypto Portfolio │ │ │ │ │ └────────────────────────────┘ │ │ │ │ │ │ │ │ Description (optional): │ │ │ │ ┌────────────────────────────┐ │ │ │ │ │ Top 10 cryptos by mcap │ │ │ │ │ └────────────────────────────┘ │ │ │ │ │ │ │ │ Color Tag: │ │ │ │ [🔵][🟢][🟡][🔴][🟣] │ │ │ │ │ │ │ │ [Cancel] [Create] │ │ │ └────────────────────────────────┘ │ └─────────────────────────────────────┘ ``` --- ## Criterios de Aceptación **Escenario 1: Crear watchlist con nombre** ```gherkin DADO que el usuario está en la sección de watchlists CUANDO hace click en "+ New Watchlist" Y ingresa nombre "My Crypto Portfolio" Y hace click en "Create" ENTONCES se crea una nueva watchlist vacía Y aparece en la lista de watchlists del usuario Y se muestra mensaje "Watchlist created successfully" ``` **Escenario 2: Crear watchlist con descripción y color** ```gherkin DADO que el usuario abre el diálogo de nueva watchlist CUANDO ingresa nombre "DeFi Tokens" Y ingresa descripción "DeFi projects to watch" Y selecciona color azul 🔵 Y confirma ENTONCES la watchlist se crea con toda la metadata Y aparece con el color azul en la lista ``` **Escenario 3: Validación de nombre vacío** ```gherkin DADO que el usuario abre el diálogo de nueva watchlist CUANDO deja el campo nombre vacío ENTONCES el botón "Create" está deshabilitado Y se muestra mensaje "Name is required" ``` **Escenario 4: Nombre duplicado** ```gherkin DADO que el usuario tiene una watchlist "Favorites" CUANDO intenta crear otra con nombre "Favorites" ENTONCES se muestra error "Watchlist name already exists" Y no se crea la watchlist ``` **Escenario 5: Límite de watchlists** ```gherkin DADO que el usuario tiene 10 watchlists (límite máximo) CUANDO intenta crear una nueva ENTONCES se muestra mensaje "Maximum 10 watchlists reached" Y el botón "+ New Watchlist" está deshabilitado ``` ## Criterios Adicionales - [ ] Nombre máximo 50 caracteres - [ ] Descripción máxima 200 caracteres - [ ] Validar caracteres especiales en nombre - [ ] Ordenar watchlists alfabéticamente - [ ] Icono de estrella para watchlist favorita --- ## Tareas Técnicas **Database:** - [ ] DB-TRD-006: Crear tabla trading.watchlists - Campos: id, user_id, name, description, color, created_at, updated_at - [ ] DB-TRD-007: Crear índice en (user_id, name) para prevenir duplicados **Backend:** - [ ] BE-TRD-021: Crear endpoint POST /trading/watchlists - [ ] BE-TRD-022: Implementar WatchlistService.create() - [ ] BE-TRD-023: Validar límite de 10 watchlists por usuario - [ ] BE-TRD-024: Validar nombre único por usuario - [ ] BE-TRD-025: Crear endpoint GET /trading/watchlists para listar **Frontend:** - [ ] FE-TRD-021: Crear componente WatchlistList.tsx - [ ] FE-TRD-022: Crear componente CreateWatchlistDialog.tsx - [ ] FE-TRD-023: Crear componente ColorPicker.tsx - [ ] FE-TRD-024: Implementar watchlistStore con Zustand - [ ] FE-TRD-025: Implementar hook useCreateWatchlist **Tests:** - [ ] TEST-TRD-010: Test unitario validaciones - [ ] TEST-TRD-011: Test integración crear watchlist - [ ] TEST-TRD-012: Test E2E flujo completo --- ## Dependencias **Depende de:** - [ ] US-AUTH-001: Autenticación - Estado: ✅ Completado **Bloquea:** - [ ] US-TRD-005: Agregar símbolo a watchlist --- ## Notas Técnicas **Endpoints involucrados:** | Método | Endpoint | Descripción | |--------|----------|-------------| | POST | /trading/watchlists | Crear watchlist | | GET | /trading/watchlists | Listar watchlists del usuario | | GET | /trading/watchlists/:id | Obtener watchlist específica | **Entidades/Tablas:** ```sql CREATE TABLE trading.watchlists ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), user_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE, name VARCHAR(50) NOT NULL, description VARCHAR(200), color VARCHAR(20) DEFAULT 'blue', created_at TIMESTAMP DEFAULT NOW(), updated_at TIMESTAMP DEFAULT NOW(), CONSTRAINT unique_watchlist_name_per_user UNIQUE(user_id, name) ); CREATE INDEX idx_watchlists_user_id ON trading.watchlists(user_id); ``` **Componentes UI:** - `WatchlistList`: Lista de watchlists - `CreateWatchlistDialog`: Modal de creación - `ColorPicker`: Selector de color - `WatchlistCard`: Card de watchlist individual **Request Body:** ```typescript { name: "My Crypto Portfolio", description: "Top 10 cryptos by market cap", color: "blue" } ``` **Response:** ```typescript { id: "uuid-1234", userId: "uuid-5678", name: "My Crypto Portfolio", description: "Top 10 cryptos by market cap", color: "blue", symbolCount: 0, createdAt: "2025-12-05T10:00:00Z", updatedAt: "2025-12-05T10:00:00Z" } ``` **Colores disponibles:** ```typescript const COLORS = [ { value: 'blue', label: 'Blue', emoji: '🔵' }, { value: 'green', label: 'Green', emoji: '🟢' }, { value: 'yellow', label: 'Yellow', emoji: '🟡' }, { value: 'red', label: 'Red', emoji: '🔴' }, { value: 'purple', label: 'Purple', emoji: '🟣' } ]; ``` --- ## Definition of Ready (DoR) - [x] Historia claramente escrita - [x] Criterios de aceptación definidos - [x] Story points estimados - [x] Dependencias identificadas - [x] Sin bloqueadores - [ ] Diseño/mockup disponible - [ ] API spec disponible ## Definition of Done (DoD) - [ ] Código implementado según criterios - [ ] Tests unitarios escritos y pasando - [ ] Tests de integración pasando - [ ] Code review aprobado - [ ] Documentación actualizada - [ ] QA aprobado - [ ] Desplegado en ambiente de pruebas --- ## Historial de Cambios | Fecha | Cambio | Autor | |-------|--------|-------| | 2025-12-05 | Creación | Requirements-Analyst | --- **Creada por:** Requirements-Analyst **Fecha:** 2025-12-05 **Última actualización:** 2025-12-05