48 lines
2.3 KiB
Python
48 lines
2.3 KiB
Python
from datetime import datetime
|
|
from typing import List, Optional
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
|
|
class CommentCreateRequest(BaseModel):
|
|
nickname: Optional[str] = Field(None, min_length=1, max_length=50, description="작성자 닉네임 (미입력 시 익명)")
|
|
content: str = Field(..., min_length=1, max_length=100, description="댓글 본문 (한글 기준 100자 이내)")
|
|
parent_id: Optional[int] = Field(None, description="대댓글일 때만 부모 댓글 id")
|
|
|
|
|
|
class ReplyItem(BaseModel):
|
|
"""대댓글 응답"""
|
|
|
|
id: int = Field(..., description="댓글 고유 ID")
|
|
nickname: str = Field(..., description="작성자 닉네임 (미입력 시 '익명')")
|
|
content: Optional[str] = Field(None, description="본문 (소프트 삭제된 경우 null)")
|
|
is_deleted: bool = Field(..., description="삭제 여부")
|
|
is_mine: bool = Field(..., description="현재 로그인 사용자의 댓글 여부")
|
|
created_at: datetime = Field(..., description="작성 일시")
|
|
|
|
|
|
class CommentItem(BaseModel):
|
|
"""최상위 댓글 응답 — replies 포함"""
|
|
|
|
id: int = Field(..., description="댓글 고유 ID")
|
|
nickname: str = Field(..., description="작성자 닉네임 (미입력 시 '익명')")
|
|
content: Optional[str] = Field(None, description="본문 (소프트 삭제된 경우 null)")
|
|
is_deleted: bool = Field(..., description="삭제 여부")
|
|
is_mine: bool = Field(..., description="현재 로그인 사용자의 댓글 여부")
|
|
created_at: datetime = Field(..., description="작성 일시")
|
|
replies: List[ReplyItem] = Field(default_factory=list, description="대댓글 목록")
|
|
|
|
|
|
class CommentCreateResponse(BaseModel):
|
|
id: int = Field(..., description="생성된 댓글 고유 ID")
|
|
nickname: str = Field(..., description="작성자 닉네임 (미입력 시 '익명')")
|
|
parent_id: Optional[int] = Field(None, description="부모 댓글 id (대댓글인 경우)")
|
|
content: str = Field(..., description="댓글 본문")
|
|
created_at: datetime = Field(..., description="작성 일시")
|
|
|
|
|
|
class DeleteCommentResponse(BaseModel):
|
|
success: bool = Field(..., description="삭제 성공 여부")
|
|
comment_id: int = Field(..., description="삭제된 댓글 ID")
|
|
message: str = Field(..., description="결과 메시지")
|