Skip to main content

Marketplaces Commons

1. Descripción general

marketplaces-commons es una librería de acceso a datos compartida, no una aplicación independiente. Se distribuye como dependencia Maven y es consumida por otros microservicios del ecosistema de Hawkers que necesiten interactuar con la base de datos de marketplaces.

Proporciona la capa completa de persistencia (entidades JPA, repositorios Spring Data y servicios de fachada) para las siguientes áreas:

  • TikTok Shop: gestión de productos (tiktok_product) e imágenes asociadas (tiktok_image).
  • Stock por marketplace: tabla marketplace_stock con nombres de producto normalizados para Decathlon, Miravia, ECI y Showroom, segmentados por SKU y empresa.

Al centralizar estas operaciones en una única librería, se evita la duplicación de entidades y queries entre microservicios, y se garantiza la coherencia del modelo de datos.

2. Información técnica

PropiedadValor
artifactIdmarketplaces-commons
groupIdcom.hawkersco
version1.0.25-SNAPSHOT
Java25
Spring Boot4.0.6
Tipo de artefactoJAR (librería, sin main class)
MódulosProyecto mono-módulo

3. Arquitectura y diseño

El proyecto sigue un patrón de 3 capas bajo el paquete raíz com.hawkersco.marketplacescommons:

com.hawkersco.marketplacescommons
├── dao/ ← Entidades JPA (@Entity). Implementan Serializable.
├── repository/ ← Interfaces Spring Data CrudRepository. Queries nativas y JPQL.
└── service/ ← Fachadas @Service. Delegación directa a repositorios.

No existe capa de controlador REST ni clase @SpringBootApplication. La configuración del datasource (URL, credenciales, dialecto JPA) es responsabilidad exclusiva del microservicio consumidor.

graph LR
MS[Microservicio consumidor] -->|autowire| SVC[Service]
SVC --> REPO[Repository]
REPO -->|JPA / SQL nativo| DB[(PostgreSQL)]

4. Dependencias principales

DependenciaVersiónPropósito
spring-boot-starter4.0.6Core Spring Boot (IoC, autoconfiguración)
spring-boot-starter-data-jpa4.0.6Spring Data JPA + Hibernate + Jakarta Persistence
org.postgresql:postgresql42.7.4Driver JDBC para PostgreSQL
org.projectlombok:lombok1.18.42Generación de getters/setters/constructores en tiempo de compilación
spring-boot-starter-test4.0.6Framework de tests (scope test)
artifactregistry-maven-wagon2.2.1Plugin para publicar en GCP Artifact Registry

5. API / Endpoints

No aplica a este proyecto.

Esta librería no expone ninguna API REST. Es un artefacto de librería pura; su API pública son los métodos de los @Service.

API pública de los Services:

MarketplaceStockService

MétodoParámetrosRetornoDescripción
truncateMarketplacesStock()voidElimina todos los registros de marketplace_stock (TRUNCATE nativo)
save(MarketplaceStock)entidadMarketplaceStockPersiste o actualiza un registro
findByCdSku(String)cdSkuMarketplaceStockBusca por SKU
findByCdSkuAndDsCompany(String, String)cdSku, dsCompanyMarketplaceStockBusca por clave compuesta
updateMarketplaceStock(String, String, String, String, String, String)nmDecathlon, nmMiravia, nmShowroom, nmEci, cdSku, dsCompanyvoidActualiza nombres de marketplace para un SKU+empresa

TikTokProductService

MétodoParámetrosRetornoDescripción
save(TikTokProduct)entidadTikTokProductPersiste o actualiza
findByCdSku(String)cdSkuTikTokProductBusca por SKU
findByTiktokProductId(String)tiktokProductIdTikTokProductBusca por ID de producto TikTok
findByDsStatus(String)dsStatusList<TikTokProduct>Filtra por estado
delete(TikTokProduct)entidadvoidElimina el registro

TikTokImageService

MétodoParámetrosRetornoDescripción
save(TikTokImage)entidadTikTokImagePersiste o actualiza
findByCdSkuAndImagePos(String, int)cdSku, imagePosTikTokImageBusca imagen por SKU y posición
findByOrderByCdSkuAscImagePosAsc()List<TikTokImage>Devuelve todas las imágenes ordenadas por SKU y posición
findByTiktokUri(String)tiktokUriTikTokImageBusca por URI de TikTok
delete(TikTokImage)entidadvoidElimina el registro

6. Integraciones externas

SistemaProtocoloDirecciónDescripción
PostgreSQLJDBC / JPASalienteBase de datos de marketplaces. Datasource configurado por el servicio consumidor.
GCP Artifact Registry (europe-west3)HTTPS / Maven WagonSalienteRepositorio Maven donde se publica el JAR compilado.

7. Configuración

Esta librería no incluye application.properties ni application.yml. Toda la configuración JPA debe ser provista por el microservicio que la consuma.

Propiedades mínimas requeridas en el servicio consumidor:

PropiedadDescripciónEjemplo de valor
spring.datasource.urlURL JDBC de la base de datos de marketplacesjdbc:postgresql://host:5432/marketplaces_db
spring.datasource.usernameUsuario de base de datos${DB_USER}
spring.datasource.passwordContraseña de base de datos${DB_PASSWORD}
spring.jpa.hibernate.ddl-autoEstrategia DDL de Hibernatevalidate o none
spring.jpa.database-platformDialecto JPAorg.hibernate.dialect.PostgreSQLDialect

Para publicar en Artifact Registry, el fichero ~/.m2/settings.xml del agente de CI debe incluir las credenciales de la cuenta de servicio GCP (credential id: artifact-registry).

8. Persistencia

Base de datos: PostgreSQL

Entidades y tablas:

TikTokProducttiktok_product

Campo JavaColumna SQLTipoDescripción
cdSkucd_skuStringPK — Código SKU interno
tiktokProductIdtiktok_product_idStringID del producto en la plataforma TikTok
dsStatusds_statusStringEstado del producto (ej. ACTIVE, INACTIVE)

TikTokImagetiktok_image

Campo JavaColumna SQLTipoDescripción
tiktokUritiktok_uriStringPK — URI única de la imagen en TikTok
tiktokUrltiktok_urlStringURL pública de la imagen
cdSkucd_skuStringSKU del producto asociado
imageTypeimage_typeStringTipo de imagen
imagePosimage_posintPosición/orden de la imagen
rawDataraw_dataStringPayload JSON crudo devuelto por TikTok

MarketplaceStockmarketplace_stock

Campo JavaColumna SQLTipoDescripción
cdSkucd_skuStringPK (parte 1) — Código SKU
dsCompanyds_companyStringPK (parte 2) — Identificador de empresa
nmDecathlonnm_decathlonStringNombre del producto en Decathlon
nmMiravianm_miraviaStringNombre del producto en Miravia
nmEcinm_eciStringNombre del producto en ECI
nmShowroomnm_showroomStringNombre del producto en Showroom

La clave primaria compuesta de MarketplaceStock está implementada mediante @IdClass(MarketplaceStockId.class).

Migraciones: No existen scripts Flyway ni Liquibase en este repositorio. La creación y evolución del esquema es responsabilidad del servicio consumidor o de un proceso externo.

9. Procesos programados y mensajería

No aplica a este proyecto.

No hay anotaciones @Scheduled, @KafkaListener, @RabbitListener ni runners batch. Es una librería de acceso a datos pura.

10. Ejecución en local

Esta librería no se ejecuta de forma independiente. Para instalarla en el repositorio Maven local:

# Instalar en ~/.m2 local (sin tests)
./mvnw -B -DskipTests clean install

# Ejecutar tests (actualmente sin tests implementados)
./mvnw test

Para consumirla desde otro proyecto local, añadir la dependencia en el pom.xml del servicio consumidor:

<dependency>
<groupId>com.hawkersco</groupId>
<artifactId>marketplaces-commons</artifactId>
<version>1.0.25-SNAPSHOT</version>
</dependency>

Requisitos: JDK 25, Maven 3.x (o usar el wrapper ./mvnw).

11. Despliegue

Mecanismo: Jenkins publica el JAR en GCP Artifact Registry mediante mvn deploy -DskipTests.

Pipeline Jenkins:

EtapaDescripción
CheckoutClona el repositorio desde SCM
Publish to Artifact RegistryEjecuta mvn deploy -DskipTests y publica el JAR

Repositorio de distribución: artifactregistry://europe-west3-maven.pkg.dev/pi-saldum/pi-repo-maven

Herramientas CI: JDK25, Maven3

Job de Jenkins:

https://jenkins-pi.hawkersco.net/job/marketplaces-commons/

12. Manejo de errores y logging

No hay estrategia de excepciones propia definida en la librería. Los servicios delegan directamente a los repositorios sin captura de excepciones, por lo que las excepciones de Spring Data / JPA (p.ej. DataAccessException, EntityNotFoundException) se propagan al servicio consumidor, que es el responsable de manejarlas.

No existe configuración de logging específica (logback-spring.xml, log4j2.xml). El logging heredará la configuración del servicio consumidor.

13. Notas y consideraciones

  • truncateMarketplaceStock() es destructivo e irreversible: elimina toda la tabla marketplace_stock sin condición. Los servicios consumidores deben invocar este método con extrema cautela y siempre antes de una carga masiva de datos.

  • Ausencia de tests: src/test/java/ está vacío. No existe cobertura de ninguna query ni comportamiento de servicio. Recomendable añadir tests de integración con base de datos embebida (H2) o Testcontainers para validar las queries nativas.

  • @Autowired en fields: los servicios usan inyección por campo en lugar de inyección por constructor. Esto dificulta los tests unitarios. Pendiente de valorar migración a inyección por constructor.

  • MarketplaceStockRepository extiende CrudRepository<MarketplaceStock, String>: el tipo de la PK declarado es String, pero la entidad usa clave compuesta (@IdClass). El tipo correcto sería MarketplaceStockId. Pendiente de verificar si esto genera algún comportamiento inesperado en operaciones como findById.

  • rawData en TikTokImage: almacena el payload JSON crudo de TikTok como String. Si los payloads son grandes, puede impactar en el rendimiento de las consultas que devuelven listados completos (p.ej. findByOrderByCdSkuAscImagePosAsc()).

  • Sin @SpringBootApplication: la librería no auto-registra sus beans. El servicio consumidor debe incluir un @ComponentScan sobre el paquete com.hawkersco.marketplacescommons o confiar en la autoconfiguración de Spring Boot si el paquete está dentro del scan por defecto.