package jnpf.dmsPermission; import lombok.AllArgsConstructor; import lombok.Data; import org.springframework.stereotype.Component; import java.nio.charset.StandardCharsets; import java.sql.Timestamp; import java.time.Instant; import java.util.Base64; import java.util.Date; import java.util.UUID; @Component public class DmsCursorCodec { public String encode(Date time, UUID id) { String raw = time.toInstant().toString() + "|" + id; return Base64.getUrlEncoder().withoutPadding().encodeToString(raw.getBytes(StandardCharsets.UTF_8)); } public Cursor decode(String value) { if (value == null || value.trim().isEmpty()) { return new Cursor(null, null); } try { String raw = new String(Base64.getUrlDecoder().decode(value), StandardCharsets.UTF_8); int separator = raw.indexOf('|'); if (separator < 1) { throw new IllegalArgumentException("missing separator"); } return new Cursor(Timestamp.from(Instant.parse(raw.substring(0, separator))), UUID.fromString(raw.substring(separator + 1))); } catch (RuntimeException ex) { throw DmsPermissionException.of(DmsPermissionError.INVALID_REQUEST, "分页 cursor 无效"); } } @Data @AllArgsConstructor public static class Cursor { private Date time; private UUID id; } }