package jnpf.dmsEntity.download.model; import jnpf.dmsEntity.preview.model.DmsWatermarkSnapshot; import jnpf.dmsEntity.storage.model.DmsPersistentPdfSource; import jnpf.util.JsonUtil; import lombok.Data; import java.util.ArrayList; import java.util.List; import java.util.UUID; @Data public class DmsFileDownloadTicket { public static final String SCOPE = "dms:file:download"; private String scope; private String tenantId; private String userId; private UUID fileVersionId; private String fileName; private String mimeType; private Long sizeBytes; private String storagePlatform; private String bucketName; private String basePath; private String objectPath; private String objectName; private DmsPersistentPdfSource pdfSource; private List watermarks = new ArrayList<>(); /** Set only by a permission-checked historical issuance; absent legacy value means current use. */ private boolean historicalAccess; private long expiresAt; public static DmsFileDownloadTicket fromRaw(Object raw) { if (!(raw instanceof String) || isBlank((String) raw)) { throw new IllegalArgumentException("DMS 下载票据无效"); } DmsFileDownloadTicket payload; try { payload = JsonUtil.getJsonToBean((String) raw, DmsFileDownloadTicket.class); } catch (RuntimeException exception) { throw new IllegalArgumentException("DMS 下载票据无效", exception); } if (payload == null || !SCOPE.equals(payload.getScope()) || isBlank(payload.getTenantId()) || isBlank(payload.getUserId()) || payload.getFileVersionId() == null || isBlank(payload.getFileName()) || isBlank(payload.getStoragePlatform()) || isBlank(payload.getBucketName()) || isBlank(payload.getObjectPath()) || isBlank(payload.getObjectName()) || payload.getExpiresAt() <= System.currentTimeMillis()) { throw new IllegalArgumentException("DMS 下载票据无效或已过期"); } return payload; } private static boolean isBlank(String value) { return value == null || value.trim().isEmpty(); } }