File size: 3,442 Bytes
bfbdc91
b11d1b5
37c6b88
f07dae8
b11d1b5
 
f07dae8
bfbdc91
 
 
b11d1b5
 
f07dae8
 
 
 
 
 
 
b11d1b5
 
 
a93666a
b11d1b5
 
 
 
bfbdc91
 
 
b11d1b5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a68b13b
 
 
 
 
 
 
 
 
 
 
53b2d2f
 
 
a68b13b
53b2d2f
 
 
 
 
 
a68b13b
 
 
 
 
 
 
f07dae8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import JSONResponse, HTMLResponse
from pydantic import BaseModel, Field
import requests
from geopy.geocoders import Nominatim
import geopy.distance

app = FastAPI()

loc = Nominatim(user_agent="GetLoc")

class Geodistance(BaseModel):
    lat1: float = Field(..., ge=-90, le=90)
    lon1: float = Field(..., ge=-180, le=180)
    lat2: float = Field(..., ge=-90, le=90)
    lon2: float = Field(..., ge=-180, le=180)
    unit: str = "km"

app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],  # Replace with your frontend domain in prod
    allow_credentials=False,
    allow_methods=["*"],
    allow_headers=["*"],
)

@app.get("/")
def health_check():
    return {"status": "ok"}

@app.get("/wiki/{page_name}")
async def get_wiki_page(page_name: str):
    response = requests.get(f"https://en.wikipedia.org/api/rest_v1/page/summary/{page_name}", timeout=10)

    if response.status_code != 200:
        return JSONResponse(
            content={"error": "Page not found"},
            status_code=404
        )
    
    coords = loc.geocode(page_name)
    
    return JSONResponse(
        content={
            "title": page_name,
            "content": f"{response.json().get('extract', 'No content available')}",
            "latitude": coords.latitude if coords else None,
            "longitude": coords.longitude if coords else None
        },
        status_code=200
    )

@app.get("/wiki/search/{full_page}")
def search_wiki(full_page: str):
    response = requests.get(f"https://en.wikipedia.org/wiki/{full_page}", timeout=10)
    try:
        if response.status_code != 200:
            return JSONResponse(
                content={"error": "Page not found"},
                status_code=404
            )

        coords = loc.geocode(full_page)

        return JSONResponse(
            content={
                        "title": full_page, 
                        "content": str(response.text),
                        "latitude": coords.latitude if coords else None,
                        "longitude": coords.longitude if coords else None
                    },
            status_code=200
        )
    except Exception as e:
        return JSONResponse(
            content={"error": str(e), 'response': str(response)},
            status_code=500
        )


@app.post("/geodistance")
def get_geodistance(payload: Geodistance):
    lat1, lon1 = payload.lat1, payload.lon1
    lat2, lon2 = payload.lat2, payload.lon2
    unit = payload.unit

    try:
        distance_km = geopy.distance.distance((lat1, lon1), (lat2, lon2)).km
        if unit == "km":
            distance = distance_km
        elif unit == "mi":
            distance = distance_km * 0.621371
        else:
            return JSONResponse(
                content={"error": "Invalid unit"},
                status_code=400
            )
        
    except Exception as e:
        return JSONResponse(
            content={"error": str(e)},
            status_code=500
        )

    return JSONResponse(
        content={
            "distance": distance,
            "unit": unit,
            "lat1": lat1,
            "lon1": lon1,
            "lat2": lat2,
            "lon2": lon2
        },
        status_code=200
    )