76 lines
1.7 KiB
Python
76 lines
1.7 KiB
Python
"""
|
|
Instagram Graph API Pydantic 모델
|
|
|
|
API 응답 데이터를 위한 Pydantic 모델 정의입니다.
|
|
"""
|
|
|
|
from datetime import datetime
|
|
from typing import Any, Optional
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
|
|
class Media(BaseModel):
|
|
"""Instagram 미디어 정보"""
|
|
|
|
id: str
|
|
media_type: Optional[str] = None
|
|
media_url: Optional[str] = None
|
|
thumbnail_url: Optional[str] = None
|
|
caption: Optional[str] = None
|
|
timestamp: Optional[datetime] = None
|
|
permalink: Optional[str] = None
|
|
like_count: int = 0
|
|
comments_count: int = 0
|
|
children: Optional[list["Media"]] = None
|
|
|
|
|
|
class MediaList(BaseModel):
|
|
"""미디어 목록 응답"""
|
|
|
|
data: list[Media] = Field(default_factory=list)
|
|
paging: Optional[dict[str, Any]] = None
|
|
|
|
@property
|
|
def next_cursor(self) -> Optional[str]:
|
|
"""다음 페이지 커서"""
|
|
if self.paging and "cursors" in self.paging:
|
|
return self.paging["cursors"].get("after")
|
|
return None
|
|
|
|
|
|
class MediaContainer(BaseModel):
|
|
"""미디어 컨테이너 상태"""
|
|
|
|
id: str
|
|
status_code: Optional[str] = None
|
|
status: Optional[str] = None
|
|
|
|
@property
|
|
def is_finished(self) -> bool:
|
|
return self.status_code == "FINISHED"
|
|
|
|
@property
|
|
def is_error(self) -> bool:
|
|
return self.status_code == "ERROR"
|
|
|
|
@property
|
|
def is_in_progress(self) -> bool:
|
|
return self.status_code == "IN_PROGRESS"
|
|
|
|
|
|
class APIError(BaseModel):
|
|
"""API 에러 응답"""
|
|
|
|
message: str
|
|
type: Optional[str] = None
|
|
code: Optional[int] = None
|
|
error_subcode: Optional[int] = None
|
|
fbtrace_id: Optional[str] = None
|
|
|
|
|
|
class ErrorResponse(BaseModel):
|
|
"""에러 응답 래퍼"""
|
|
|
|
error: APIError
|