feat: 新增 /api/v1/sites/{siteId}/info 站点信息反馈接口, 支持多名称/多地址/状态/备注
This commit is contained in:
@@ -66,4 +66,33 @@ public class SiteController {
|
||||
Site site = siteService.submitSite(siteId, name, description, baseUrl, iconUrl, siteType, submitterId);
|
||||
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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,6 +31,12 @@ public interface SiteService {
|
||||
Site submitSite(String siteId, String name, String description, String baseUrl,
|
||||
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();
|
||||
|
||||
|
||||
@@ -1,24 +1,32 @@
|
||||
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.entity.Site;
|
||||
import com.par.core.enums.SiteStatus;
|
||||
import com.par.core.enums.SiteType;
|
||||
import com.par.core.mapper.SiteMapper;
|
||||
import com.par.core.service.SiteService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 站点服务实现
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class SiteServiceImpl implements SiteService {
|
||||
|
||||
private final SiteMapper siteMapper;
|
||||
private static final ObjectMapper objectMapper = new ObjectMapper();
|
||||
|
||||
@Override
|
||||
public List<SiteDTO> listActiveSites() {
|
||||
@@ -83,6 +91,67 @@ public class SiteServiceImpl implements SiteService {
|
||||
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
|
||||
public List<Site> listPendingSites() {
|
||||
return siteMapper.selectList(
|
||||
|
||||
Reference in New Issue
Block a user