from fastapi import APIRouter, Depends, HTTPException, Query from fastapi.responses import JSONResponse from pydantic import BaseModel from sqlalchemy.ext.asyncio import AsyncSession from db_setup import get_session from saved_search.views import SavedSearch from users.permissions import CurrentUser router = APIRouter() class SavedSearchCreate(BaseModel): name: str entity: str filters: dict | None = None class SavedSearchUpdate(BaseModel): name: str | None = None entity: str | None = None filters: dict | None = None @router.get("/saved-searches/fetch") async def fetch_saved_searches( current_user: CurrentUser, entity: str | None = Query(None), session: AsyncSession = Depends(get_session), ): try: service = SavedSearch(session=session) data, total = await service.get_saved_searches(current_user, entity) return JSONResponse(content={"data": data, "total": total, "status_code": 200}) except HTTPException: raise except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @router.post("/saved-searches/create") async def create_saved_search( payload: SavedSearchCreate, current_user: CurrentUser, session: AsyncSession = Depends(get_session), ): try: service = SavedSearch(session=session) data = await service.create_saved_search(payload.model_dump(exclude_unset=True), current_user) return JSONResponse(content={"data": data, "status_code": 200}) except HTTPException: raise except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @router.patch("/saved-searches/update") async def update_saved_search( payload: SavedSearchUpdate, current_user: CurrentUser, record_id: str = Query(...), session: AsyncSession = Depends(get_session), ): try: service = SavedSearch(session=session) data = await service.update_saved_search( record_id, payload.model_dump(exclude_unset=True), current_user ) return JSONResponse(content={"data": data, "status_code": 200}) except HTTPException: raise except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @router.delete("/saved-searches/delete") async def delete_saved_search( current_user: CurrentUser, record_id: str = Query(...), session: AsyncSession = Depends(get_session), ): try: service = SavedSearch(session=session) data = await service.delete_saved_search(record_id, current_user) return JSONResponse(content={"data": data, "status_code": 200}) except HTTPException: raise except Exception as e: raise HTTPException(status_code=500, detail=str(e))