Skip to main content

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

PropiedadValor
artifactIdjusteat-client
groupIdcom.hawkersco
version1.0.25-SNAPSHOT
Java25
Spring Boot4.0.6
Tipo de artefactoJAR (librería, no ejecutable)
MódulosProyecto ú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

DependenciaVersiónPropó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 clienteHTTPRuta remotaDirecciónDescripción
check(local, sin llamada)Comprobación de salud local, no consulta la API remota
itemAvailabilityPOSTitem-availabilitySalienteNotifica un evento de disponibilidad de artículo (alta/baja de stock)
menusPOSTmenusSalienteEnví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)

PropiedadDescripciónEjemplo de valor
justeat.credentials.urlURL base de la API JustEat Flyt (activa la autoconfiguración)${JUSTEAT_URL}
justeat.credentials.keyValor de la cabecera X-Flyt-Api-Key${JUSTEAT_API_KEY}

Importante: Si falta justeat.credentials.url o justeat.credentials.key, el bean JustEatClient no se registra (condición @ConditionalOnProperty con ambas claves).

Variables de entorno recomendadas

VariablePropiedad mapeada
JUSTEAT_URLjusteat.credentials.url
JUSTEAT_API_KEYjusteat.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:

  1. Checkout — descarga el código del repositorio.
  2. Publish to Artifact Registry — ejecuta mvn deploy -DskipTests para publicar el JAR en Google Artifact Registry.
ParámetroValor
JDKJDK25 (tool Jenkins)
MavenMaven3 (tool Jenkins)
Repositorioeurope-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étodo check() de JustEatClient no realiza ninguna llamada real a la API de JustEat; siempre devuelve 200 OK con 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 RestClient se construye sin ningún interceptor de resiliencia (retry, timeout explícito, circuit breaker); cualquier fallo de red o del servicio JustEat se propaga directamente como RestClientResponseException o 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 del RestClient — no hay rotación ni renovación de credencial en caliente; un cambio de justeat.credentials.key requiere 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 dependencia spring-boot-starter-test está declarada pero no hay ninguna prueba, pese a que el CLAUDE.md del 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.