from fastapi import APIRouter, Depends, Query from sqlalchemy.orm import Session from app.core.database import get_db from app.models.product import ProductStatus from app.schemas.product import Product as ProductSchema from app.services.search import SearchService router = APIRouter() @router.get("/products", response_model=dict) async def search_products( query: str | None = None, category_id: str | None = None, tag_ids: list[str] | None = Query(None), min_price: float | None = None, max_price: float | None = None, min_rating: int | None = Query(None, ge=1, le=5), status: ProductStatus | None = ProductStatus.PUBLISHED, sort_by: str = "relevance", sort_order: str = "desc", is_featured: bool | None = None, seller_id: str | None = None, offset: int = 0, limit: int = 100, db: Session = Depends(get_db) ): """ Search and filter products with advanced options. - **query**: Text to search in product name and description - **category_id**: Filter by category ID - **tag_ids**: Filter by tag IDs (products must have ALL specified tags) - **min_price**: Minimum price filter - **max_price**: Maximum price filter - **min_rating**: Minimum average rating filter (1-5) - **status**: Filter by product status (admin only sees non-published) - **sort_by**: Field to sort by (name, price, created_at, rating, relevance) - **sort_order**: Sort order (asc or desc) - **is_featured**: Filter by featured status - **seller_id**: Filter by seller ID - **offset**: Pagination offset - **limit**: Pagination limit """ search_results = SearchService.search_products( db=db, search_query=query, category_id=category_id, tag_ids=tag_ids, min_price=min_price, max_price=max_price, min_rating=min_rating, status=status, sort_by=sort_by, sort_order=sort_order, is_featured=is_featured, seller_id=seller_id, offset=offset, limit=limit ) # Convert SQLAlchemy objects to Pydantic models search_results["products"] = [ ProductSchema.from_orm(product) for product in search_results["products"] ] return search_results