Automated Action f1c2b73ade Implement online bookstore backend API
- 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
2025-05-20 12:04:27 +00:00

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]