58 lines
2.9 KiB
Java
58 lines
2.9 KiB
Java
package com.baiyue.eventbridge.controller;
|
|
|
|
import com.baiyue.common.core.api.ApiResponse;
|
|
import com.baiyue.common.event.EventEnvelope;
|
|
import com.baiyue.eventbridge.dto.BridgeStatus;
|
|
import com.baiyue.eventbridge.dto.EventReceiveResult;
|
|
import com.baiyue.eventbridge.service.EventInboxService;
|
|
import com.baiyue.eventbridge.security.InternalServiceTokenGuard;
|
|
import io.swagger.v3.oas.annotations.Operation;
|
|
import io.swagger.v3.oas.annotations.Parameter;
|
|
import io.swagger.v3.oas.annotations.responses.ApiResponses;
|
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
|
import lombok.RequiredArgsConstructor;
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
import org.springframework.web.bind.annotation.GetMapping;
|
|
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.RequestMapping;
|
|
import org.springframework.web.bind.annotation.RestController;
|
|
|
|
/**
|
|
* 事件桥内部接口。生产环境必须在网关或基础设施层增加 mTLS 与来源白名单。
|
|
*/
|
|
@Tag(name = "事件桥内部接口", description = "跨区域事件的幂等接收与能力状态")
|
|
@RestController
|
|
@RequestMapping("/internal/event-bridge")
|
|
@RequiredArgsConstructor
|
|
public class EventBridgeController {
|
|
private final EventInboxService eventInboxService;
|
|
private final InternalServiceTokenGuard internalServiceTokenGuard;
|
|
|
|
@Value("${baiyue.region:CN}")
|
|
private String region;
|
|
|
|
@Operation(summary = "幂等接收事件", description = "当前仅完成数据库接收骨架,不代表生产跨区传输和 mTLS 已开通")
|
|
@ApiResponses({
|
|
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "事件已接收或判定为重复"),
|
|
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "401", description = "内部服务令牌无效"),
|
|
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "503", description = "内部服务令牌未配置,接收接口关闭")
|
|
})
|
|
@PostMapping("/events")
|
|
public ApiResponse<EventReceiveResult> receive(
|
|
@Parameter(description = "内部服务共享令牌")
|
|
@RequestHeader(value = "X-Internal-Service-Token", required = false) String token,
|
|
@RequestBody EventEnvelope envelope) {
|
|
internalServiceTokenGuard.verify(token);
|
|
return ApiResponse.success(eventInboxService.receive(envelope));
|
|
}
|
|
|
|
@Operation(summary = "查询事件桥能力状态")
|
|
@ApiResponses(@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "查询成功"))
|
|
@GetMapping("/status")
|
|
public ApiResponse<BridgeStatus> status() {
|
|
return ApiResponse.success(new BridgeStatus("运行中", region, true, false));
|
|
}
|
|
}
|