from datetime import datetime from typing import List, Optional from pydantic import EmailStr, Field from app.models.schemas.rwschema import RWSchema class AdminRoleLite(RWSchema): id: int name: str description: str = "" permissions: List[str] = Field(default_factory=list) class AdminUserSummary(RWSchema): id: int username: str email: EmailStr bio: Optional[str] = None image: Optional[str] = None roles: List[AdminRoleLite] = Field(default_factory=list) created_at: datetime updated_at: datetime class AdminUserCreate(RWSchema): username: str email: EmailStr password: str = Field(min_length=6, max_length=64) bio: Optional[str] = None image: Optional[str] = None role_ids: List[int] = Field(default_factory=list) class AdminUserUpdate(RWSchema): username: Optional[str] = None email: Optional[EmailStr] = None password: Optional[str] = Field(default=None, min_length=6, max_length=64) bio: Optional[str] = None image: Optional[str] = None role_ids: Optional[List[int]] = None class AdminUserResponse(RWSchema): user: AdminUserSummary class AdminUserListResponse(RWSchema): users: List[AdminUserSummary] total: int class AdminDashboardStats(RWSchema): users: int roles: int articles: int total_views: int published_today: int class AdminMenuSlot(RWSchema): slot_key: str = Field(..., alias="slotKey") label: str tags: List[str] = Field(default_factory=list) created_at: Optional[datetime] = None updated_at: Optional[datetime] = None class AdminMenuSlotUpdate(RWSchema): tags: List[str] = Field(default_factory=list) label: Optional[str] = None class AdminMenuSlotResponse(RWSchema): slot: AdminMenuSlot class AdminMenuSlotListResponse(RWSchema): slots: List[AdminMenuSlot] = Field(default_factory=list) class AdminHomeFeaturedItem(RWSchema): slug: str class AdminHomeFeaturedUpdate(RWSchema): articles: List[AdminHomeFeaturedItem] = Field(default_factory=list)