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:

TikTokProduct → tiktok_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)

TikTokImage → tiktok_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

MarketplaceStock → marketplace_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.