JustEat Client
1. Descripción general
justeat-client es una librería cliente reutilizable (JAR) que encapsula la comunicación con la API JustEat Flyt, plataforma de integración de JustEat para marketplaces de delivery. El proyecto no expone ningún endpoint REST propio; se publica en el registro de artefactos Maven interno y es consumido por otros microservicios del ecosistema Hawkers que necesiten sincronizar menús o notificar cambios de disponibilidad de artículos hacia JustEat.
Expone operaciones para:
- Comprobación de salud local (
check), sin llamar a la API remota. - Notificar eventos de disponibilidad de artículos (
item-availability). - Enviar/actualizar el menú de un restaurante (
menus).
2. Información técnica
| Propiedad | Valor |
|---|---|
artifactId | justeat-client |
groupId | com.hawkersco |
version | 1.0.25-SNAPSHOT |
| Java | 25 |
| Spring Boot | 4.0.6 |
| Tipo de artefacto | JAR (librería, no ejecutable) |
| Módulos | Proyecto único (no multi-módulo) |
3. Arquitectura y diseño
Estructura del proyecto:
com.hawkersco.justeatclient
├── client/
│ └── JustEatClient.java # Interfaz @HttpExchange: check (default), item-availability, menus
├── config/
│ └── JustEatClientConfig.java # @AutoConfiguration: RestClient con header X-Flyt-Api-Key
└── pojo/
├── JustEatMenuRequest.java # Record inmutable: jerarquía Restaurants → Menus → Categories → Items
└── JustEatEventDataRequest.java # Record inmutable: evento de disponibilidad de artículo
A diferencia de otros clientes del ecosistema (p. ej. auro-client, hk-timeslogistics-client), los DTOs de request están modelados como Java records inmutables en lugar de POJOs con Lombok, y no hay capa de autenticación por token: la autenticación se resuelve con una cabecera estática (X-Flyt-Api-Key).
Flujo principal
sequenceDiagram
participant Consumidor as Microservicio consumidor
participant Client as JustEatClient
participant API as API JustEat Flyt
Consumidor->>Client: menus(JustEatMenuRequest) / itemAvailability(JustEatEventDataRequest)
Client->>API: POST /menus | POST /item-availability + header X-Flyt-Api-Key
API-->>Client: ResponseEntity<String>
Client-->>Consumidor: ResponseEntity<String>
La autoconfiguración (JustEatClientConfig) se activa condicionalmente con @ConditionalOnProperty(prefix = "justeat.credentials", name = {"url", "key"}), registrando un único bean JustEatClient cuyo RestClient incorpora la cabecera X-Flyt-Api-Key en todas las peticiones mediante defaultHeader.
El registro de la autoconfiguración se realiza mediante el fichero estándar de Spring Boot:
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
El método check() de JustEatClient es un método default de la interfaz (no anotado con @GetExchange/@PostExchange): no realiza ninguna llamada HTTP, simplemente devuelve ResponseEntity.ok("true") como comprobación local.
4. Dependencias principales
| Dependencia | Versión | Propósito |
|---|---|---|
spring-boot-starter | (gestionada SB4) | Base de Spring Boot (contexto, autoconfiguración) |
spring-web | (gestionada SB4) | RestClient + @HttpExchange / HttpServiceProxyFactory |
spring-boot-starter-test | (gestionada SB4) | Testing (scope test) |
El pom.xml no declara Lombok como dependencia (aunque el maven-compiler-plugin referencia su annotationProcessorPath); no es necesario porque los DTOs se modelan como records de Java, no con anotaciones Lombok.
5. API / Endpoints
No aplica a este proyecto. justeat-client es una librería cliente JAR que no expone endpoints REST propios. Las operaciones que encapsula sobre la API de JustEat Flyt se detallan en la sección 6.
6. Integraciones externas
API JustEat Flyt
| Método cliente | HTTP | Ruta remota | Dirección | Descripción |
|---|---|---|---|---|
check | — | (local, sin llamada) | — | Comprobación de salud local, no consulta la API remota |
itemAvailability | POST | item-availability | Saliente | Notifica un evento de disponibilidad de artículo (alta/baja de stock) |
menus | POST | menus | Saliente | Envía/actualiza el menú completo de un restaurante |
Ejemplo de payload itemAvailability (JustEatEventDataRequest):
{
"event": "OUT_OF_STOCK",
"itemReferences": ["SKU-001", "SKU-002"],
"restaurant": "REST-123",
"happenedAt": "2026-07-10T12:00:00Z"
}
Ejemplo de payload menus (JustEatMenuRequest, resumido):
{
"restaurants": ["REST-123"],
"menus": [
{
"name": "Menú principal",
"reference": "MENU-001",
"type": "DELIVERY",
"categories": [
{
"name": "Camisetas",
"description": "Camisetas Hawkers",
"items": [
{
"name": "Camiseta básica",
"plu": "SKU-001",
"price": 1999,
"reference": "ITEM-001",
"gallery": [
{ "url": "https://cdn.hawkers.example/imagen.jpg" }
]
}
]
}
]
}
]
}
Protocolo: HTTPS REST (JSON, contentType = application/json). Autenticación: cabecera estática X-Flyt-Api-Key (sin flujo de token/refresh).
7. Configuración
No se incluye ningún application.properties/application.yml en la librería. Las propiedades deben ser inyectadas por la aplicación consumidora.
Propiedades requeridas (prefijo justeat.credentials)
| Propiedad | Descripción | Ejemplo de valor |
|---|---|---|
justeat.credentials.url | URL base de la API JustEat Flyt (activa la autoconfiguración) | ${JUSTEAT_URL} |
justeat.credentials.key | Valor de la cabecera X-Flyt-Api-Key | ${JUSTEAT_API_KEY} |
Importante: Si falta
justeat.credentials.urlojusteat.credentials.key, el beanJustEatClientno se registra (condición@ConditionalOnPropertycon ambas claves).
Variables de entorno recomendadas
| Variable | Propiedad mapeada |
|---|---|
JUSTEAT_URL | justeat.credentials.url |
JUSTEAT_API_KEY | justeat.credentials.key |
8. Persistencia
No aplica a este proyecto. La librería no accede a ninguna base de datos ni mantiene estado en memoria.
9. Procesos programados y mensajería
No aplica a este proyecto. No existen jobs @Scheduled, listeners de colas/topics ni runners batch.
10. Ejecución en local
justeat-client es una librería JAR, no una aplicación ejecutable. No tiene servidor embebido; el método check() sirve como comprobación local sin necesidad de levantar ningún servicio.
Requisitos previos
- Java 25
- Maven 3.x
- Acceso al registro de artefactos Maven interno (
europe-west3-maven.pkg.dev/pi-saldum/pi-repo-maven) para resolver/publicar dependencias.
Compilar e instalar en repositorio local
# Compilar sin tests
./mvnw -B -DskipTests clean install
# Compilar con tests
./mvnw clean install
# Ejecutar tests
./mvnw test
Uso como dependencia en un microservicio consumidor
<dependency>
<groupId>com.hawkersco</groupId>
<artifactId>justeat-client</artifactId>
<version>1.0.25-SNAPSHOT</version>
</dependency>
La autoconfiguración se activa automáticamente al declarar justeat.credentials.url y justeat.credentials.key en la aplicación consumidora.
11. Despliegue
El pipeline de Jenkins (Jenkinsfile) consta de dos etapas:
- Checkout — descarga el código del repositorio.
- Publish to Artifact Registry — ejecuta
mvn deploy -DskipTestspara publicar el JAR en Google Artifact Registry.
| Parámetro | Valor |
|---|---|
| JDK | JDK25 (tool Jenkins) |
| Maven | Maven3 (tool Jenkins) |
| Repositorio | europe-west3-maven.pkg.dev/pi-saldum/pi-repo-maven (Artifact Registry GCP) |
No existe Dockerfile ni despliegue como servicio independiente; el artefacto es un JAR publicado en el registro Maven.
Job de Jenkins:
https://jenkins-pi.hawkersco.net/job/justeat-client/
12. Manejo de errores y logging
La librería no implementa ninguna estrategia propia de manejo de excepciones ni logging estructurado. Los métodos itemAvailability y menus declaran explícitamente throws RestClientResponseException, propagando al consumidor los errores HTTP devueltos por la API de JustEat sin envolverlos en una excepción propia.
No hay configuración de logback ni de niveles de log específicos en la librería.
13. Notas y consideraciones
-
Método
check()engañoso: El métodocheck()deJustEatClientno realiza ninguna llamada real a la API de JustEat; siempre devuelve200 OKcon cuerpo"true". Un consumidor que lo use como health-check real de la integración obtendría una falsa sensación de disponibilidad, ya que no valida conectividad, credenciales ni estado del servicio remoto. -
Sin lógica de reintentos ni circuit breaker: El
RestClientse construye sin ningún interceptor de resiliencia (retry, timeout explícito, circuit breaker); cualquier fallo de red o del servicio JustEat se propaga directamente comoRestClientResponseExceptiono excepción de conexión. -
Sin autenticación dinámica: A diferencia de otros clientes del ecosistema (p. ej.
auro-client,hk-timeslogistics-client) que resuelven un token Bearer con caché, este cliente usa una API key estática inyectada como cabecera fija en la construcción delRestClient— no hay rotación ni renovación de credencial en caliente; un cambio dejusteat.credentials.keyrequiere reiniciar el contexto Spring del consumidor. -
DTOs como records inmutables: A diferencia del resto de clientes del ecosistema (basados en POJOs Lombok con anotaciones duales Jackson/Gson), este proyecto modela los payloads de request como records de Java anidados, sin anotaciones de serialización explícitas (se apoya en la convención por defecto de Jackson). No existe ningún DTO de response tipado; ambas operaciones devuelven
ResponseEntity<String>con el cuerpo crudo. -
Sin tests implementados: El directorio
src/test/no existe. La dependenciaspring-boot-starter-testestá declarada pero no hay ninguna prueba, pese a que elCLAUDE.mddel proyecto documenta comandos para ejecutar tests. -
JusteatClientApplication.java: Existe una clase principal de Spring Boot en el paquete raíz, lo que es inusual para una librería. No tiene funcionalidad operativa y probablemente sea un artefacto residual de la generación inicial del proyecto con Spring Initializr, mismo patrón observado en otros clientes del ecosistema.