package com.baiyue.common.web; import com.fasterxml.jackson.databind.ObjectMapper; import com.baiyue.common.event.EventIdentifiers; import feign.FeignException; import java.util.Collections; import java.util.IdentityHashMap; import java.util.Set; /** Diagnostic identity and finite audit error codes; never serialize exception messages or payloads. */ public final class EventDeliveryObservation { private EventDeliveryObservation() { } public static String eventId(ObjectMapper mapper, String json) { try { String id = mapper.readTree(json).path("eventId").asText(""); return EventIdentifiers.isSupported(id) ? id : null; } catch (Exception invalid) { return null; } // Invalid payloads are still audited by Outbox entry ID. } public static String errorCode(Throwable error, boolean permanent, boolean requestStarted) { Set seen = Collections.newSetFromMap(new IdentityHashMap<>()); for (Throwable cause = error; cause != null && seen.add(cause); cause = cause.getCause()) { if (cause instanceof feign.codec.DecodeException) return "INVALID_RESPONSE"; if (cause instanceof FeignException http && http.status() >= 100 && http.status() <= 599) { return "HTTP_" + http.status(); } } if (!requestStarted) return "INVALID_EVENT"; return permanent ? "PERMANENT_FAILURE" : "DELIVERY_FAILURE"; } }