2025-SSF/Backend/schemas/diary.py
janghanul090801 76a02076c9 2025 SSF Public
2025-09-12 14:47:48 +09:00

109 lines
2.8 KiB
Python

from pydantic import BaseModel, field_validator
from datetime import datetime
from typing import Optional, List
from fastapi import Form
class DiaryCreate(BaseModel):
title: str
content: str
category: str
@classmethod
def as_form(
cls,
title: str = Form(...),
content: str = Form(...),
category: str = Form(...),
) -> "DiaryCreate":
return cls(title=title, content=content, category=category)
@field_validator("title")
@classmethod
def validate_title(cls, v):
if len(v.strip()) < 1:
raise ValueError("Title cannot be empty")
if len(v) > 100:
raise ValueError("Title must be less than 100 characters")
return v.strip()
@field_validator("content")
@classmethod
def validate_content(cls, v):
if len(v.strip()) < 1:
raise ValueError("Content cannot be empty")
if len(v) > 5000:
raise ValueError("Content must be less than 5000 characters")
return v.strip()
class DiaryUpdate(BaseModel):
title: Optional[str] = None
content: Optional[str] = None
category: Optional[str] = None
@classmethod
def as_form(
cls,
title: Optional[str] = Form(None),
content: Optional[str] = Form(None),
category: Optional[str] = Form(None),
) -> "DiaryUpdate":
return cls(title=title, content=content, category=category)
class DiaryResponse(BaseModel):
id: int
user_id: int
title: str
content: str
images: List[str]
category: str
created_at: datetime
is_submitted: bool
email_sent: bool
class Diary:
def __init__(
self,
id: int,
user_id: int,
title: str,
content: str,
images: str, # JSON string
category: str,
created_at: datetime,
is_submitted: bool = False,
email_sent: bool = False,
):
self.id = id
self.user_id = user_id
self.title = title
self.content = content
self.images = images
self.category = category
self.created_at = created_at
self.is_submitted = is_submitted
self.email_sent = email_sent
@property
def image_list(self) -> List[str]:
return (
[img.strip() for img in self.images.split(",") if img.strip()]
if self.images
else []
)
def to_response(self) -> DiaryResponse:
return DiaryResponse(
id=self.id,
user_id=self.user_id,
title=self.title,
content=self.content,
images=self.image_list,
category=self.category,
created_at=self.created_at,
is_submitted=self.is_submitted,
email_sent=self.email_sent,
)