python-test/Module 5/routers/items.py

72 lines
No EOL
2.1 KiB
Python

from fastapi import APIRouter, Depends, HTTPException, Response
from db.session import get_db
from sqlalchemy.ext.asyncio import AsyncSession
from typing import Sequence
from sqlalchemy.exc import IntegrityError
from schemas.items import ItemOut, ItemIn
from models.items import Item
import services.items as items_service
router = APIRouter(prefix="/items", tags=["items"])
@router.get("/", response_model=list[ItemOut])
async def get_items(db: AsyncSession = Depends(get_db)) -> Sequence[Item]:
items = await items_service.get_items(db)
return items
@router.get("/{id}", response_model=ItemOut)
async def get_item(id: int, db: AsyncSession = Depends(get_db)) -> Item:
item = await items_service.get_item_by_id(id, db)
if item:
return item
raise HTTPException(404, "Item not found")
@router.post("/", response_model=ItemOut)
async def create_item(payload: ItemIn, db: AsyncSession = Depends(get_db)) -> Item:
try:
item = await items_service.create_item(payload, db)
return item
except IntegrityError:
await db.rollback()
raise HTTPException(400, f"Item with text {payload.text} is already exist...")
@router.put("/{id}", response_model=ItemOut)
async def update_item(id: int, payload: ItemIn, db: AsyncSession = Depends(get_db)) -> Item:
item = await items_service.get_item_by_id(id, db)
try:
if (item):
updated_item = await items_service.update_item(item, payload, db)
return updated_item
else:
await db.rollback()
raise HTTPException(404, "Item not found")
except IntegrityError:
await db.rollback()
raise HTTPException(400, f"Item with text {payload.text} is already exist...")
@router.delete("/{id}", response_model=None)
async def delete_item(id: int, db: AsyncSession = Depends(get_db)) -> Response:
item = await items_service.get_item_by_id(id, db)
if (item):
await items_service.delete_item(item, db)
return Response(status_code=204, content=None)
else:
await db.rollback()
raise HTTPException(404, "Item not found")