-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlambda_api.py
More file actions
101 lines (79 loc) · 2.86 KB
/
Copy pathlambda_api.py
File metadata and controls
101 lines (79 loc) · 2.86 KB
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
from fastapi import FastAPI, HTTPException
from mangum import Mangum
from pydantic import BaseModel
from typing import List, Optional
import json
app = FastAPI(title="Go Together API")
# Dados em memória
routes_data = []
class Location(BaseModel):
lat: float
lon: float
name: str
class Passenger(BaseModel):
name: str
phone: str
origin: Location
destination: Location
max_group_size: int
max_detour_km: float
class MatchRequest(BaseModel):
passenger: Passenger
@app.get("/")
def root():
return {"message": "Go Together API funcionando!", "passengers": len(routes_data)}
@app.post("/passengers")
def create_passenger(passenger: Passenger):
# Verificar se já existe
existing = [p for p in routes_data if p["name"] == passenger.name]
if existing:
raise HTTPException(status_code=400, detail="Passageiro já existe")
routes_data.append(passenger.dict())
return {"message": "Passageiro cadastrado", "total": len(routes_data)}
@app.get("/passengers")
def get_passengers():
return routes_data
@app.post("/find-matches")
def find_matches(request: MatchRequest):
current = request.passenger
matches = []
for other_data in routes_data:
if other_data["name"] != current.name:
# Calcular distância entre origens
distance = haversine_distance(
current.origin.lat, current.origin.lon,
other_data["origin"]["lat"], other_data["origin"]["lon"]
)
# Verificar compatibilidade básica
if distance <= min(current.max_detour_km, other_data["max_detour_km"]):
matches.append({
"name": other_data["name"],
"phone": other_data["phone"],
"origin": other_data["origin"],
"distance_km": round(distance, 2)
})
return {"matches": sorted(matches, key=lambda x: x["distance_km"])}
@app.delete("/passengers")
def clear_passengers():
routes_data.clear()
return {"message": "Passageiros limpos"}
@app.delete("/passengers/{name}")
def delete_passenger(name: str):
global routes_data
routes_data = [p for p in routes_data if p["name"] != name]
return {"message": f"Passageiro {name} removido"}
def haversine_distance(lat1, lon1, lat2, lon2):
"""Calcula distância entre dois pontos usando fórmula de Haversine"""
import math
R = 6371 # Raio da Terra em km
lat1_rad = math.radians(lat1)
lat2_rad = math.radians(lat2)
delta_lat = math.radians(lat2 - lat1)
delta_lon = math.radians(lon2 - lon1)
a = (math.sin(delta_lat / 2) ** 2 +
math.cos(lat1_rad) * math.cos(lat2_rad) *
math.sin(delta_lon / 2) ** 2)
c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a))
return R * c
# Handler para Lambda
handler = Mangum(app)