""" Bulletin Board Schemas - 게시판 스키마 """ from datetime import datetime from typing import Optional, List from pydantic import BaseModel # ============ Category Schemas ============ class BoardCategoryBase(BaseModel): name: str name_en: Optional[str] = None name_mn: Optional[str] = None name_ru: Optional[str] = None slug: str description: Optional[str] = None sort_order: int = 0 is_active: bool = True class BoardCategoryCreate(BoardCategoryBase): pass class BoardCategoryUpdate(BaseModel): name: Optional[str] = None name_en: Optional[str] = None name_mn: Optional[str] = None name_ru: Optional[str] = None slug: Optional[str] = None description: Optional[str] = None sort_order: Optional[int] = None is_active: Optional[bool] = None class BoardCategoryResponse(BoardCategoryBase): id: int created_at: datetime updated_at: Optional[datetime] = None post_count: int = 0 class Config: from_attributes = True # ============ Post Schemas ============ class BoardPostBase(BaseModel): title: str content: str category_id: int class BoardPostCreate(BoardPostBase): is_notice: bool = False # 관리자만 true 가능 class BoardPostUpdate(BaseModel): title: Optional[str] = None content: Optional[str] = None category_id: Optional[int] = None is_notice: Optional[bool] = None is_pinned: Optional[bool] = None is_published: Optional[bool] = None class AuthorResponse(BaseModel): id: int name: Optional[str] = None email: str is_admin: bool = False class Config: from_attributes = True class BoardPostResponse(BaseModel): id: int title: str content: str category_id: int category: Optional[BoardCategoryResponse] = None author_id: int author: Optional[AuthorResponse] = None is_notice: bool is_pinned: bool is_published: bool view_count: int created_at: datetime updated_at: Optional[datetime] = None class Config: from_attributes = True class BoardPostListItem(BaseModel): """목록에서 보여줄 간략한 정보""" id: int title: str category_id: int category_name: Optional[str] = None author_id: int author_name: Optional[str] = None is_notice: bool is_pinned: bool view_count: int created_at: datetime class Config: from_attributes = True class BoardPostListResponse(BaseModel): posts: List[BoardPostListItem] notices: List[BoardPostListItem] # 공지사항 (상단 고정) total: int page: int page_size: int total_pages: int class BoardCategoryListResponse(BaseModel): categories: List[BoardCategoryResponse] total: int