"""Pydantic request/response models for the HTTP layer.""" from __future__ import annotations from datetime import datetime from decimal import Decimal from enum import Enum from typing import Optional from pydantic import BaseModel, ConfigDict, EmailStr, Field class TierName(str, Enum): lite = "lite" core = "core" pro = "pro" enterprise = "enterprise" class MintRequest(BaseModel): name: str = Field(min_length=1, max_length=200) email: EmailStr tier: TierName years: int = Field(default=1, ge=1, le=10) source: str = Field(default="manual", min_length=1, max_length=40) source_order_id: Optional[str] = Field(default=None, max_length=120) promotion: Optional[str] = Field(default=None, max_length=60) amount_paid: Optional[Decimal] = Field(default=None, ge=0, decimal_places=2) currency: Optional[str] = Field(default="USD", min_length=3, max_length=3) notes: Optional[str] = Field(default=None, max_length=2000) class RevokeRequest(BaseModel): license_key: str = Field(min_length=1, max_length=120) reason: Optional[str] = Field(default=None, max_length=500) class LicenseResponse(BaseModel): model_config = ConfigDict(from_attributes=True) license_key: str name: str email: str tier: str issued_at: datetime expires_at: datetime blob: str source: str source_order_id: Optional[str] promotion: Optional[str] amount_paid: Optional[Decimal] currency: Optional[str] revoked_at: Optional[datetime] notes: Optional[str]