53 lines
2.5 KiB
Java
53 lines
2.5 KiB
Java
package com.baiyue.firstleg.controller;
|
|
|
|
import com.baiyue.common.core.api.ApiResponse;
|
|
import com.baiyue.common.core.api.ResultCode;
|
|
import com.baiyue.common.core.exception.BizException;
|
|
import com.baiyue.common.event.EventEnvelope;
|
|
import com.baiyue.common.event.DeliveryAck;
|
|
import com.baiyue.common.event.EventTypes;
|
|
import com.baiyue.firstleg.service.OverseasContainerEventConsumer;
|
|
import com.baiyue.firstleg.service.OverseasInboundOrderDetainedConsumer;
|
|
import com.baiyue.firstleg.service.OverseasDeliveryCompletedConsumer;
|
|
import lombok.RequiredArgsConstructor;
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
import org.springframework.web.bind.annotation.PostMapping;
|
|
import org.springframework.web.bind.annotation.RequestBody;
|
|
import org.springframework.web.bind.annotation.RequestHeader;
|
|
import org.springframework.web.bind.annotation.RestController;
|
|
|
|
import java.nio.charset.StandardCharsets;
|
|
import java.security.MessageDigest;
|
|
|
|
@RestController
|
|
@RequiredArgsConstructor
|
|
public class InternalOverseasContainerEventController {
|
|
private final OverseasContainerEventConsumer consumer;
|
|
private final OverseasInboundOrderDetainedConsumer detainedConsumer;
|
|
private final OverseasDeliveryCompletedConsumer deliveryCompletedConsumer;
|
|
@Value("${baiyue.security.internal-service-token}") private String expectedToken;
|
|
|
|
@PostMapping("/internal/firstleg/v1/container-events")
|
|
public ApiResponse<DeliveryAck> receive(
|
|
@RequestHeader(value = "X-Internal-Service-Token", required = false) String token,
|
|
@RequestBody EventEnvelope event) {
|
|
authenticate(token);
|
|
event.requireValid();
|
|
DeliveryAck result = switch (event.eventType()) {
|
|
case EventTypes.OVERSEAS_CONTAINER_UNLOADED -> consumer.consume(event);
|
|
case EventTypes.OVERSEAS_INBOUND_ORDER_DETAINED_CHANGED -> detainedConsumer.consume(event);
|
|
case EventTypes.OVERSEAS_DELIVERY_COMPLETED -> deliveryCompletedConsumer.consume(event);
|
|
default -> throw new IllegalArgumentException("不支持的 Firstleg 业务事件类型");
|
|
};
|
|
return ApiResponse.success(result);
|
|
}
|
|
|
|
private void authenticate(String token) {
|
|
if (token == null || expectedToken == null || expectedToken.isBlank()
|
|
|| !MessageDigest.isEqual(token.getBytes(StandardCharsets.UTF_8),
|
|
expectedToken.getBytes(StandardCharsets.UTF_8))) {
|
|
throw new BizException(ResultCode.FORBIDDEN, "内部服务令牌无效");
|
|
}
|
|
}
|
|
}
|