feat(portfolio): 백엔드 서비스 + 인프라 설정
- FastAPI 앱: DB(5테이블), Pydantic 모델, 토큰 인증, 전체 API 라우트 - Docker Compose: portfolio 서비스 (포트 18850) - Nginx: /api/profile/ → portfolio:8000 - 배포 스크립트: portfolio 추가 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
90
portfolio/app/models.py
Normal file
90
portfolio/app/models.py
Normal file
@@ -0,0 +1,90 @@
|
||||
from typing import Optional, List
|
||||
from pydantic import BaseModel
|
||||
|
||||
|
||||
class ProfileUpdate(BaseModel):
|
||||
name: Optional[str] = None
|
||||
name_en: Optional[str] = None
|
||||
role: Optional[str] = None
|
||||
role_en: Optional[str] = None
|
||||
email: Optional[str] = None
|
||||
phone: Optional[str] = None
|
||||
github_url: Optional[str] = None
|
||||
blog_url: Optional[str] = None
|
||||
photo_url: Optional[str] = None
|
||||
bio: Optional[str] = None
|
||||
|
||||
|
||||
class CareerCreate(BaseModel):
|
||||
category: str = "company"
|
||||
organization: str = ""
|
||||
role: str = ""
|
||||
description: str = ""
|
||||
start_date: str = ""
|
||||
end_date: str = ""
|
||||
sort_order: int = 0
|
||||
|
||||
|
||||
class CareerUpdate(BaseModel):
|
||||
category: Optional[str] = None
|
||||
organization: Optional[str] = None
|
||||
role: Optional[str] = None
|
||||
description: Optional[str] = None
|
||||
start_date: Optional[str] = None
|
||||
end_date: Optional[str] = None
|
||||
sort_order: Optional[int] = None
|
||||
|
||||
|
||||
class ProjectCreate(BaseModel):
|
||||
category: str = "personal"
|
||||
title: str = ""
|
||||
description: str = ""
|
||||
tech_stack: List[str] = []
|
||||
role: str = ""
|
||||
start_date: str = ""
|
||||
end_date: str = ""
|
||||
url: str = ""
|
||||
image_url: str = ""
|
||||
sort_order: int = 0
|
||||
|
||||
|
||||
class ProjectUpdate(BaseModel):
|
||||
category: Optional[str] = None
|
||||
title: Optional[str] = None
|
||||
description: Optional[str] = None
|
||||
tech_stack: Optional[List[str]] = None
|
||||
role: Optional[str] = None
|
||||
start_date: Optional[str] = None
|
||||
end_date: Optional[str] = None
|
||||
url: Optional[str] = None
|
||||
image_url: Optional[str] = None
|
||||
sort_order: Optional[int] = None
|
||||
|
||||
|
||||
class SkillCreate(BaseModel):
|
||||
category: str = "language"
|
||||
name: str = ""
|
||||
level: int = 3
|
||||
sort_order: int = 0
|
||||
|
||||
|
||||
class SkillUpdate(BaseModel):
|
||||
category: Optional[str] = None
|
||||
name: Optional[str] = None
|
||||
level: Optional[int] = None
|
||||
sort_order: Optional[int] = None
|
||||
|
||||
|
||||
class IntroCreate(BaseModel):
|
||||
title: str = ""
|
||||
content: str = ""
|
||||
is_main: int = 0
|
||||
|
||||
|
||||
class IntroUpdate(BaseModel):
|
||||
title: Optional[str] = None
|
||||
content: Optional[str] = None
|
||||
|
||||
|
||||
class AuthRequest(BaseModel):
|
||||
password: str
|
||||
Reference in New Issue
Block a user