"""User request and response schemas.""" from __future__ import annotations from datetime import datetime from typing import Literal from pydantic import BaseModel, Field, field_validator class UserResponse(BaseModel): id: str username: str email: str | None = None permission: Literal["read", "trade-write", "admin"] = "read" is_active: bool = True created_at: datetime | None = None updated_at: datetime | None = None last_login_at: datetime | None = None class CreateUserRequest(BaseModel): username: str = Field(min_length=1) email: str | None = None password: str = Field(min_length=8) permission: Literal["read", "trade-write", "admin"] = "read" is_active: bool = True @field_validator("username") @classmethod def normalize_username(cls, value: str) -> str: normalized = value.strip() if not normalized: raise ValueError("username은 비어 있을 수 없습니다") return normalized @field_validator("email") @classmethod def normalize_email(cls, value: str | None) -> str | None: if value is None: return None normalized = value.strip() return normalized or None class UpdateUserRequest(BaseModel): username: str | None = Field(default=None, min_length=1) email: str | None = None password: str | None = Field(default=None, min_length=8) permission: Literal["read", "trade-write", "admin"] | None = None is_active: bool | None = None @field_validator("username") @classmethod def normalize_username(cls, value: str | None) -> str | None: if value is None: return None normalized = value.strip() if not normalized: raise ValueError("username은 비어 있을 수 없습니다") return normalized @field_validator("email") @classmethod def normalize_email(cls, value: str | None) -> str | None: if value is None: return None normalized = value.strip() return normalized or None