69 lines
2.2 KiB
Python

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