Portfolio / app /schemas.py
shakauthossain's picture
Upload 32 files
deec4d6 verified
# Directory: app/schemas.py
from datetime import datetime, date
from typing import Optional, List
from pydantic import BaseModel, EmailStr, Field, validator
from uuid import UUID
from fastapi.security import OAuth2PasswordBearer
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/auth/login")
# --- Shared Schemas ---
class Msg(BaseModel):
detail: str
# --- User ---
class UserBase(BaseModel):
email: EmailStr
full_name: str
class UserCreate(UserBase):
password: str
class UserOut(UserBase):
id: UUID
is_active: bool
created_at: datetime
updated_at: datetime
# --- Token ---
class Token(BaseModel):
access_token: str
refresh_token: str
token_type: str = "bearer"
# --- Hero ---
class HeroBase(BaseModel):
title: str
subtitle: str
description: str
cta_text: str
cta_link: str
background_image: str
profile_image: str
animation_style: str
show_scroll_indicator: bool
class HeroUpdate(HeroBase):
pass
class HeroResponse(HeroBase):
id: UUID
updated_at: datetime
# --- About ---
class AboutBase(BaseModel):
title: str
introduction: str
description: str
profile_image: str
highlights: List[str]
skills: List[str]
location: str
availability: str
email: str
phone: str
class AboutResponse(AboutBase):
id: UUID
updated_at: datetime
# --- Experience ---
class ExperienceBase(BaseModel):
title: Optional[str] = None
company: Optional[str] = None
location: Optional[str] = None
start_date: date = Field(..., alias="startDate")
end_date: Optional[date] = Field(None, alias="endDate")
is_current: Optional[bool] = Field(None, alias="current")
description: Optional[str] = None
technologies: Optional[List[str]] = None
achievements: Optional[List[str]] = None
display_order: Optional[int] = None
class Config:
allow_population_by_field_name = True
class ExperienceCreate(ExperienceBase):
@validator("start_date", "end_date", pre=True)
def parse_partial_date(cls, value):
if value == "":
return None
if isinstance(value, str) and len(value) == 7:
return datetime.strptime(value + "-01", "%Y-%m-%d").date()
return value
class ExperienceUpdate(ExperienceBase):
pass
class ExperienceResponse(ExperienceBase):
id: UUID
created_at: datetime
updated_at: datetime
class Config:
orm_mode = True
populate_by_name = True
# --- Project ---
class ProjectBase(BaseModel):
title: str
description: str
long_description: str
image: Optional[str] = None
technologies: List[str] = []
category: str
status: str
is_featured: bool
github_url: Optional[str] = None
live_url: Optional[str] = None
start_date: date
end_date: Optional[date] = None
highlights: List[str] = []
display_order: int
class ProjectCreate(ProjectBase):
pass
class ProjectUpdate(ProjectBase):
pass
class ProjectResponse(ProjectBase):
id: UUID
created_at: datetime
updated_at: datetime
# --- Skill Category ---
class SkillCategoryBase(BaseModel):
name: str
color: str
description: str
display_order: Optional[int] = None
class SkillCategoryCreate(SkillCategoryBase):
pass
class SkillCategoryUpdate(SkillCategoryBase):
pass
class SkillCategoryResponse(SkillCategoryBase):
id: UUID
# --- Skill ---
class SkillBase(BaseModel):
name: str
category_id: UUID
proficiency: int
years_of_experience: int
icon: Optional[str]
is_featured: bool
display_order: Optional[int] = None
class SkillCreate(SkillBase):
pass
class SkillUpdate(SkillBase):
pass
class SkillResponse(SkillBase):
id: UUID
# --- Blog ---
class BlogPostBase(BaseModel):
title: str
slug: str
excerpt: str
content: str
author: str
publish_date: date
status: str
is_featured: bool
image: Optional[str] = None
tags: List[str]
category: str
read_time: int
seo_title: str
seo_description: str
class BlogPostCreate(BlogPostBase):
pass
class BlogPostUpdate(BlogPostBase):
pass
class BlogPostResponse(BlogPostBase):
id: UUID
views: int
created_at: datetime
updated_at: datetime
# --- Certification ---
class CertificationBase(BaseModel):
name: str
issuer: str
issue_date: date
expiry_date: Optional[date]
credential_id: Optional[str]
verification_url: Optional[str]
image: Optional[str]
description: Optional[str]
is_featured: bool
display_order: int
class CertificationCreate(CertificationBase):
pass
class CertificationUpdate(CertificationBase):
pass
class CertificationResponse(CertificationBase):
id: UUID
# --- Contact Message ---
class ContactMessageCreate(BaseModel):
name: str
email: str
subject: str
message: str
class ContactMessageResponse(ContactMessageCreate):
id: UUID
is_read: bool
created_at: datetime