7.3 KiB
7.3 KiB
Refactorización: Arquitectura Multi-Plataforma
Resumen de Cambios
Se ha refactorizado completamente la arquitectura del proyecto para soportar múltiples plataformas de marketplace (Wallapop, Vinted, Buyee, etc.) mediante un diseño desacoplado y extensible.
Cambios Principales
1. Nueva Estructura de Directorios
├── platforms/ # NUEVO
│ ├── __init__.py
│ ├── base_platform.py # Clase abstracta para plataformas
│ ├── platform_factory.py # Factory para crear plataformas
│ ├── wallapop_platform.py # Implementación de Wallapop
│ ├── vinted_platform_template.py # Template para nuevas plataformas
│ └── README.md # Documentación de plataformas
│
├── models/ # NUEVO
│ ├── __init__.py
│ └── article.py # Modelo genérico de artículo
│
└── datalayer/
└── wallapop_article.py # DEPRECADO (mantener por compatibilidad)
2. Clases Nuevas
models/article.py - Modelo Genérico
- Propósito: Representa un artículo de cualquier plataforma
- Cambios respecto a WallapopArticle:
- Añadido campo
platformpara identificar el origen - Método
get_images()devuelve lista directa (no requiere procesamiento) - Método
get_modified_at()devuelve string ya formateado - Igualdad considera plataforma (
id+platform)
- Añadido campo
platforms/base_platform.py - Clase Abstracta
- Propósito: Define la interfaz común para todas las plataformas
- Métodos abstractos:
get_platform_name(): Retorna identificador de la plataformacreate_url(): Construye URL de búsquedafetch_articles(): Obtiene artículos de la plataformaparse_response(): Parsea respuesta a objetos Article
- Métodos concretos:
get_request_headers(): Headers por defecto (puede sobreescribirse)
platforms/wallapop_platform.py - Implementación Wallapop
- Propósito: Lógica específica de Wallapop
- Migración desde Worker:
_create_url()→create_url()_request_articles()→fetch_articles()_parse_json_response()→parse_response()
- Nuevas funcionalidades:
- Manejo de errores en parseo de artículos individuales
- Logging específico de errores de Wallapop
- Headers específicos de Wallapop (
X-DeviceOS)
platforms/platform_factory.py - Factory Pattern
- Propósito: Crear instancias de plataformas dinámicamente
- Funcionalidades:
create_platform(name, item_monitor): Instancia la plataformaget_available_platforms(): Lista plataformas disponiblesregister_platform(name, class): Registra nuevas plataformas
- Ventajas:
- Añadir plataformas sin modificar código existente
- Validación de plataformas soportadas
- Mensajes de error descriptivos
3. Clases Modificadas
managers/worker.py - Refactorización Mayor
Eliminado (lógica específica de Wallapop):
_create_url()- Movido aWallapopPlatform.create_url()_request_articles()implementación completa - Movido a plataforma_parse_json_response()- Movido aWallapopPlatform.parse_response()- Imports:
requests,WallapopArticle - Constantes:
REQUEST_SLEEP_TIME,REQUEST_RETRY_TIME,USER_AGENT
Añadido (lógica desacoplada):
self._platform: Instancia de la plataforma configurada- Inicialización de plataforma mediante
PlatformFactory - Manejo de errores de inicialización de plataforma
- Log de plataforma inicializada
_request_articles()ahora delega aself._platform.fetch_articles()
Mantenido (lógica común a todas las plataformas):
_has_words(): Búsqueda de palabras en texto_title_has_excluded_words(): Filtrado de títulos_description_has_excluded_words(): Filtrado de descripciones_title_has_required_words(): Palabras requeridas en título_description_has_required_words(): Palabras requeridas en descripción_title_first_word_is_excluded(): Filtrado de primera palabra_meets_item_conditions(): Validación completa de condicioneswork(): Loop principal de trabajorun(): Manejo de errores y reinicios
datalayer/item_monitor.py - Campo de Plataforma
Añadido:
- Parámetro
platformen__init__() - Campo
self._platform - Método
get_platform() - Default
'wallapop'enload_from_json()para compatibilidad hacia atrás
4. Archivos de Configuración
workers.json - Campo Opcional de Plataforma
Añadido:
- Campo
"platform": "wallapop"en primer item como ejemplo - Otros items usan el default (wallapop) por compatibilidad
Ejemplo:
{
"name": "Playstation 1",
"platform": "wallapop",
"search_query": "playstation",
...
}
5. Documentación
platforms/README.md - Guía Completa
- Introducción a la arquitectura de plataformas
- Cómo añadir una nueva plataforma (paso a paso)
- Parámetros disponibles en ItemMonitor
- Estructura del modelo Article
- Lógica común del Worker vs lógica de plataforma
platforms/vinted_platform_template.py - Plantilla
- Implementación esqueleto para Vinted
- TODOs marcados claramente
- Comentarios explicativos
- Estructura JSON de ejemplo
- Pasos de activación
README.md - Actualización Principal
- Nueva sección "Arquitectura Multi-Plataforma"
- Nueva sección "Añadir Nuevas Plataformas"
- Actualización de descripción del proyecto
- Tabla de parámetros con campo
platform - Diagrama de estructura del proyecto
- Lista de plataformas soportadas
Ventajas de la Nueva Arquitectura
✅ Desacoplamiento
- Lógica de plataforma separada de lógica de filtrado
- Cada componente tiene una responsabilidad única
- Fácil de mantener y testear
✅ Extensibilidad
- Añadir plataformas sin tocar código existente
- Factory pattern permite registro dinámico
- Plantillas y documentación para nuevas plataformas
✅ Reutilización
- Filtros comunes para todas las plataformas
- Modelo Article unificado
- Worker genérico
✅ Mantenibilidad
- Código más limpio y organizado
- Responsabilidades claras
- Fácil de entender y modificar
Compatibilidad Hacia Atrás
✅ 100% Compatible: El código existente funciona sin cambios
- Items sin campo
platformusan "wallapop" por defecto WallapopArticleaún existe (aunque ya no se usa)- Mismos filtros y funcionalidad
Próximos Pasos
Para añadir nuevas plataformas:
- Vinted: Completar el template existente
- Buyee: Crear nueva implementación
- Amazon: Posible integración futura
- eBay: Posible integración futura
Migración
No se requiere migración. El sistema funciona con configuraciones existentes.
Para aprovechar las nuevas funcionalidades:
- Añade
"platform": "wallapop"a tus items enworkers.json(opcional) - Implementa nuevas plataformas según
platforms/README.md
Testing
Recomendaciones para testing:
- Verificar que Wallapop sigue funcionando igual
- Probar con configuraciones sin campo
platform - Validar que los filtros funcionan con el nuevo modelo Article
- Probar manejo de errores en inicialización de plataformas
Archivos a Mantener (Deprecados)
datalayer/wallapop_article.py: Mantener por si hay dependencias externas
Cambios en Dependencias
Ninguno. Las mismas dependencias funcionan con la nueva arquitectura.