File size: 2,991 Bytes
b3b089b
2542be6
 
575204d
2542be6
c0aac4f
2253306
7f500c3
 
2542be6
 
a9ab215
c0aac4f
b71f5c4
 
 
 
 
 
 
 
 
 
 
 
 
 
c0aac4f
 
 
 
 
d1754b1
2188047
ae7b0b1
d1754b1
75f8f0c
d1754b1
 
 
a3e1b21
d1754b1
a3e1b21
c0aac4f
d1754b1
c0aac4f
 
2542be6
c0aac4f
2b9d1a7
 
 
 
f90914e
4954385
 
 
 
c0aac4f
 
 
 
2b9d1a7
c0aac4f
2542be6
 
 
b71f5c4
2542be6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
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
import core.init_supabase as sp
import asyncio
import json
import concurrent.futures

router = APIRouter()

async def get_coordinates_v1(cord):
    try:
        # Assuming LocationService.get_coordinates is an async function
        result = await LocationService.get_coordinates(cord)
        
        # If the result is a coroutine, await it
        if asyncio.iscoroutine(result):
            result = await result
        
        # Ensure the result is JSON serializable
        json.dumps(result)  # This will raise an error if result is not JSON serializable
        
        return result
    except json.JSONDecodeError:
        print(f'Coordinate {cord} result is not JSON serializable')
        return None
    except Exception as exc:
        print(f'Coordinate {cord} generated an exception: {exc}')
        return None

async def process_coordinates(supabase_user_data, max_concurrency=15):
    coords=[]
    with ThreadPoolExecutor(max_workers=15) as executor:
        futures = [executor.submit(LocationService.get_lat_lng,cord) for cord in supabase_user_data]
        for future in concurrent.futures.as_completed(futures):
            
            try:
                result = future.result()
                coords.append(result)

            except Exception as exc:
                print(f"error :  {exc}")

    # 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=[]
    # for cord in supabase_user_data:
    #     coords.append(LocationService.get_coordinates(cord))
    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_v2(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}