From 63bcd9b9319fec4b963a61664547c3ab83ebc311 Mon Sep 17 00:00:00 2001 From: "Magel, Denis" Date: Thu, 18 Sep 2025 10:10:30 +0200 Subject: [PATCH 1/4] feat: add GET /aggregates --- src/example/__init__.py | 3 ++- src/example/aggregate_router.py | 21 +++++++++++++++++++++ src/example/aggregate_schema.py | 7 +++++++ src/example/aggregate_service.py | 24 ++++++++++++++++++++++++ src/main.py | 3 ++- 5 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 src/example/aggregate_router.py create mode 100644 src/example/aggregate_schema.py create mode 100644 src/example/aggregate_service.py diff --git a/src/example/__init__.py b/src/example/__init__.py index 1f780dd..6d88aff 100644 --- a/src/example/__init__.py +++ b/src/example/__init__.py @@ -1,3 +1,4 @@ from .router import router as example_router +from .aggregate_router import router as aggregate_router -__all__ = ["example_router"] +__all__ = ["example_router", "aggregate_router"] diff --git a/src/example/aggregate_router.py b/src/example/aggregate_router.py new file mode 100644 index 0000000..90f7c11 --- /dev/null +++ b/src/example/aggregate_router.py @@ -0,0 +1,21 @@ +# contains the router for the aggregates endpoint +from fastapi import APIRouter, Query +from enum import Enum +from typing import List +from .aggregate_schema import AggregateSchema +from .aggregate_service import get_aggregates + + +class MetricEnum(str, Enum): + relative = "relative" + absolute = "absolute" + + +router = APIRouter(tags=["aggregates"]) + + +@router.get("/aggregates", response_model=List[AggregateSchema]) +async def aggregates_endpoint( + metric: MetricEnum = Query(MetricEnum.relative, description="Metric type") +): + return await get_aggregates(metric) diff --git a/src/example/aggregate_schema.py b/src/example/aggregate_schema.py new file mode 100644 index 0000000..b62ee50 --- /dev/null +++ b/src/example/aggregate_schema.py @@ -0,0 +1,7 @@ +# contains the schema definitions for aggregates +from pydantic import BaseModel + +class AggregateSchema(BaseModel): + aggregate: str + node: str + available: str diff --git a/src/example/aggregate_service.py b/src/example/aggregate_service.py new file mode 100644 index 0000000..0a40557 --- /dev/null +++ b/src/example/aggregate_service.py @@ -0,0 +1,24 @@ +# contains the business logic for aggregates +from typing import List +from .aggregate_schema import AggregateSchema + + +async def get_aggregates(metric: str = "relative") -> List[AggregateSchema]: + # Dummy data for demonstration + # You can use the metric parameter to filter or modify results as needed + # For now, just return the same data and show metric usage + print(f"Metric used: {metric}") + + aggregates: list = [ + AggregateSchema( + aggregate="Aggregate A", node="cluster01-01", available="100.0TB" + ), + AggregateSchema( + aggregate="Aggregate B", node="cluster01-01", available="200.5GB" + ), + AggregateSchema( + aggregate="Aggregate C", node="cluster01-02", available="300.75MB" + ), + ] + + return aggregates diff --git a/src/main.py b/src/main.py index 69a9d2d..ada95be 100644 --- a/src/main.py +++ b/src/main.py @@ -1,6 +1,7 @@ from src.service import load_config from fastapi import FastAPI import logging +from src.example import aggregate_router logger = logging.getLogger("uvicorn") @@ -8,7 +9,7 @@ logger.info("Starting application") config = load_config() app = FastAPI() - +app.include_router(aggregate_router) @app.get("/") async def main(): -- 2.49.1 From af4b60a0e3197a070e528d1d4a81f456e1449aa7 Mon Sep 17 00:00:00 2001 From: "Magel, Denis" Date: Thu, 18 Sep 2025 10:17:24 +0200 Subject: [PATCH 2/4] style: --- src/example/aggregate_schema.py | 1 + src/example/aggregate_service.py | 12 +++--------- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/src/example/aggregate_schema.py b/src/example/aggregate_schema.py index b62ee50..4edd30a 100644 --- a/src/example/aggregate_schema.py +++ b/src/example/aggregate_schema.py @@ -1,6 +1,7 @@ # contains the schema definitions for aggregates from pydantic import BaseModel + class AggregateSchema(BaseModel): aggregate: str node: str diff --git a/src/example/aggregate_service.py b/src/example/aggregate_service.py index 0a40557..59daa94 100644 --- a/src/example/aggregate_service.py +++ b/src/example/aggregate_service.py @@ -10,15 +10,9 @@ async def get_aggregates(metric: str = "relative") -> List[AggregateSchema]: print(f"Metric used: {metric}") aggregates: list = [ - AggregateSchema( - aggregate="Aggregate A", node="cluster01-01", available="100.0TB" - ), - AggregateSchema( - aggregate="Aggregate B", node="cluster01-01", available="200.5GB" - ), - AggregateSchema( - aggregate="Aggregate C", node="cluster01-02", available="300.75MB" - ), + AggregateSchema(aggregate="Aggregate A", node="cluster01-01", available="100.0TB"), + AggregateSchema(aggregate="Aggregate B", node="cluster01-01", available="200.5GB"), + AggregateSchema(aggregate="Aggregate C", node="cluster01-02", available="300.75MB"), ] return aggregates -- 2.49.1 From 615d290773bd0fd1c55fab60a5a138a1f1e1ff3e Mon Sep 17 00:00:00 2001 From: Pascal Scheiben Date: Thu, 18 Sep 2025 10:23:40 +0200 Subject: [PATCH 3/4] Renamed folder from example -> aggregate --- src/{example => aggregate}/__init__.py | 0 src/{example => aggregate}/aggregate_router.py | 2 +- src/{example => aggregate}/aggregate_schema.py | 0 src/{example => aggregate}/aggregate_service.py | 12 +++++++++--- src/{example => aggregate}/constants.py | 0 src/{example => aggregate}/router.py | 4 ++-- src/{example => aggregate}/schema.py | 2 +- src/aggregate/service.py | 3 +++ src/example/service.py | 3 --- src/main.py | 3 ++- 10 files changed, 18 insertions(+), 11 deletions(-) rename src/{example => aggregate}/__init__.py (100%) rename src/{example => aggregate}/aggregate_router.py (97%) rename src/{example => aggregate}/aggregate_schema.py (100%) rename src/{example => aggregate}/aggregate_service.py (57%) rename src/{example => aggregate}/constants.py (100%) rename src/{example => aggregate}/router.py (69%) rename src/{example => aggregate}/schema.py (64%) create mode 100644 src/aggregate/service.py delete mode 100644 src/example/service.py diff --git a/src/example/__init__.py b/src/aggregate/__init__.py similarity index 100% rename from src/example/__init__.py rename to src/aggregate/__init__.py diff --git a/src/example/aggregate_router.py b/src/aggregate/aggregate_router.py similarity index 97% rename from src/example/aggregate_router.py rename to src/aggregate/aggregate_router.py index 90f7c11..b33556b 100644 --- a/src/example/aggregate_router.py +++ b/src/aggregate/aggregate_router.py @@ -16,6 +16,6 @@ router = APIRouter(tags=["aggregates"]) @router.get("/aggregates", response_model=List[AggregateSchema]) async def aggregates_endpoint( - metric: MetricEnum = Query(MetricEnum.relative, description="Metric type") + metric: MetricEnum = Query(MetricEnum.relative, description="Metric type"), ): return await get_aggregates(metric) diff --git a/src/example/aggregate_schema.py b/src/aggregate/aggregate_schema.py similarity index 100% rename from src/example/aggregate_schema.py rename to src/aggregate/aggregate_schema.py diff --git a/src/example/aggregate_service.py b/src/aggregate/aggregate_service.py similarity index 57% rename from src/example/aggregate_service.py rename to src/aggregate/aggregate_service.py index 59daa94..0a40557 100644 --- a/src/example/aggregate_service.py +++ b/src/aggregate/aggregate_service.py @@ -10,9 +10,15 @@ async def get_aggregates(metric: str = "relative") -> List[AggregateSchema]: print(f"Metric used: {metric}") aggregates: list = [ - AggregateSchema(aggregate="Aggregate A", node="cluster01-01", available="100.0TB"), - AggregateSchema(aggregate="Aggregate B", node="cluster01-01", available="200.5GB"), - AggregateSchema(aggregate="Aggregate C", node="cluster01-02", available="300.75MB"), + AggregateSchema( + aggregate="Aggregate A", node="cluster01-01", available="100.0TB" + ), + AggregateSchema( + aggregate="Aggregate B", node="cluster01-01", available="200.5GB" + ), + AggregateSchema( + aggregate="Aggregate C", node="cluster01-02", available="300.75MB" + ), ] return aggregates diff --git a/src/example/constants.py b/src/aggregate/constants.py similarity index 100% rename from src/example/constants.py rename to src/aggregate/constants.py diff --git a/src/example/router.py b/src/aggregate/router.py similarity index 69% rename from src/example/router.py rename to src/aggregate/router.py index bfad513..4c5096d 100644 --- a/src/example/router.py +++ b/src/aggregate/router.py @@ -1,8 +1,8 @@ -# contains the router for the example endpoint +# contains the router for the aggregate endpoint from fastapi import APIRouter from .schema import ExampleSchema -router = APIRouter(tags=["example"]) +router = APIRouter(tags=["aggregate"]) @router.get("/example") diff --git a/src/example/schema.py b/src/aggregate/schema.py similarity index 64% rename from src/example/schema.py rename to src/aggregate/schema.py index 254a309..47392d6 100644 --- a/src/example/schema.py +++ b/src/aggregate/schema.py @@ -1,4 +1,4 @@ -# contains the schema definitions for the example service +# contains the schema definitions for the aggregate service from pydantic import BaseModel diff --git a/src/aggregate/service.py b/src/aggregate/service.py new file mode 100644 index 0000000..cd81419 --- /dev/null +++ b/src/aggregate/service.py @@ -0,0 +1,3 @@ +# contains the business logic for the aggregate service +async def example_service() -> str: + return "This is an aggregate service" diff --git a/src/example/service.py b/src/example/service.py deleted file mode 100644 index 0553df7..0000000 --- a/src/example/service.py +++ /dev/null @@ -1,3 +0,0 @@ -# contains the business logic for the example service -async def example_service() -> str: - return "This is an example service" diff --git a/src/main.py b/src/main.py index ada95be..8e902bf 100644 --- a/src/main.py +++ b/src/main.py @@ -1,7 +1,7 @@ from src.service import load_config from fastapi import FastAPI import logging -from src.example import aggregate_router +from src.aggregate import aggregate_router logger = logging.getLogger("uvicorn") @@ -11,6 +11,7 @@ config = load_config() app = FastAPI() app.include_router(aggregate_router) + @app.get("/") async def main(): return {"Hello": "World"} -- 2.49.1 From 73a42aae3bbdadf235d9d7c7a853bd0a5c02c43a Mon Sep 17 00:00:00 2001 From: Pascal Scheiben Date: Thu, 18 Sep 2025 10:39:36 +0200 Subject: [PATCH 4/4] Moving example files back to its place --- src/aggregate/__init__.py | 2 +- src/example/__init__.py | 0 src/{aggregate => example}/constants.py | 0 src/{aggregate => example}/router.py | 0 src/{aggregate => example}/schema.py | 0 src/{aggregate => example}/service.py | 0 6 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 src/example/__init__.py rename src/{aggregate => example}/constants.py (100%) rename src/{aggregate => example}/router.py (100%) rename src/{aggregate => example}/schema.py (100%) rename src/{aggregate => example}/service.py (100%) diff --git a/src/aggregate/__init__.py b/src/aggregate/__init__.py index 6d88aff..c55c18d 100644 --- a/src/aggregate/__init__.py +++ b/src/aggregate/__init__.py @@ -1,4 +1,4 @@ -from .router import router as example_router +from src.example.router import router as example_router from .aggregate_router import router as aggregate_router __all__ = ["example_router", "aggregate_router"] diff --git a/src/example/__init__.py b/src/example/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/aggregate/constants.py b/src/example/constants.py similarity index 100% rename from src/aggregate/constants.py rename to src/example/constants.py diff --git a/src/aggregate/router.py b/src/example/router.py similarity index 100% rename from src/aggregate/router.py rename to src/example/router.py diff --git a/src/aggregate/schema.py b/src/example/schema.py similarity index 100% rename from src/aggregate/schema.py rename to src/example/schema.py diff --git a/src/aggregate/service.py b/src/example/service.py similarity index 100% rename from src/aggregate/service.py rename to src/example/service.py -- 2.49.1