feat: 新增适配验证接口,mediabot 可提交站点访问结果,管理员可校验适配是否正确

This commit is contained in:
mediabot-pt
2026-06-30 22:36:45 +08:00
parent c947ce56d2
commit 83e150b8c9
12 changed files with 613 additions and 0 deletions

View File

@@ -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());
}
}
}