72 lines
No EOL
2.1 KiB
Python
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") |