feat: 新增 /api/v1/sites/{siteId}/info 站点信息反馈接口, 支持多名称/多地址/状态/备注

This commit is contained in:
mediabot-pt
2026-06-30 00:16:05 +08:00
parent a4d5c9aa4f
commit 48d0e6a247
3 changed files with 104 additions and 0 deletions

View File

@@ -66,4 +66,33 @@ public class SiteController {
Site site = siteService.submitSite(siteId, name, description, baseUrl, iconUrl, siteType, submitterId); Site site = siteService.submitSite(siteId, name, description, baseUrl, iconUrl, siteType, submitterId);
return ApiResponse.success(siteService.toDTO(site)); return ApiResponse.success(siteService.toDTO(site));
} }
/**
* 提交站点信息反馈(需 HMAC 鉴权)
* 接收站点状态、多名称、多地址、备注等信息
*/
@PostMapping("/{siteId}/info")
public ApiResponse<SiteDTO> submitSiteInfo(
@PathVariable("siteId") String siteId,
@RequestBody Map<String, Object> payload,
HttpServletRequest request) {
String status = (String) payload.getOrDefault("status", "正常");
@SuppressWarnings("unchecked")
List<String> names = payload.get("names") instanceof List<?> l
? l.stream().filter(o -> o instanceof String).map(o -> (String) o).toList()
: List.of();
@SuppressWarnings("unchecked")
List<String> urls = payload.get("urls") instanceof List<?> l
? l.stream().filter(o -> o instanceof String).map(o -> (String) o).toList()
: List.of();
String notes = (String) payload.get("notes");
Long submitterId = (Long) request.getAttribute("accountId");
Site site = siteService.updateSiteInfo(siteId, status, names, urls, notes, submitterId);
return ApiResponse.success(siteService.toDTO(site));
}
} }

View File

@@ -31,6 +31,12 @@ public interface SiteService {
Site submitSite(String siteId, String name, String description, String baseUrl, Site submitSite(String siteId, String name, String description, String baseUrl,
String iconUrl, String siteType, Long submitterId); String iconUrl, String siteType, Long submitterId);
/**
* 提交站点信息反馈(状态、多名称、多地址、备注)
*/
Site updateSiteInfo(String siteId, String status, List<String> names,
List<String> urls, String notes, Long submitterId);
/** 待审核站点列表 */ /** 待审核站点列表 */
List<Site> listPendingSites(); List<Site> listPendingSites();

View File

@@ -1,24 +1,32 @@
package com.par.core.service.impl; package com.par.core.service.impl;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.par.core.dto.SiteDTO; import com.par.core.dto.SiteDTO;
import com.par.core.entity.Site; import com.par.core.entity.Site;
import com.par.core.enums.SiteStatus; import com.par.core.enums.SiteStatus;
import com.par.core.enums.SiteType;
import com.par.core.mapper.SiteMapper; import com.par.core.mapper.SiteMapper;
import com.par.core.service.SiteService; import com.par.core.service.SiteService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
* 站点服务实现 * 站点服务实现
*/ */
@Slf4j
@Service @Service
@RequiredArgsConstructor @RequiredArgsConstructor
public class SiteServiceImpl implements SiteService { public class SiteServiceImpl implements SiteService {
private final SiteMapper siteMapper; private final SiteMapper siteMapper;
private static final ObjectMapper objectMapper = new ObjectMapper();
@Override @Override
public List<SiteDTO> listActiveSites() { public List<SiteDTO> listActiveSites() {
@@ -83,6 +91,67 @@ public class SiteServiceImpl implements SiteService {
return site; return site;
} }
@Override
public Site updateSiteInfo(String siteId, String status, List<String> names,
List<String> urls, String notes, Long submitterId) {
// 映射状态:正常→ACTIVE, 关停/已迁移→DEPRECATED, 维护中→ACTIVE(带备注)
SiteStatus siteStatus;
if (status == null) {
siteStatus = SiteStatus.ACTIVE;
} else {
switch (status) {
case "关停":
case "已迁移":
siteStatus = SiteStatus.DEPRECATED;
break;
case "维护中":
case "正常":
default:
siteStatus = SiteStatus.ACTIVE;
break;
}
}
// 构建额外信息 JSON
Map<String, Object> extraInfo = new LinkedHashMap<>();
if (names != null && !names.isEmpty()) extraInfo.put("names", names);
if (urls != null && !urls.isEmpty()) extraInfo.put("urls", urls);
if (notes != null && !notes.isBlank()) extraInfo.put("notes", notes);
String extraJson = null;
try {
if (!extraInfo.isEmpty()) extraJson = objectMapper.writeValueAsString(extraInfo);
} catch (JsonProcessingException ignored) {}
Site existing = siteMapper.selectBySiteId(siteId);
if (existing != null) {
// 更新已有站点
if (names != null && !names.isEmpty()) existing.setName(names.get(0));
if (urls != null && !urls.isEmpty()) existing.setBaseUrl(urls.get(0));
if (extraJson != null) existing.setDescription(
existing.getDescription() != null && !existing.getDescription().isBlank()
? existing.getDescription() : extraJson);
existing.setStatus(siteStatus);
existing.setSubmitterId(submitterId != null ? submitterId : existing.getSubmitterId());
siteMapper.updateById(existing);
log.info("站点信息反馈更新: siteId={} status={}", siteId, siteStatus.getValue());
return existing;
}
// 创建新站点(PENDING 状态)
Site site = new Site();
site.setSiteId(siteId);
site.setName(names != null && !names.isEmpty() ? names.get(0) : siteId);
site.setBaseUrl(urls != null && !urls.isEmpty() ? urls.get(0) : "");
site.setDescription(extraJson);
site.setSiteType(SiteType.UNKNOWN);
site.setSchemaVersion("1.0.0");
site.setStatus(SiteStatus.PENDING);
site.setSubmitterId(submitterId);
siteMapper.insert(site);
log.info("站点信息反馈创建: siteId={} status=PENDING", siteId);
return site;
}
@Override @Override
public List<Site> listPendingSites() { public List<Site> listPendingSites() {
return siteMapper.selectList( return siteMapper.selectList(