Добавление жанров, дополнение описания

This commit is contained in:
2025-10-20 22:24:00 +03:00
parent 9604771439
commit ddcae6cdf6
13 changed files with 147 additions and 136 deletions

View File

@@ -11,18 +11,20 @@ from .routers.misc import get_info
app = get_app()
alembic_cfg = Config("alembic.ini")
@asynccontextmanager
async def lifespan(app: FastAPI):
print("[+] Initializing...")
# Initialize the database
# Настройка базы данных
with engine.begin() as connection:
alembic_cfg.attributes['connection'] = connection
alembic_cfg.attributes["connection"] = connection
command.upgrade(alembic_cfg, "head")
print("[+] Starting...")
yield # Here FastAPI will start handling requests;
yield # Обработка запросов
print("[+] Application shutdown")
# Include routers
# Подключение маршрутов
app.include_router(api_router)

View File

@@ -2,13 +2,15 @@ from fastapi import APIRouter
from .authors import router as authors_router
from .books import router as books_router
from .genres import router as genres_router
from .relationships import router as relationships_router
from .misc import router as misc_router
api_router = APIRouter()
# Including all routers
# Подключение всех маршрутов
api_router.include_router(authors_router)
api_router.include_router(books_router)
api_router.include_router(genres_router)
api_router.include_router(relationships_router)
api_router.include_router(misc_router)

View File

@@ -10,29 +10,32 @@ from httpx import get
from library_service.settings import get_app
# Templates initialization
# Загрузка шаблонов
templates = Jinja2Templates(directory=Path(__file__).parent.parent / "templates")
router = APIRouter(tags=["misc"])
# Formatted information about the application
# Форматированная информация о приложении
def get_info(app) -> Dict:
return {
"status": "ok",
"app_info": {
"title": app.title,
"version": app.version,
"description": app.description,
},
"server_time": datetime.now().isoformat(),
}
"status": "ok",
"app_info": {
"title": app.title,
"version": app.version,
"description": app.description,
},
"server_time": datetime.now().isoformat(),
}
# Root endpoint
# Эндпоинт главной страницы
@router.get("/", response_class=HTMLResponse)
async def root(request: Request, app=Depends(get_app)):
return templates.TemplateResponse(request, "index.html", get_info(app))
# API Information endpoint
# Эндпоинт информации об API
@router.get("/api/info")
async def api_info(app=Depends(get_app)):
return JSONResponse(content=get_info(app))

View File

@@ -51,9 +51,57 @@ def remove_author_from_book(author_id: int, book_id: int, session: Session = Dep
return {"message": "Relationship removed successfully"}
# Get relationships
@router.get("/relationships/author-book", response_model=List[AuthorBookLink])
@router.get("/relationships/genre-book", response_model=List[GenreBookLink])
def get_relationships(session: Session = Depends(get_session)):
relationships = session.exec(select(AuthorBookLink)).all()
relationships = session.exec(select(GenreBookLink)).all()
return relationships
# Add author to book
@router.post("/relationships/genre-book", response_model=GenreBookLink)
def add_genre_to_book(genre_id: int, book_id: int, session: Session = Depends(get_session)):
genre = session.get(Genre, genre_id)
if not genre:
raise HTTPException(status_code=404, detail="Genre not found")
book = session.get(Book, book_id)
if not book:
raise HTTPException(status_code=404, detail="Book not found")
existing_link = session.exec(
select(GenreBookLink)
.where(GenreBookLink.genre_id == genre_id)
.where(GenreBookLink.book_id == book_id)
).first()
if existing_link:
raise HTTPException(status_code=400, detail="Relationship already exists")
link = GenreBookLink(genre_id=genre_id, book_id=book_id)
session.add(link)
session.commit()
session.refresh(link)
return link
# Remove author from book
@router.delete("/relationships/genre-book", response_model=Dict[str, str])
def remove_genre_from_book(genre_id: int, book_id: int, session: Session = Depends(get_session)):
link = session.exec(
select(GenreBookLink)
.where(GenreBookLink.genre_id == genre_id)
.where(GenreBookLink.book_id == book_id)
).first()
if not link:
raise HTTPException(status_code=404, detail="Relationship not found")
session.delete(link)
session.commit()
return {"message": "Relationship removed successfully"}
# Get relationships
@router.get("/relationships/genre-book", response_model=List[GenreBookLink])
def get__genre_relationships(session: Session = Depends(get_session)):
relationships = session.exec(select(GenreBookLink)).all()
return relationships
# Get author's books