| """Search routes — scrape + reverse-image-search.""" |
|
|
| from __future__ import annotations |
|
|
| from typing import List, Optional |
|
|
| from fastapi import APIRouter, Depends |
| from pydantic import BaseModel |
|
|
| from api.deps import get_search_service |
| from models.jobs import JobKind, JobRequest |
| from services.search_service import SearchService |
|
|
| router = APIRouter() |
|
|
|
|
| class SearchRequest(BaseModel): |
| image_url: Optional[str] = None |
| image_base64: Optional[str] = None |
| providers: List[str] = [] |
| scrape_url: Optional[str] = None |
|
|
|
|
| @router.post("/reverse") |
| async def reverse_search(req: SearchRequest, svc: SearchService = Depends(get_search_service)): |
| job_req = JobRequest( |
| kind=JobKind.SEARCH, |
| image_url=req.image_url, |
| image_base64=req.image_base64, |
| providers=req.providers, |
| options={"scrape_url": req.scrape_url} if req.scrape_url else {}, |
| ) |
| return await svc.search(job_req) |
|
|
|
|
| @router.post("/scrape") |
| async def scrape(req: SearchRequest, svc: SearchService = Depends(get_search_service)): |
| job_req = JobRequest( |
| kind=JobKind.SEARCH, |
| image_url=req.image_url, |
| image_base64=req.image_base64, |
| providers=req.providers, |
| options={"scrape_url": req.scrape_url} if req.scrape_url else {}, |
| ) |
| return await svc.search(job_req) |
|
|