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")