from fastapi import APIRouter, HTTPException, Query
from typing import List
from datetime import datetime
from app.models.data_model import DataModel
from app.schemas.item import (
ItemCreate, ItemUpdate, ItemResponse, ItemListResponse,
ItemSingleResponse, SearchResponse, ErrorResponse, HealthResponse
)
router = APIRouter()
data_model = DataModel()
@router.get("/health", response_model=HealthResponse)
async def health_check():
"""Health check endpoint"""
return HealthResponse(
message="API is running",
timestamp=datetime.utcnow().isoformat() + "Z"
)
@router.get("/items", response_model=ItemListResponse)
async def get_all_items():
"""Get all items"""
try:
items = await data_model.get_all_items()
return ItemListResponse(
data=items,
count=len(items)
)
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@router.get("/items/{item_id}", response_model=ItemSingleResponse)
async def get_item_by_id(item_id: str):
"""Get item by ID"""
try:
item = await data_model.get_item_by_id(item_id)
if not item:
raise HTTPException(status_code=404, detail="Item not found")
return ItemSingleResponse(data=item)
except HTTPException:
raise
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@router.post("/items", response_model=ItemSingleResponse, status_code=201)
async def create_item(item: ItemCreate):
"""Create a new item"""
try:
new_item = await data_model.create_item(item.dict())
return ItemSingleResponse(data=new_item)
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@router.put("/items/{item_id}", response_model=ItemSingleResponse)
async def update_item(item_id: str, item_update: ItemUpdate):
"""Update an existing item"""
try:
# Only include non-None values in the update
update_data = {k: v for k, v in item_update.dict().items() if v is not None}
if not update_data:
raise HTTPException(status_code=400, detail="No valid fields to update")
updated_item = await data_model.update_item(item_id, update_data)
if not updated_item:
raise HTTPException(status_code=404, detail="Item not found")
return ItemSingleResponse(data=updated_item)
except HTTPException:
raise
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@router.delete("/items/{item_id}", response_model=ItemSingleResponse)
async def delete_item(item_id: str):
"""Delete an item"""
try:
deleted_item = await data_model.delete_item(item_id)
if not deleted_item:
raise HTTPException(status_code=404, detail="Item not found")
return ItemSingleResponse(data=deleted_item)
except HTTPException:
raise
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@router.get("/search", response_model=SearchResponse)
async def search_items(q: str = Query(..., min_length=1, description="Search query")):
"""Search items by query"""
try:
results = await data_model.search_items(q)
return SearchResponse(
data=results,
count=len(results),
query=q
)
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))