diff --git a/README.md b/README.md index 36c68da..177baec 100644 --- a/README.md +++ b/README.md @@ -14,13 +14,14 @@ git clone https://github.com/InternetHealthReport/ihr-api.git ### 2. Create a `.env` File -In the project root directory, create a new `.env` file to define your specific database connection string. +In the project root directory, create a new `.env` file to define your specific database connection string, proxy path and page size (number of results to return per page.). `.env` content: ```env DATABASE_URL=postgresql://:@:/ PROXY_PATH=api-dev +PAGE_SIZE = 100000 ``` diff --git a/controllers/country_controller.py b/controllers/country_controller.py index 2dbdeff..b9e1b7d 100644 --- a/controllers/country_controller.py +++ b/controllers/country_controller.py @@ -5,7 +5,7 @@ from dtos.country_dto import CountryDTO from config.database import get_db from typing import Optional -from globals import page_size +from utils import page_size # Define a router for all endpoints under /countries router = APIRouter(prefix="/countries", tags=["Countries"]) @@ -29,7 +29,7 @@ def get_all_countries( None, description="Which field to use when ordering the results") ) -> GenericResponseDTO[CountryDTO]: """Retrieves paginated countries with optional filters.""" - + page = page or 1 countries, total_count = CountryController.service.get_all_countries( db, diff --git a/controllers/disco_controller.py b/controllers/disco_controller.py index 82e5493..182a7a9 100644 --- a/controllers/disco_controller.py +++ b/controllers/disco_controller.py @@ -6,7 +6,7 @@ from config.database import get_db from typing import Optional from datetime import datetime -from globals import page_size +from utils import page_size router = APIRouter(prefix="/disco", tags=["Disco"]) @@ -55,7 +55,8 @@ async def get_events( None, description="Total number of Atlas probes active in the reported stream (ASN, Country, or geographical area)."), ongoing: Optional[str] = Query( None, description="Deprecated, this value is unused"), - page: Optional[int] = Query(1, ge=1, description="A page number within the paginated result set."), + page: Optional[int] = Query( + 1, ge=1, description="A page number within the paginated result set."), ordering: Optional[str] = Query( None, description="Which field to use when ordering the results") ) -> GenericResponseDTO[DiscoEventsDTO]: diff --git a/controllers/hegemony_controller.py b/controllers/hegemony_controller.py index 67e2963..ccfaf88 100644 --- a/controllers/hegemony_controller.py +++ b/controllers/hegemony_controller.py @@ -10,7 +10,7 @@ from dtos.hegemony_alarms_dto import HegemonyAlarmsDTO from config.database import get_db from typing import Optional, List -from globals import page_size +from utils import page_size from utils import * router = APIRouter(prefix="/hegemony", tags=["Hegemony"]) diff --git a/controllers/metis_controller.py b/controllers/metis_controller.py index 4a5365e..57266b2 100644 --- a/controllers/metis_controller.py +++ b/controllers/metis_controller.py @@ -7,7 +7,7 @@ from dtos.metis_atlas_selection_dto import MetisAtlasSelectionDTO from config.database import get_db from typing import Optional -from globals import page_size +from utils import page_size from utils import validate_timebin_params, prepare_timebin_range router = APIRouter(prefix="/metis/atlas", tags=["Metis"]) diff --git a/controllers/network_delay_controller.py b/controllers/network_delay_controller.py index cd25572..e4e2a57 100644 --- a/controllers/network_delay_controller.py +++ b/controllers/network_delay_controller.py @@ -8,7 +8,7 @@ from config.database import get_db from typing import Optional, List from datetime import datetime -from globals import page_size +from utils import page_size from utils import * router = APIRouter(prefix="/network_delay", tags=["Network Delay"]) diff --git a/controllers/networks_controller.py b/controllers/networks_controller.py index 3c1200e..b2c2a4b 100644 --- a/controllers/networks_controller.py +++ b/controllers/networks_controller.py @@ -5,7 +5,7 @@ from dtos.networks_dto import NetworksDTO from dtos.generic_response_dto import GenericResponseDTO, build_url from config.database import get_db -from globals import page_size +from utils import page_size router = APIRouter(prefix="/networks", tags=["Networks"]) @@ -28,7 +28,8 @@ async def get_networks( None, description="Autonomous System Number (ASN) or IXP ID. Note that IXP ID are negative to avoid colision."), search: Optional[str] = Query( None, description="Search for both ASN/IXPID and substring in names"), - page: Optional[int] = Query(1, ge=1, description="A page number within the paginated result set."), + page: Optional[int] = Query( + 1, ge=1, description="A page number within the paginated result set."), ordering: Optional[str] = Query( None, description="Which field to use when ordering the results.") ) -> GenericResponseDTO[NetworksDTO]: diff --git a/controllers/tr_hegemony_controller.py b/controllers/tr_hegemony_controller.py index 15be054..2bafb52 100644 --- a/controllers/tr_hegemony_controller.py +++ b/controllers/tr_hegemony_controller.py @@ -6,7 +6,7 @@ from config.database import get_db from typing import Optional from datetime import datetime -from globals import page_size +from utils import page_size from utils import prepare_timebin_range router = APIRouter(prefix="/tr_hegemony", tags=["TR Hegemony"]) @@ -59,7 +59,7 @@ async def get_hegemony( """ timebin__gte, timebin__lte = prepare_timebin_range( timebin, timebin__gte, timebin__lte, max_days=31) - + hegemony_data, total_count = TRHegemonyController.service.get_tr_hegemony( db, timebin=timebin, diff --git a/docs/project_structure.md b/docs/project_structure.md index 3a23999..8d7c317 100644 --- a/docs/project_structure.md +++ b/docs/project_structure.md @@ -18,7 +18,7 @@ This document provides an overview of the project's file and folder structure. E ├── .gitignore # Specifies intentionally untracked files to ignore ├── alembic.ini # Alembic configuration file ├── dockerfile # Docker image instructions to build the app container -├── globals.py # Global constants +├── utils.py # Utils ├── main.py # FastAPI entry point (starts the app) ├── README.md # Project documentation ├── requirements.txt # Python dependencies list for pip installation diff --git a/globals.py b/globals.py deleted file mode 100644 index 113770b..0000000 --- a/globals.py +++ /dev/null @@ -1,2 +0,0 @@ -# page size represents the number of objects returned by "results" field of GenericResponseDTO -page_size = 5 \ No newline at end of file diff --git a/repositories/atlas_delay_alarms_repository.py b/repositories/atlas_delay_alarms_repository.py index af6473b..782419a 100644 --- a/repositories/atlas_delay_alarms_repository.py +++ b/repositories/atlas_delay_alarms_repository.py @@ -3,7 +3,7 @@ from models.atlas_delay_alarms import AtlasDelayAlarms from datetime import datetime from typing import List, Optional, Tuple -from globals import page_size +from utils import page_size class AtlasDelayAlarmsRepository: diff --git a/repositories/atlas_delay_repository.py b/repositories/atlas_delay_repository.py index 4454db6..40c1ae6 100644 --- a/repositories/atlas_delay_repository.py +++ b/repositories/atlas_delay_repository.py @@ -3,7 +3,7 @@ from models.atlas_delay import AtlasDelay from datetime import datetime from typing import List, Optional, Tuple -from globals import page_size +from utils import page_size class AtlasDelayRepository: diff --git a/repositories/atlas_location_repository.py b/repositories/atlas_location_repository.py index 79e503d..4d30db9 100644 --- a/repositories/atlas_location_repository.py +++ b/repositories/atlas_location_repository.py @@ -1,7 +1,7 @@ from sqlalchemy.orm import Session from models.atlas_location import AtlasLocation from typing import Optional, List, Tuple -from globals import page_size +from utils import page_size class AtlasLocationRepository: @@ -29,7 +29,6 @@ def get_all( # Apply ordering if order_by and hasattr(AtlasLocation, order_by): query = query.order_by(getattr(AtlasLocation, order_by)) - # Apply pagination offset = (page - 1) * page_size diff --git a/repositories/country_repository.py b/repositories/country_repository.py index 9f56401..76a3b4a 100644 --- a/repositories/country_repository.py +++ b/repositories/country_repository.py @@ -2,7 +2,7 @@ from models.country import Country from typing import Optional, List, Tuple # Added Tuple for return type from sqlalchemy import asc -from globals import page_size +from utils import page_size class CountryRepository: @@ -27,7 +27,7 @@ def get_all( if name: query = query.filter(Country.name.ilike(f"%{name}%")) - #Executes getting total count of countries + # Executes getting total count of countries total_count = query.count() # Apply ordering if specified diff --git a/repositories/disco_events_repository.py b/repositories/disco_events_repository.py index d6e6c00..39d5a82 100644 --- a/repositories/disco_events_repository.py +++ b/repositories/disco_events_repository.py @@ -3,7 +3,7 @@ from models.disco_events import DiscoEvents from datetime import datetime from typing import List, Optional, Tuple -from globals import page_size +from utils import page_size class DiscoEventsRepository: diff --git a/repositories/hegemony_alarms_repository.py b/repositories/hegemony_alarms_repository.py index bc4c957..e628104 100644 --- a/repositories/hegemony_alarms_repository.py +++ b/repositories/hegemony_alarms_repository.py @@ -2,7 +2,7 @@ from sqlalchemy.orm import Session from models.hegemony_alarms import HegemonyAlarms from typing import Optional, List, Tuple -from globals import page_size +from utils import page_size class HegemonyAlarmsRepository: diff --git a/repositories/hegemony_cone_repository.py b/repositories/hegemony_cone_repository.py index 8e2b067..1eed074 100644 --- a/repositories/hegemony_cone_repository.py +++ b/repositories/hegemony_cone_repository.py @@ -2,7 +2,7 @@ from sqlalchemy.orm import Session from models.hegemony_cone import HegemonyCone from typing import Optional, List, Tuple -from globals import page_size +from utils import page_size class HegemonyConeRepository: diff --git a/repositories/hegemony_country_repository.py b/repositories/hegemony_country_repository.py index 075a664..906cb68 100644 --- a/repositories/hegemony_country_repository.py +++ b/repositories/hegemony_country_repository.py @@ -2,7 +2,7 @@ from sqlalchemy.orm import Session from models.hegemony_country import HegemonyCountry from typing import Optional, List, Tuple -from globals import page_size +from utils import page_size class HegemonyCountryRepository: diff --git a/repositories/hegemony_prefix_repository.py b/repositories/hegemony_prefix_repository.py index 8a30099..ee2b472 100644 --- a/repositories/hegemony_prefix_repository.py +++ b/repositories/hegemony_prefix_repository.py @@ -2,7 +2,7 @@ from sqlalchemy.orm import Session from models.hegemony_prefix import HegemonyPrefix from typing import Optional, List, Tuple -from globals import page_size +from utils import page_size class HegemonyPrefixRepository: diff --git a/repositories/hegemony_repository.py b/repositories/hegemony_repository.py index 4014eb5..ed7f902 100644 --- a/repositories/hegemony_repository.py +++ b/repositories/hegemony_repository.py @@ -2,7 +2,7 @@ from sqlalchemy.orm import Session from models.hegemony import Hegemony from typing import Optional, List, Tuple -from globals import page_size +from utils import page_size class HegemonyRepository: diff --git a/repositories/metis_atlas_deployment_repository.py b/repositories/metis_atlas_deployment_repository.py index df944c1..2e4edcf 100644 --- a/repositories/metis_atlas_deployment_repository.py +++ b/repositories/metis_atlas_deployment_repository.py @@ -2,7 +2,7 @@ from sqlalchemy.orm import Session from models.metis_atlas_deployment import MetisAtlasDeployment from typing import Optional, List, Tuple -from globals import page_size +from utils import page_size class MetisAtlasDeploymentRepository: @@ -46,7 +46,7 @@ def get_all( # Apply ordering if order_by and hasattr(MetisAtlasDeployment, order_by): query = query.order_by(getattr(MetisAtlasDeployment, order_by)) - + # Apply pagination offset = (page - 1) * page_size results = query.offset(offset).limit(page_size).all() diff --git a/repositories/metis_atlas_selection_repository.py b/repositories/metis_atlas_selection_repository.py index 53cc5cc..0d9d882 100644 --- a/repositories/metis_atlas_selection_repository.py +++ b/repositories/metis_atlas_selection_repository.py @@ -2,7 +2,7 @@ from sqlalchemy.orm import Session from models.metis_atlas_selection import MetisAtlasSelection from typing import Optional, List, Tuple -from globals import page_size +from utils import page_size class MetisAtlasSelectionRepository: diff --git a/repositories/networks_repository.py b/repositories/networks_repository.py index 9117875..d7add3e 100644 --- a/repositories/networks_repository.py +++ b/repositories/networks_repository.py @@ -1,8 +1,8 @@ from sqlalchemy.orm import Session -from sqlalchemy import or_,String +from sqlalchemy import or_, String from models.asn import ASN from typing import Optional, List, Tuple -from globals import page_size +from utils import page_size class NetworksRepository: @@ -47,7 +47,7 @@ def get_all( # Apply ordering if order_by and hasattr(ASN, order_by): query = query.order_by(getattr(ASN, order_by)) - + # Apply pagination offset = (page - 1) * page_size results = query.offset(offset).limit(page_size).all() diff --git a/repositories/tr_hegemony_repository.py b/repositories/tr_hegemony_repository.py index a6f802b..1a6f008 100644 --- a/repositories/tr_hegemony_repository.py +++ b/repositories/tr_hegemony_repository.py @@ -3,7 +3,7 @@ from models.tr_hegemony import TRHegemony from datetime import datetime from typing import List, Optional, Tuple -from globals import page_size +from utils import page_size class TRHegemonyRepository: diff --git a/utils.py b/utils.py index 90ee61a..f29bcde 100644 --- a/utils.py +++ b/utils.py @@ -3,7 +3,16 @@ from fastapi import HTTPException from datetime import datetime, timedelta from typing import Optional +from dotenv import load_dotenv +import os +# Load environment variables from .env file +try: + load_dotenv() +except: + pass + +page_size = int(os.getenv("PAGE_SIZE")) def validate_timebin_params( timebin: Optional[datetime],