Design

Ecosistema completo para organización y gestión de contenido con interfaces espaciales

Design - Product Catalog Module

Objetivos de Diseño

Derivados de Requirements

Dependencias y Límites del Módulo

Dependencias Internas

Dependencias Externas

Límites del Módulo

Arquitectura y Componentes

Contexto del Sistema

[Cliente Web] --> [Product Catalog Module] --> [Product API]
                         |                         |
                         v                         v
                  [Event System] <--> [Shared Models] <--> [Security Module]
                         |
                         v
                  [UI Framework]

Componentes Principales

1. Public Catalog (Catálogo Público)

2. Product Detail (Detalle de Producto)

3. Admin Panel (Panel Administrativo)

4. Services & State

División de Responsabilidades

ProductCatalogComponent

ProductService

ProductState (NGXS)

Contratos y Modelos

Entidades Principales

Product Entity

interface Product {
  id: string;
  sku: string;
  name: string;
  description: string;
  shortDescription?: string;
  price: number;
  salePrice?: number;
  currency: string;
  categoryIds: string[];
  images: ProductImage[];
  stock: number;
  status: ProductStatus;
  attributes: ProductAttribute[];
  createdAt: Date;
  updatedAt: Date;
  tenantId: string;
}

Category Entity

interface Category {
  id: string;
  name: string;
  slug: string;
  description?: string;
  parentId?: string;
  level: number;
  sortOrder: number;
  isActive: boolean;
  tenantId: string;
}

ProductImage Entity

interface ProductImage {
  id: string;
  url: string;
  alt: string;
  sortOrder: number;
  isPrimary: boolean;
}

API Endpoints

Products API

Categories API

Event Contracts

Product Events

Decisiones de Diseño

DEC-001: NGXS para State Management

Decisión: Usar NGXS como store centralizado para estado del catálogo Alternativa: Context API + Signals Justificación: Consistencia con arquitectura global, debugging tools, efectos para side effects Impacto: Mayor complejidad inicial, mejor escalabilidad a largo plazo

DEC-002: Paginación Server-Side

Decisión: Implementar paginación en el servidor con lazy loading Alternativa: Cargar todo el catálogo client-side Justificación: Mejor performance con catálogos grandes, menor uso de memoria Impacto: Mayor complejidad en manejo de estado, mejor UX

DEC-003: Filtros Combinados

Decisión: Permitir múltiples filtros simultáneos con query parameters Alternativa: Filtros mutuamente excluyentes Justificación: Mayor flexibilidad de búsqueda, mejor UX Impacto: Lógica más compleja, estado de filtros más rico

DEC-004: Gestión de Imágenes

Decisión: Upload a CDN con optimización automática Alternativa: Almacenamiento local con transformaciones manuales Justificación: Mejor performance, escalabilidad, menor carga en servidor Impacto: Dependencia externa, costo adicional

DEC-005: Categorías Jerárquicas

Decisión: Estructura de árbol con niveles ilimitados Alternativa: Categorías planas con tags Justificación: Mejor organización, navegación familiar para usuarios Impacto: Complejidad en UI de gestión, mejor organización lógica

Riesgos y Mitigaciones

R001: Performance con Catálogos Grandes

Riesgo: Lentitud en carga con +10k productos Mitigación: Paginación server-side, lazy loading, virtual scroll, cache inteligente Impacto: Alto - afecta UX directamente

R002: Gestión de Imágenes

Riesgo: CDN no disponible o costos excesivos Mitigación: Fallback a almacenamiento local, optimización automática, compresión Impacto: Medio - funcionalidad degradada pero disponible

R003: Sincronización de Inventario

Riesgo: Stock desactualizado entre sesiones Mitigación: WebSockets para updates en tiempo real, refresh periódico Impacto: Alto - afecta ventas y experiencia

Estrategia de Pruebas y Observabilidad

Testing Strategy

Observabilidad

Quality Gates

Permisos y Control de Acceso

Permisos Definidos

Mapeo de Permisos por Acción

Acción Componente Permiso Requerido Validación
Ver catálogo público ProductCatalogComponent product:read authGuard
Ver detalle de producto ProductDetailComponent product:read authGuard
Buscar productos ProductSearchComponent product:read authGuard
Acceder panel admin ProductAdminComponent product:write authGuard + permissionGuard
Crear producto ProductFormComponent product:write permissionGuard
Editar producto ProductFormComponent product:write permissionGuard
Eliminar producto ProductListComponent product:delete permissionGuard
Ver categorías CategoryManagerComponent category:read permissionGuard
Crear/Editar categorías CategoryManagerComponent category:write permissionGuard
Eliminar categorías CategoryManagerComponent category:delete permissionGuard

Guards Aplicados por Ruta

// Rutas públicas
{ path: 'catalog', component: ProductCatalogComponent, canActivate: [authGuard] }
{ path: 'catalog/:id', component: ProductDetailComponent, canActivate: [authGuard] }

// Rutas administrativas
{
  path: 'admin/products',
  component: ProductAdminComponent,
  canActivate: [authGuard, permissionGuard],
  data: { permission: 'product:write' }
}
{
  path: 'admin/categories',
  component: CategoryManagerComponent,
  canActivate: [authGuard, permissionGuard],
  data: { permission: 'category:read' }
}

Directivas de Seguridad en Templates

// Botones administrativos
<button *hasPermission="'product:write'" (click)="createProduct()">Crear Producto</button>
<button *hasPermission="'product:write'" (click)="editProduct()">Editar</button>
<button *hasPermission="'product:delete'" (click)="deleteProduct()">Eliminar</button>

// Gestión de categorías
<button *hasPermission="'category:write'" (click)="createCategory()">Crear Categoría</button>
<button *hasPermission="'category:delete'" (click)="deleteCategory()">Eliminar Categoría</button>

// Secciones condicionales
<div *hasPermission="'category:read'">
  <app-category-manager></app-category-manager>
</div>

Mapeo de Cobertura

Requerimiento Componente Principal Responsabilidad Permisos
R-001/US-001 ProductCatalogComponent Vista pública del catálogo product:read
R-004/US-002 ProductSearchComponent Búsqueda simple product:read
R-007/US-003 ProductDetailComponent Vista detallada básica product:read
R-008/US-004 ProductAdminComponent, ProductFormComponent Gestión administrativa product:write, product:delete
R-011/US-005 CategoryManagerComponent Gestión de categorías simples category:read, category:write, category:delete
R-013/US-006 Guards + Directivas de @libs-core/security Control de acceso product:read, product:write, product:delete, category:read, category:write, category:delete