From 99771a88c589c4b2410402df818753dc9410e44b Mon Sep 17 00:00:00 2001 From: rayd1o Date: Thu, 12 Mar 2026 17:08:18 +0800 Subject: [PATCH] feat(config): make ArcGIS data source URLs configurable - Add ARCGIS_CABLE_URL, ARCGIS_LANDING_POINT_URL, ARCGIS_CABLE_LANDING_RELATION_URL to config - Use @property to read URL from settings in collectors - URLs can now be configured via environment variables --- backend/app/core/config.py | 4 ++++ .../app/services/collectors/arcgis_cables.py | 5 ++++- .../app/services/collectors/arcgis_landing.py | 18 ++++++------------ .../app/services/collectors/arcgis_relation.py | 8 +++++--- 4 files changed, 19 insertions(+), 16 deletions(-) diff --git a/backend/app/core/config.py b/backend/app/core/config.py index 71c194a3..27901bfe 100644 --- a/backend/app/core/config.py +++ b/backend/app/core/config.py @@ -27,6 +27,10 @@ class Settings(BaseSettings): CORS_ORIGINS: List[str] = ["http://localhost:3000", "http://localhost:8000"] + ARCGIS_CABLE_URL: str = "https://services.arcgis.com/6DIQcwlPy8knb6sg/ArcGIS/rest/services/SubmarineCables/FeatureServer/2/query" + ARCGIS_LANDING_POINT_URL: str = "https://services.arcgis.com/6DIQcwlPy8knb6sg/ArcGIS/rest/services/SubmarineCables/FeatureServer/1/query" + ARCGIS_CABLE_LANDING_RELATION_URL: str = "https://services.arcgis.com/6DIQcwlPy8knb6sg/ArcGIS/rest/services/SubmarineCables/FeatureServer/3/query" + @property def REDIS_URL(self) -> str: return os.getenv( diff --git a/backend/app/services/collectors/arcgis_cables.py b/backend/app/services/collectors/arcgis_cables.py index 7fea2e9a..424d46df 100644 --- a/backend/app/services/collectors/arcgis_cables.py +++ b/backend/app/services/collectors/arcgis_cables.py @@ -9,6 +9,7 @@ from datetime import datetime import httpx from app.services.collectors.base import BaseCollector +from app.core.config import settings class ArcGISCableCollector(BaseCollector): @@ -18,7 +19,9 @@ class ArcGISCableCollector(BaseCollector): frequency_hours = 168 data_type = "submarine_cable" - base_url = "https://services.arcgis.com/6DIQcwlPy8knb6sg/arcgis/rest/services/SubmarineCables/FeatureServer/2/query" + @property + def base_url(self) -> str: + return settings.ARCGIS_CABLE_URL async def fetch(self) -> List[Dict[str, Any]]: params = {"where": "1=1", "outFields": "*", "returnGeometry": "true", "f": "geojson"} diff --git a/backend/app/services/collectors/arcgis_landing.py b/backend/app/services/collectors/arcgis_landing.py index bb9a3a68..8f58ad8e 100644 --- a/backend/app/services/collectors/arcgis_landing.py +++ b/backend/app/services/collectors/arcgis_landing.py @@ -1,12 +1,9 @@ -"""ArcGIS Landing Points Collector - -Collects landing point data from ArcGIS GeoJSON API. -""" - from typing import Dict, Any, List from datetime import datetime +import httpx from app.services.collectors.base import BaseCollector +from app.core.config import settings class ArcGISLandingPointCollector(BaseCollector): @@ -16,21 +13,18 @@ class ArcGISLandingPointCollector(BaseCollector): frequency_hours = 168 data_type = "landing_point" - base_url = "https://services.arcgis.com/6DIQcwlPy8knb6sg/arcgis/rest/services/SubmarineCables/FeatureServer/1/query" + @property + def base_url(self) -> str: + return settings.ARCGIS_LANDING_POINT_URL async def fetch(self) -> List[Dict[str, Any]]: params = {"where": "1=1", "outFields": "*", "returnGeometry": "true", "f": "geojson"} - async with self._get_client() as client: + async with httpx.AsyncClient(timeout=60.0) as client: response = await client.get(self.base_url, params=params) response.raise_for_status() return self.parse_response(response.json()) - def _get_client(self): - import httpx - - return httpx.AsyncClient(timeout=60.0) - def parse_response(self, data: Dict[str, Any]) -> List[Dict[str, Any]]: result = [] diff --git a/backend/app/services/collectors/arcgis_relation.py b/backend/app/services/collectors/arcgis_relation.py index 5b17ebb9..8b55eb9e 100644 --- a/backend/app/services/collectors/arcgis_relation.py +++ b/backend/app/services/collectors/arcgis_relation.py @@ -1,7 +1,9 @@ from typing import Dict, Any, List from datetime import datetime +import httpx from app.services.collectors.base import BaseCollector +from app.core.config import settings class ArcGISCableLandingRelationCollector(BaseCollector): @@ -11,11 +13,11 @@ class ArcGISCableLandingRelationCollector(BaseCollector): frequency_hours = 168 data_type = "cable_landing_relation" - base_url = "https://services.arcgis.com/6DIQcwlPy8knb6sg/arcgis/rest/services/SubmarineCables/FeatureServer/3/query" + @property + def base_url(self) -> str: + return settings.ARCGIS_CABLE_LANDING_RELATION_URL async def fetch(self) -> List[Dict[str, Any]]: - import httpx - params = {"where": "1=1", "outFields": "*", "returnGeometry": "true", "f": "geojson"} async with httpx.AsyncClient(timeout=60.0) as client: