2026-07-02 03:22:12 +08:00
|
|
|
|
"""缓存 DTO。
|
|
|
|
|
|
|
|
|
|
|
|
定义缓存端口的值对象,包括锁令牌。所有 DTO 均为
|
|
|
|
|
|
``dataclass(frozen=True)``,仅依赖标准库,用于分布式锁管理。
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
from __future__ import annotations
|
|
|
|
|
|
|
|
|
|
|
|
from dataclasses import dataclass
|
|
|
|
|
|
from datetime import datetime
|
|
|
|
|
|
|
2026-07-03 19:18:13 +08:00
|
|
|
|
from yuxi.channels.contract.errors import ValidationError
|
|
|
|
|
|
|
2026-07-02 03:22:12 +08:00
|
|
|
|
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
|
|
|
|
class LockToken:
|
|
|
|
|
|
"""锁令牌。
|
|
|
|
|
|
|
|
|
|
|
|
标识一次分布式锁获取的令牌,携带锁键、令牌值与过期时间,用于锁续期与
|
|
|
|
|
|
释放校验。``key`` 字段使释放操作能从令牌还原锁键,避免适配器维护跨
|
|
|
|
|
|
请求的 ``token -> key`` 映射(ADP-023 / INV-5)。
|
|
|
|
|
|
|
|
|
|
|
|
字段:
|
|
|
|
|
|
key: 锁键(获取时传入,释放时还原)。
|
|
|
|
|
|
value: 令牌值。
|
|
|
|
|
|
expires_at: 过期时间。
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
key: str
|
|
|
|
|
|
value: str
|
|
|
|
|
|
expires_at: datetime
|
2026-07-03 19:18:13 +08:00
|
|
|
|
|
|
|
|
|
|
def __post_init__(self) -> None:
|
|
|
|
|
|
"""校验 key 与 value 非空。
|
|
|
|
|
|
|
|
|
|
|
|
``key`` 与 ``value`` 必须非空,在构造时即抛出 ``ValidationError``,
|
|
|
|
|
|
避免空锁键或空令牌值导致锁释放校验失效(INV-8)。
|
|
|
|
|
|
"""
|
|
|
|
|
|
if not self.key:
|
|
|
|
|
|
raise ValidationError("key", "must not be empty")
|
|
|
|
|
|
if not self.value:
|
|
|
|
|
|
raise ValidationError("value", "must not be empty")
|