package jnpf.dmsService; import com.fasterxml.jackson.databind.JsonNode; import jnpf.dmsMapper.DmsVersionPropertiesMapper; import jnpf.dmsEntity.permission.entity.DmsFileVersionEntity; import jnpf.exception.DataException; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.nio.charset.StandardCharsets; import java.util.Objects; import java.util.UUID; /** Version persistence only: no business-form, workflow or user-directory lookup. */ @Service @RequiredArgsConstructor public class DmsVersionPropertiesService { private final DmsVersionPropertiesMapper mapper; /** Insert metadata and optional snapshot together: persisted versions reject snapshot-only updates. */ public void insertVersion(DmsFileVersionEntity version, JsonNode properties) { String snapshot = null; if (properties != null && !properties.isNull()) { validate(properties); snapshot = properties.toString(); } if (mapper.insertVersion(version, snapshot) != 1) throw new DataException("文件版本及扩展属性保存失败"); } public void verifyRetry(String tenant, UUID version, JsonNode properties) { // Old callers may omit the optional extension; omission must never clear a snapshot. if (properties == null || properties.isNull()) return; validate(properties); var saved = mapper.find(tenant, version); if (saved == null || !Objects.equals(saved.getExtendedProperties(), properties)) throw new DataException("重复登记的文件版本扩展属性不一致"); } private void validate(JsonNode value) { if (!value.isObject() || value.toString().getBytes(StandardCharsets.UTF_8).length > 32768) throw new DataException("文件版本扩展属性必须为不超过32KB的JSON对象"); if (value.has("prepared_by_name") && !value.get("prepared_by_name").isTextual()) throw new DataException("制定人姓名快照必须为文本"); if (value.has("reviewers")) { if (!value.get("reviewers").isArray()) throw new DataException("审核人快照必须为数组"); for (JsonNode reviewer : value.get("reviewers")) { if (!reviewer.isObject() || !reviewer.path("user_id").isTextual() || reviewer.path("user_id").asText().isBlank() || !reviewer.path("name").isTextual()) throw new DataException("审核人快照缺少人员ID或姓名"); } } } }