from fastapi import APIRouter, HTTPException , Body,Query from models.location_models import BodyData,ErrorResponse from services.location_service import LocationService from concurrent.futures import ThreadPoolExecutor, as_completed import core.init_supabase as sp import asyncio router = APIRouter() async def get_coordinates(cord): try: return await LocationService.get_coordinates(cord) except Exception as exc: print(f'Coordinate {cord} generated an exception: {exc}') return None async def process_coordinates(supabase_user_data, max_concurrency=15): semaphore = asyncio.Semaphore(max_concurrency) async def bounded_get_coordinates(cord): async with semaphore: return await get_coordinates(cord) coords = await asyncio.gather(*[bounded_get_coordinates(cord) for cord in supabase_user_data]) return [coord for coord in coords if coord is not None] @router.post("/get_coordinates") async def get_coordinates_route(user_id: str = Query(..., description="User's hush ID")): print(user_id) supabase_user_data = sp.fetch_data(user_id) print("supabase data") print(supabase_user_data) print(len(supabase_user_data)) coords = await process_coordinates(supabase_user_data) if not coords: return {"message": "An unexpected error occurred please try again!"} print(coords) return {"data": coords} @router.post("/get_card_reccomendation") async def get_coordinates(data: BodyData = Body(...)): token = data.jwt_token user_id = sp.authenticate_user(token) if user_id == "Exceptional error": return {"User not Authenticated!"} else: print(user_id) try: supabase_card_data = sp.fetch_cards_data(user_id) print("supabase data") print(supabase_card_data) except Exception as e: print(HTTPException(status_code=400, detail=e)) return {"message":"An unexpected error occured please try again !!"} print("Returning the data") return {"data":supabase_card_data}