package com.baiyue.lastleg.client; import com.baiyue.common.core.api.ApiResponse; import com.baiyue.common.event.DeliveryAck; import com.baiyue.common.event.EventEnvelope; import com.baiyue.common.event.EventTypes; import lombok.RequiredArgsConstructor; import com.baiyue.common.web.EventDeliveryFailure; import java.util.Set; import org.springframework.stereotype.Component; /** Dispatches each supported business event directly to its owning service. */ @Component @RequiredArgsConstructor public class DirectEventClient { private static final Set FINANCE_PERMANENT_CODES = Set.of( "FIN-EVT-001", "FIN-EVT-002", "FIN-EVT-004", "FIN-EVT-007", "FIN-EVT-008", "FIN-EVT-012", "FIN-EVT-015", "FIN-EVT-016", "FIN-EVT-401"); private final FirstlegEventClient firstleg; private final FinanceBusinessEventClient finance; public ApiResponse receive(String token, EventEnvelope event) { event.requireValid(); return switch (event.eventType()) { case EventTypes.OVERSEAS_CONTAINER_UNLOADED, EventTypes.OVERSEAS_INBOUND_ORDER_DETAINED_CHANGED, EventTypes.OVERSEAS_DELIVERY_COMPLETED -> firstleg.receive(token, event); case EventTypes.WALLET_COMMAND_REQUESTED -> checkedFinance(finance.wallet(token, event)); case EventTypes.BUSINESS_FEE_SOURCE_CHANGED -> checkedFinance(finance.fee(token, event)); case EventTypes.COMPANY_VEHICLE_COST_SUBMITTED -> checkedVehicleCost(finance.vehicleCost(token, event)); default -> throw new EventDeliveryFailure(true, "Unsupported outbound event type: " + event.eventType()); }; } private ApiResponse checkedFinance(ApiResponse response) { EventDeliveryFailure.requireSuccessful(response, FINANCE_PERMANENT_CODES); return response; } private ApiResponse checkedVehicleCost(ApiResponse response) { var permanentCodes = new java.util.HashSet<>(FINANCE_PERMANENT_CODES); permanentCodes.addAll(Set.of("FIN_400", "FIN_404", "FIN_409")); EventDeliveryFailure.requireSuccessful(response, permanentCodes); return response; } }