"""
MCP 캘린더 시스템의 기본 모델들
"""
from datetime import datetime
from enum import Enum
from typing import Optional, Union
from pydantic import BaseModel, Field, field_validator, ConfigDict, field_serializer
class EventCategory(str, Enum):
"""이벤트 카테고리"""
STUDY = "STUDY" # 학습
WORK = "WORK" # 업무
REST = "REST" # 휴식
ACTIVITY = "ACTIVITY" # 활동
class EventStatus(str, Enum):
"""이벤트 상태"""
PLANNED = "PLANNED" # 계획됨
COMPLETED = "COMPLETED" # 완료됨
CANCELED = "CANCELED" # 취소됨
class CalendarEvent(BaseModel):
"""캘린더 이벤트 엔티티"""
id: int
user_id: int
title: str
description: Optional[str] = None
location: Optional[str] = None
start_time: datetime
duration: int = Field(gt=0, description="지속 시간(분)")
category: EventCategory
stamina_cost: int = Field(ge=0, default=0, description="스태미나 소모량")
status: EventStatus = EventStatus.PLANNED
stamina_after_completion: Optional[int] = None
created_at: datetime
@field_validator('start_time', 'created_at')
@classmethod
def validate_datetime(cls, v):
if isinstance(v, str):
return datetime.fromisoformat(v.replace('Z', '+00:00'))
return v
@field_validator('duration')
@classmethod
def validate_duration(cls, v):
if v <= 0:
raise ValueError("지속 시간은 0보다 커야 합니다")
return v
class CalendarEventRequest(BaseModel):
"""캘린더 이벤트 생성/수정 요청"""
title: str
description: Optional[str] = None
location: Optional[str] = None
start_time: datetime
duration: int = Field(gt=0, description="지속 시간(분)")
category: EventCategory
stamina_cost: int = Field(ge=0, default=0, description="스태미나 소모량")
created_at: Optional[datetime] = None
status: Optional[EventStatus] = None
@field_validator('start_time', 'created_at')
@classmethod
def validate_datetime(cls, v):
if v is None:
return v
if isinstance(v, str):
return datetime.fromisoformat(v.replace('Z', '+00:00'))
return v
class CalendarEventResponse(BaseModel):
"""캘린더 이벤트 응답"""
id: int
title: str
description: Optional[str] = None
location: Optional[str] = None
start_time: datetime
duration: int
category: EventCategory
stamina_cost: int
status: EventStatus
stamina_after_completion: Optional[int] = None
created_at: datetime
@field_serializer('start_time', 'created_at')
def serialize_datetime(self, value: datetime) -> str:
return value.isoformat()
class ApiResponse(BaseModel):
"""API 응답 기본 형태"""
success: bool
message: Optional[str] = None
data: Optional[Union[CalendarEventResponse, list[CalendarEventResponse]]] = None
error_code: Optional[int] = None
class McpResult(BaseModel):
"""MCP 작업 결과"""
success: bool
data: Optional[Union[CalendarEvent, list[CalendarEvent]]] = None
error: Optional[str] = None