from fastapi import APIRouter, Depends, HTTPException, Query, Request from sqlalchemy.orm import Session from app.db import get_db from app.schemas import ItemCreate, ItemOut, WallResponse from app.services import items as items_service router = APIRouter(prefix="/api/items", tags=["items"]) def _client_ip(request: Request) -> str: forwarded = request.headers.get("x-forwarded-for") if forwarded: return forwarded.split(",")[0].strip() if request.client and request.client.host: return request.client.host return "" @router.post("", response_model=ItemOut) def create_item( payload: ItemCreate, request: Request, db: Session = Depends(get_db), ): item = items_service.create_text_item(db, payload, _client_ip(request)) return items_service.item_to_dict(item) @router.get("/wall", response_model=WallResponse) def wall( page: int = Query(1, ge=1), page_size: int = Query(20, ge=1, le=100), db: Session = Depends(get_db), ): rows, total = items_service.list_wall(db, page=page, page_size=page_size) return WallResponse( items=[ItemOut.model_validate(items_service.item_to_dict(i)) for i in rows], page=page, page_size=page_size, total=total, ) @router.get("/{slug}", response_model=ItemOut) def get_item(slug: str, db: Session = Depends(get_db)): item = items_service.get_item(db, slug) if item is None: raise HTTPException(status_code=404, detail="Not found") return items_service.item_to_dict(item)