69 lines
2.2 KiB
Python
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
|