--- id: "PMC-006-ASSETS" title: "PMC-006: Módulo de Assets (DAM)" type: "Module Definition" epic: "PMC-006" status: "Draft" project: "platform_marketing_content" version: "1.0.0" created_date: "2026-01-04" updated_date: "2026-01-04" --- # PMC-006: Módulo de Assets (DAM) **Versión:** 1.0.0 **Fecha:** 2025-12-08 **Estado:** Definición **Prioridad:** Alta --- ## Descripción General El módulo de Assets implementa un Digital Asset Management (DAM) simplificado para almacenar, organizar y gestionar todos los recursos digitales generados o subidos a la plataforma: imágenes, copys, videos, modelos IA, y documentos. --- ## Objetivos 1. Centralizar todos los activos digitales del tenant 2. Organizar assets por cliente, campaña, tipo 3. Gestionar versiones y estados de aprobación 4. Facilitar búsqueda y descubrimiento de assets 5. Controlar acceso y permisos por rol --- ## Entidades del Dominio ### Asset ```yaml Entidad: Asset Descripción: Recurso digital almacenado en la plataforma Atributos: - id: UUID (PK) - tenant_id: UUID (FK) - name: string - description: text - type: enum [image, copy, video, document, model, template] - mime_type: string - file_path: string (ruta en storage) - file_size: bigint (bytes) - dimensions: JSONB (width, height para imágenes/videos) - duration: integer (segundos, para video/audio) - status: enum [draft, pending_review, approved, rejected, archived] - visibility: enum [private, team, client] - source: enum [generated, uploaded, imported] - generation_job_id: UUID (FK, si fue generado) - metadata: JSONB - prompt: string (si fue generado) - model_used: string - seed: number - parameters: object - tags: array[string] - created_by: UUID (FK a User) - created_at: timestamp - updated_at: timestamp - deleted_at: timestamp (soft delete) Relaciones: - N:1 con Tenant - N:1 con User (creator) - N:1 con GenerationJob - N:N con Campaign - N:N con Collection - 1:N con AssetVersion ``` ### AssetVersion ```yaml Entidad: AssetVersion Descripción: Versión histórica de un asset Atributos: - id: UUID (PK) - asset_id: UUID (FK) - version_number: integer - file_path: string - file_size: bigint - changes_description: text - created_by: UUID (FK) - created_at: timestamp Relaciones: - N:1 con Asset - N:1 con User ``` ### Collection ```yaml Entidad: Collection Descripción: Agrupación lógica de assets Atributos: - id: UUID (PK) - tenant_id: UUID (FK) - name: string - description: text - type: enum [manual, smart, campaign, brand] - smart_filters: JSONB (criterios para smart collections) - cover_asset_id: UUID (FK, opcional) - is_public: boolean - created_by: UUID (FK) - created_at: timestamp - updated_at: timestamp Relaciones: - N:1 con Tenant - N:N con Asset - N:1 con User ``` ### AssetComment ```yaml Entidad: AssetComment Descripción: Comentario o feedback sobre un asset Atributos: - id: UUID (PK) - asset_id: UUID (FK) - user_id: UUID (FK) - content: text - position: JSONB (x, y para comentarios en imagen) - is_resolved: boolean - parent_id: UUID (FK, para respuestas) - created_at: timestamp - updated_at: timestamp Relaciones: - N:1 con Asset - N:1 con User - Self-referencial (parent/children) ``` ### Download ```yaml Entidad: Download Descripción: Registro de descargas de assets Atributos: - id: UUID (PK) - tenant_id: UUID (FK) - asset_id: UUID (FK, opcional - puede ser colección) - collection_id: UUID (FK, opcional) - user_id: UUID (FK) - download_type: enum [single, batch, collection] - format: string (original, converted) - ip_address: string - user_agent: string - created_at: timestamp Relaciones: - N:1 con Asset - N:1 con Collection - N:1 con User ``` --- ## Funcionalidades ### F-006.1: Gestión de Assets | ID | Funcionalidad | Descripción | Prioridad | |----|---------------|-------------|-----------| | F-006.1.1 | Upload | Subir archivos manualmente | Alta | | F-006.1.2 | Ver asset | Detalle con preview y metadata | Alta | | F-006.1.3 | Editar metadata | Nombre, descripción, tags | Alta | | F-006.1.4 | Eliminar | Soft delete con papelera | Alta | | F-006.1.5 | Restaurar | Recuperar de papelera | Media | ### F-006.2: Organización | ID | Funcionalidad | Descripción | Prioridad | |----|---------------|-------------|-----------| | F-006.2.1 | Colecciones | Agrupar assets manualmente | Alta | | F-006.2.2 | Smart collections | Colecciones automáticas por criterios | Media | | F-006.2.3 | Tags | Etiquetar assets | Alta | | F-006.2.4 | Filtros | Filtrar por tipo, estado, fecha, etc. | Alta | ### F-006.3: Búsqueda | ID | Funcionalidad | Descripción | Prioridad | |----|---------------|-------------|-----------| | F-006.3.1 | Búsqueda texto | Por nombre, descripción, tags | Alta | | F-006.3.2 | Filtros avanzados | Combinar múltiples criterios | Alta | | F-006.3.3 | Búsqueda por similar | Encontrar imágenes similares | Baja | ### F-006.4: Versiones y Aprobación | ID | Funcionalidad | Descripción | Prioridad | |----|---------------|-------------|-----------| | F-006.4.1 | Versionar | Subir nueva versión de asset | Media | | F-006.4.2 | Comparar versiones | Ver diferencias | Baja | | F-006.4.3 | Aprobar/Rechazar | Cambiar estado de revisión | Alta | | F-006.4.4 | Comentarios | Feedback sobre assets | Alta | ### F-006.5: Descargas y Exportación | ID | Funcionalidad | Descripción | Prioridad | |----|---------------|-------------|-----------| | F-006.5.1 | Descargar individual | Bajar un asset | Alta | | F-006.5.2 | Descargar batch | Bajar múltiples como ZIP | Alta | | F-006.5.3 | Convertir formato | Descargar en formato diferente | Media | | F-006.5.4 | Enlace temporal | URL con expiración | Media | --- ## Tipos de Assets Soportados ```yaml Imágenes: Formatos: PNG, JPG, JPEG, WebP, GIF, SVG Max size: 50MB Procesamiento: - Generación de thumbnails - Extracción de dimensiones - Optimización automática Copys/Textos: Tipos: Copy publicitario, título, descripción, hashtags Almacenamiento: En BD + archivo .txt opcional Metadata: Tone, language, character count Videos: Formatos: MP4, MOV, WebM Max size: 500MB Procesamiento: - Generación de thumbnail - Extracción de duración - Preview de baja resolución Documentos: Formatos: PDF, DOC, DOCX Max size: 100MB Uso: Brand guidelines, briefs, contratos Modelos IA: Tipos: LoRA (.safetensors), Checkpoint, Embedding Max size: 10GB Metadata: Base model, trigger word, training params Templates: Tipos: Workflow ComfyUI, plantillas de brief Formato: JSON ``` --- ## Storage Structure ```yaml S3/MinIO Bucket Structure: {bucket}/ ├── {tenant_slug}/ │ ├── assets/ │ │ ├── images/ │ │ │ ├── {year}/ │ │ │ │ ├── {month}/ │ │ │ │ │ ├── {asset_id}/ │ │ │ │ │ │ ├── original.{ext} │ │ │ │ │ │ ├── thumb_200.jpg │ │ │ │ │ │ ├── thumb_800.jpg │ │ │ │ │ │ └── versions/ │ │ │ │ │ │ ├── v1.{ext} │ │ │ │ │ │ └── v2.{ext} │ │ ├── videos/ │ │ ├── documents/ │ │ └── copies/ │ ├── models/ │ │ ├── loras/ │ │ ├── checkpoints/ │ │ └── embeddings/ │ └── temp/ │ └── (archivos temporales, limpiados periódicamente) ``` --- ## API Endpoints ```yaml Base: /api/v1/assets # Assets CRUD POST /assets/upload # Subir archivo(s) GET /assets # Listar con filtros y paginación GET /assets/:id # Detalle de asset PUT /assets/:id # Actualizar metadata DELETE /assets/:id # Soft delete # Bulk operations POST /assets/bulk/move # Mover a colección POST /assets/bulk/tag # Agregar tags POST /assets/bulk/delete # Eliminar múltiples POST /assets/bulk/status # Cambiar estado # Versions GET /assets/:id/versions # Listar versiones POST /assets/:id/versions # Subir nueva versión GET /assets/:id/versions/:v # Obtener versión específica # Status & Approval PATCH /assets/:id/status # Cambiar estado POST /assets/:id/approve # Aprobar POST /assets/:id/reject # Rechazar con feedback # Comments GET /assets/:id/comments # Listar comentarios POST /assets/:id/comments # Agregar comentario PUT /assets/:id/comments/:cid # Editar comentario DELETE /assets/:id/comments/:cid # Eliminar comentario # Downloads GET /assets/:id/download # Descargar asset POST /assets/download/batch # Descargar múltiples (ZIP) POST /assets/:id/share # Generar enlace temporal # Collections GET /collections # Listar colecciones POST /collections # Crear colección GET /collections/:id # Detalle de colección PUT /collections/:id # Actualizar colección DELETE /collections/:id # Eliminar colección POST /collections/:id/assets # Agregar assets DELETE /collections/:id/assets # Quitar assets # Search POST /assets/search # Búsqueda avanzada GET /assets/tags # Listar tags usados ``` --- ## Reglas de Negocio ```yaml RN-006.1: Descripción: Assets generados heredan metadata del job Comportamiento: Copiar prompt, modelo, parámetros automáticamente RN-006.2: Descripción: Thumbnails se generan automáticamente Tamaños: 200px y 800px de ancho, manteniendo aspect ratio RN-006.3: Descripción: Soft delete retiene archivos 30 días Acción: Cron job limpia después del período RN-006.4: Descripción: Versionado mantiene historial completo Límite: Máximo 10 versiones por asset RN-006.5: Descripción: Links temporales expiran según configuración Default: 7 días, máximo 30 días RN-006.6: Descripción: Storage cuenta contra cuota del tenant Validación: Verificar límite antes de upload ``` --- ## UI/UX Consideraciones ```yaml Vistas principales: - Grid view: Thumbnails en cuadrícula - List view: Lista con metadata - Detail view: Asset grande con panel de info Componentes: - AssetUploader: Drag & drop, multi-file - AssetPreview: Lightbox con navegación - AssetFilters: Panel de filtros colapsable - CollectionPicker: Modal para agregar a colección - CommentPanel: Sidebar con comentarios Acciones rápidas: - Quick preview (spacebar) - Quick download (d) - Quick approve (a) - Add to collection (c) ``` --- ## Dependencias ```yaml Dependencias de Módulos: - PMC-001 Tenants: Cuotas de storage - PMC-003 Projects: Vinculación con campañas - PMC-004 Generation: Assets generados Servicios Externos: - S3/MinIO: Almacenamiento de archivos - Sharp: Procesamiento de imágenes - FFmpeg: Procesamiento de video (opcional) Dependencias del Catálogo: - (ninguna directa) ``` --- ## Consideraciones de Performance ```yaml Optimizaciones: - Lazy loading de thumbnails - Paginación con cursor para grandes volúmenes - CDN para servir assets estáticos - Compresión de uploads grandes - Pre-signed URLs para uploads directos a S3 Índices BD: - tenant_id + type + status - tenant_id + created_at - tenant_id + tags (GIN index) - Full-text search en name, description ``` --- ## Criterios de Aceptación - [ ] Upload funciona con drag & drop y file picker - [ ] Thumbnails se generan automáticamente - [ ] Búsqueda y filtros funcionan correctamente - [ ] Colecciones permiten organizar assets - [ ] Versionado mantiene historial - [ ] Flujo de aprobación funciona - [ ] Descargas individuales y batch funcionan - [ ] Links temporales se generan y expiran - [ ] Comentarios se pueden agregar y resolver - [ ] Storage se cuenta contra cuota --- ## Referencias - [ARQUITECTURA-TECNICA.md](../00-vision-general/ARQUITECTURA-TECNICA.md) - [GLOSARIO.md](../00-vision-general/GLOSARIO.md) - Definición de DAM --- **Documento generado por:** Requirements-Analyst **Fecha:** 2025-12-08