feat: 新增适配验证接口,mediabot 可提交站点访问结果,管理员可校验适配是否正确
This commit is contained in:
@@ -0,0 +1,110 @@
|
||||
package com.par.api.controller;
|
||||
|
||||
import com.par.core.dto.AccessResultDTO;
|
||||
import com.par.core.dto.ApiResponse;
|
||||
import com.par.core.entity.AccessResult;
|
||||
import com.par.core.service.AccessResultService;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 站点访问结果控制器
|
||||
* 提交需 HMAC 鉴权(mediabot 调用),查看需管理员权限
|
||||
*/
|
||||
@Slf4j
|
||||
@RestController
|
||||
@RequiredArgsConstructor
|
||||
public class AccessResultController {
|
||||
|
||||
private final AccessResultService accessResultService;
|
||||
|
||||
// ==================== mediabot 提交接口(PSK 鉴权) ====================
|
||||
|
||||
/**
|
||||
* mediabot 提交访问站点的返回数据
|
||||
*/
|
||||
@PostMapping("/api/v1/sites/{siteId}/access-result")
|
||||
public ApiResponse<AccessResultDTO> submitAccessResult(
|
||||
@PathVariable("siteId") String siteId,
|
||||
@RequestBody Map<String, Object> payload,
|
||||
HttpServletRequest request) {
|
||||
|
||||
String configVersion = (String) payload.get("configVersion");
|
||||
String contentType = (String) payload.getOrDefault("contentType", "html");
|
||||
String content = (String) payload.get("content");
|
||||
String url = (String) payload.get("url");
|
||||
Integer statusCode = payload.get("statusCode") instanceof Integer i ? i : null;
|
||||
Integer responseTimeMs = payload.get("responseTimeMs") instanceof Integer i ? i : null;
|
||||
|
||||
if (content == null || content.isBlank()) {
|
||||
return ApiResponse.error(400, "content is required");
|
||||
}
|
||||
|
||||
String clientId = (String) request.getAttribute("clientId");
|
||||
Long submitterId = (Long) request.getAttribute("accountId");
|
||||
|
||||
AccessResult result = accessResultService.submit(
|
||||
siteId, configVersion, clientId, contentType, content,
|
||||
url, statusCode, responseTimeMs, submitterId);
|
||||
|
||||
return ApiResponse.success(accessResultService.toDTO(result));
|
||||
}
|
||||
|
||||
// ==================== 管理员查看接口(JWT 鉴权) ====================
|
||||
|
||||
/**
|
||||
* 获取所有访问结果列表
|
||||
*/
|
||||
@GetMapping("/api/v1/admin/access-results")
|
||||
public ApiResponse<List<AccessResultDTO>> listAll() {
|
||||
return ApiResponse.success(accessResultService.listAll());
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取指定站点的访问结果
|
||||
*/
|
||||
@GetMapping("/api/v1/admin/access-results/by-site/{siteId}")
|
||||
public ApiResponse<List<AccessResultDTO>> listBySiteId(@PathVariable("siteId") String siteId) {
|
||||
return ApiResponse.success(accessResultService.listBySiteId(siteId));
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取单个访问结果详情(含完整内容)
|
||||
*/
|
||||
@GetMapping("/api/v1/admin/access-results/{id}")
|
||||
public ApiResponse<AccessResultDTO> getById(@PathVariable("id") Long id) {
|
||||
AccessResult result = accessResultService.getById(id);
|
||||
if (result == null) {
|
||||
return ApiResponse.error(404, "访问结果不存在");
|
||||
}
|
||||
return ApiResponse.success(accessResultService.toDTO(result));
|
||||
}
|
||||
|
||||
/**
|
||||
* 管理员验证适配结果
|
||||
*/
|
||||
@PostMapping("/api/v1/admin/access-results/{id}/validate")
|
||||
public ApiResponse<AccessResultDTO> validate(
|
||||
@PathVariable("id") Long id,
|
||||
@RequestBody Map<String, Object> payload) {
|
||||
|
||||
Boolean isValid = payload.get("isValid") instanceof Boolean b ? b : null;
|
||||
String note = (String) payload.getOrDefault("note", "");
|
||||
|
||||
if (isValid == null) {
|
||||
return ApiResponse.error(400, "isValid is required");
|
||||
}
|
||||
|
||||
try {
|
||||
AccessResult result = accessResultService.validate(id, isValid, note);
|
||||
return ApiResponse.success(accessResultService.toDTO(result));
|
||||
} catch (IllegalArgumentException e) {
|
||||
return ApiResponse.error(404, e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user