geo-access

This commit is contained in:
Matteo Baldi 2025-08-02 01:52:25 +02:00
parent 686e395fcd
commit 8a87a78449
6 changed files with 117 additions and 6 deletions

View file

@ -7,8 +7,8 @@ services:
ports: ports:
- "27017:27017" - "27017:27017"
environment: environment:
MONGO_INITDB_ROOT_USERNAME: admin MONGO_INITDB_ROOT_USERNAME: ${ME_CONFIG_MONGODB_ADMIN_USERNAME}
MONGO_INITDB_ROOT_PASSWORD: password MONGO_INITDB_ROOT_PASSWORD: ${ME_CONFIG_MONGODB_ADMIN_PASSWORD}
volumes: volumes:
- mongodb_data:/data/db - mongodb_data:/data/db
restart: unless-stopped restart: unless-stopped
@ -19,8 +19,8 @@ services:
ports: ports:
- "8081:8081" - "8081:8081"
environment: environment:
ME_CONFIG_MONGODB_ADMINUSERNAME: admin ME_CONFIG_MONGODB_ADMINUSERNAME: ${ME_CONFIG_MONGODB_ADMIN_USERNAME}
ME_CONFIG_MONGODB_ADMINPASSWORD: password ME_CONFIG_MONGODB_ADMINPASSWORD: ${ME_CONFIG_MONGODB_ADMIN_PASSWORD}
ME_CONFIG_MONGODB_URL: mongodb://admin:password@mongodb:27017/ ME_CONFIG_MONGODB_URL: mongodb://admin:password@mongodb:27017/
depends_on: depends_on:
- mongodb - mongodb

View file

View file

@ -0,0 +1,33 @@
from dataclasses import dataclass
from typing import Literal, TypedDict
from fastapi import APIRouter
from geo_access import lido_circle_checker
geo_access_router = APIRouter(prefix="/geo-access")
@dataclass
class GeoAccessRequest:
"""
Request model for geo access.
"""
coords: tuple[float, float]
type: Literal["circle", "polygon"] | None = "circle"
type_checker = {
"circle": lido_circle_checker,
# "polygon": lido_polygon_checker
}
@geo_access_router.post("/")
async def get_geo_access(request: GeoAccessRequest):
with open("test.json", "w") as f:
f.write(repr(request))
# return {
# "success": type_checker.get(request.type, "circle").is_inside(request.coords)
# }
return {"success": True}

60
backend/geo_access.py Normal file
View file

@ -0,0 +1,60 @@
from math import radians, sin, cos, sqrt, atan2
from shapely import Polygon
# class PolygonChecker:
# """
# A class to check if a point is inside a polygon defined by its vertices.
# The polygon is defined by a list of points (latitude, longitude).
#
# """
# def __init__(self, *points):
# self.coords = points[:] if points else []
# self.polygon = Polygon(self.coords)
#
# def is_inside(self, point) -> bool:
# return self.polygon.contains(point)
class CircleChecker:
"""
A class to check if a point is inside a circle defined by its center and radius.
The circle is defined by a center point (latitude, longitude) and a radius in meters
"""
def __init__(self, center, radius_meters):
self.center = center
self.radius_meters = radius_meters
def is_inside(self, point) -> bool:
return is_inside_circle(self.center, point, self.radius_meters)
def is_inside_circle(center, point, radius_meters):
R = 6371000 # Earth radius in meters
lat1, lon1 = center
lat2, lon2 = point
dlat = radians(lat2 - lat1)
dlon = radians(lon2 - lon1)
a = sin(dlat / 2) ** 2 + cos(radians(lat1)) * cos(radians(lat2)) * sin(dlon / 2) ** 2
c = 2 * atan2(sqrt(a), sqrt(1 - a))
distance = R * c
return distance <= radius_meters
# Default CircleChecker with a radius of 1000 meters
lido_circle_checker = CircleChecker((46.6770371, 11.1860135), 160) # Center
# Default PolygonChecker with a predefined polygon
# polygon_coords = [
# (46.677168, 11.185606),
# (46.676910, 11.185692),
# (46.676673, 11.186094),
# (46.676691, 11.186630),
# (46.676673, 11.187094),
# (46.677309, 11.187242),
# (46.677280, 11.185606)
# ]
#
# lido_polygon_checker = PolygonChecker(polygon_coords)

View file

@ -1,7 +1,12 @@
from dotenv import load_dotenv
from fastapi import FastAPI from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware from fastapi.middleware.cors import CORSMiddleware
from endpoints.geo_access import geo_access_router
from routes import router from routes import router
load_dotenv()
app = FastAPI(title="Simple Fullstack API") app = FastAPI(title="Simple Fullstack API")
# CORS per permettere richieste dal frontend # CORS per permettere richieste dal frontend
@ -15,8 +20,16 @@ app.add_middleware(
# Includi le route # Includi le route
app.include_router(router) app.include_router(router)
app.include_router(geo_access_router)
@app.post("/auth")
def auth():
pass
if __name__ == "__main__": if __name__ == "__main__":
import uvicorn import uvicorn
print("🚀 Avvio server FastAPI...") print("🚀 Avvio server FastAPI...")
uvicorn.run(app, host="0.0.0.0", port=8000) uvicorn.run(app, host="0.0.0.0", port=8000)

View file

@ -1,3 +1,5 @@
import os
from fastapi import APIRouter, HTTPException from fastapi import APIRouter, HTTPException
from pymongo import MongoClient from pymongo import MongoClient
from datetime import datetime from datetime import datetime
@ -6,7 +8,10 @@ from datetime import datetime
router = APIRouter() router = APIRouter()
# Connessione MongoDB # Connessione MongoDB
client = MongoClient("mongodb://localhost:27017/") username = os.getenv("ME_CONFIG_MONGODB_ADMIN_USERNAME")
password = os.getenv("ME_CONFIG_MONGODB_ADMIN_PASSWORD")
client = MongoClient(f"mongodb://admin:password@localhost:27017/")
db = client["simple_db"] db = client["simple_db"]
collection = db["items"] collection = db["items"]