package jnpf.dmsService;
|
|
import jnpf.dmsEntity.qianpiye.DmsQianpiyeOnlyOfficeConstants;
|
import jnpf.util.JsonUtil;
|
import jnpf.util.TicketUtil;
|
import org.springframework.stereotype.Service;
|
import org.springframework.util.StringUtils;
|
|
import java.util.Map;
|
|
/** 校验签批页标注插件调用流程节点接口时携带的 Ticket。 */
|
@Service
|
public class DmsQianpiyeTicketService {
|
|
private final TicketParser ticketParser;
|
|
public DmsQianpiyeTicketService() {
|
this(TicketUtil::parseTicket);
|
}
|
|
DmsQianpiyeTicketService(TicketParser ticketParser) {
|
this.ticketParser = ticketParser;
|
}
|
|
public TicketContext validate(String ticket) {
|
if (!StringUtils.hasText(ticket)) {
|
throw new InvalidQianpiyeTicketException();
|
}
|
Object raw;
|
try {
|
raw = ticketParser.parse(ticket);
|
} catch (RuntimeException e) {
|
throw new InvalidQianpiyeTicketException();
|
}
|
if (!(raw instanceof String) || !StringUtils.hasText((String) raw)) {
|
throw new InvalidQianpiyeTicketException();
|
}
|
Map<?, ?> payload;
|
try {
|
payload = JsonUtil.getJsonToBean((String) raw, Map.class);
|
} catch (RuntimeException e) {
|
throw new InvalidQianpiyeTicketException();
|
}
|
if (payload == null
|
|| !DmsQianpiyeOnlyOfficeConstants.SCOPE.equals(value(payload, "scope"))
|
|| !DmsQianpiyeOnlyOfficeConstants.BIZ_MODULE.equals(value(payload, "bizModule"))
|
|| !DmsQianpiyeOnlyOfficeConstants.BIZ_SCENE.equals(value(payload, "bizScene"))
|
|| !DmsQianpiyeOnlyOfficeConstants.PLUGIN_GUID.equals(value(payload, "pluginGuid"))) {
|
throw new InvalidQianpiyeTicketException();
|
}
|
return new TicketContext(value(payload, "tenantId"), value(payload, "userId"),
|
value(payload, "fileId"), optionalValue(payload, "fileType", "annex"));
|
}
|
|
private static String value(Map<?, ?> payload, String key) {
|
Object value = payload.get(key);
|
if (!(value instanceof String) || !StringUtils.hasText((String) value)) {
|
throw new InvalidQianpiyeTicketException();
|
}
|
return (String) value;
|
}
|
|
private static String optionalValue(Map<?, ?> payload, String key, String defaultValue) {
|
Object value = payload.get(key);
|
if (value == null) return defaultValue;
|
if (!(value instanceof String) || !StringUtils.hasText((String) value)) {
|
throw new InvalidQianpiyeTicketException();
|
}
|
return (String) value;
|
}
|
|
interface TicketParser {
|
Object parse(String ticket);
|
}
|
|
public static final class TicketContext {
|
private final String tenantId;
|
private final String userId;
|
private final String fileId;
|
private final String fileType;
|
|
TicketContext(String tenantId, String userId, String fileId, String fileType) {
|
this.tenantId = tenantId;
|
this.userId = userId;
|
this.fileId = fileId;
|
this.fileType = fileType;
|
}
|
|
public String getTenantId() { return tenantId; }
|
public String getUserId() { return userId; }
|
public String getFileId() { return fileId; }
|
public String getFileType() { return fileType; }
|
}
|
|
public static class InvalidQianpiyeTicketException extends RuntimeException {
|
private static final long serialVersionUID = 1L;
|
|
public InvalidQianpiyeTicketException() {
|
super("签批页标注 Ticket 无效");
|
}
|
}
|
}
|