
- Set up FastAPI project structure with SQLite and SQLAlchemy - Create models for users, books, authors, categories, and orders - Implement JWT authentication and authorization - Add CRUD endpoints for all resources - Set up Alembic for database migrations - Add health check endpoint - Add proper error handling and validation - Create comprehensive documentation
125 lines
2.8 KiB
Python
125 lines
2.8 KiB
Python
from pydantic import BaseModel, field_validator
|
|
from typing import List, Optional
|
|
from datetime import datetime
|
|
|
|
|
|
class AuthorBase(BaseModel):
|
|
name: str
|
|
biography: Optional[str] = None
|
|
birthdate: Optional[datetime] = None
|
|
|
|
|
|
class AuthorCreate(AuthorBase):
|
|
pass
|
|
|
|
|
|
class AuthorUpdate(BaseModel):
|
|
name: Optional[str] = None
|
|
biography: Optional[str] = None
|
|
birthdate: Optional[datetime] = None
|
|
|
|
|
|
class Author(AuthorBase):
|
|
id: int
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
|
|
|
|
class CategoryBase(BaseModel):
|
|
name: str
|
|
description: Optional[str] = None
|
|
|
|
|
|
class CategoryCreate(CategoryBase):
|
|
pass
|
|
|
|
|
|
class CategoryUpdate(BaseModel):
|
|
name: Optional[str] = None
|
|
description: Optional[str] = None
|
|
|
|
|
|
class Category(CategoryBase):
|
|
id: int
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
|
|
|
|
class BookBase(BaseModel):
|
|
title: str
|
|
isbn: str
|
|
description: Optional[str] = None
|
|
price: float
|
|
cover_image_url: Optional[str] = None
|
|
publication_date: Optional[datetime] = None
|
|
publisher: Optional[str] = None
|
|
language: Optional[str] = None
|
|
page_count: Optional[int] = None
|
|
stock_quantity: int = 0
|
|
|
|
@field_validator("price")
|
|
def price_must_be_positive(cls, v):
|
|
if v <= 0:
|
|
raise ValueError("Price must be greater than zero")
|
|
return v
|
|
|
|
@field_validator("stock_quantity")
|
|
def stock_quantity_must_be_non_negative(cls, v):
|
|
if v < 0:
|
|
raise ValueError("Stock quantity must be non-negative")
|
|
return v
|
|
|
|
|
|
class BookCreate(BookBase):
|
|
author_ids: List[int]
|
|
category_ids: List[int]
|
|
|
|
|
|
class BookUpdate(BaseModel):
|
|
title: Optional[str] = None
|
|
isbn: Optional[str] = None
|
|
description: Optional[str] = None
|
|
price: Optional[float] = None
|
|
cover_image_url: Optional[str] = None
|
|
publication_date: Optional[datetime] = None
|
|
publisher: Optional[str] = None
|
|
language: Optional[str] = None
|
|
page_count: Optional[int] = None
|
|
stock_quantity: Optional[int] = None
|
|
author_ids: Optional[List[int]] = None
|
|
category_ids: Optional[List[int]] = None
|
|
|
|
@field_validator("price")
|
|
def price_must_be_positive(cls, v):
|
|
if v is not None and v <= 0:
|
|
raise ValueError("Price must be greater than zero")
|
|
return v
|
|
|
|
@field_validator("stock_quantity")
|
|
def stock_quantity_must_be_non_negative(cls, v):
|
|
if v is not None and v < 0:
|
|
raise ValueError("Stock quantity must be non-negative")
|
|
return v
|
|
|
|
|
|
class Book(BookBase):
|
|
id: int
|
|
authors: List[Author]
|
|
categories: List[Category]
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
|
|
|
|
class BookList(BaseModel):
|
|
total: int
|
|
items: List[Book]
|