# ============================================================================= # license_server/schemas.py — Pydantic v2 request/response schemas # ============================================================================= from datetime import datetime from typing import Optional from pydantic import BaseModel, Field # --------------------------------------------------------------------------- # Activation # --------------------------------------------------------------------------- class ActivationRequest(BaseModel): serial: str = Field(..., pattern=r"^AR-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}$") hardware_id: str = Field(..., min_length=16, max_length=64) app_version: str = Field(default="", max_length=20) platform: str = Field(default="", max_length=20) hostname: str = Field(default="", max_length=120) class ActivationResponse(BaseModel): activation_id: str vessel_slot: int licensed_to: str activated_at: datetime expires_at: Optional[datetime] = None # --------------------------------------------------------------------------- # Validation # --------------------------------------------------------------------------- class ValidateResponse(BaseModel): serial: str active: bool hardware_id: str activation_id: str vessel_slot: int licensed_to: str activated_at: datetime last_seen_at: datetime # --------------------------------------------------------------------------- # Admin list # --------------------------------------------------------------------------- class LicenseAdminRecord(BaseModel): serial: str vessel: str issued_at: datetime is_active: bool activations: int class ActivationAdminRecord(BaseModel): activation_id: str serial: str hardware_id: str app_version: str platform: str hostname: str activated_at: datetime last_seen_at: datetime vessel_slot: int revoked: bool licensed_to: str