From 63bcd9b9319fec4b963a61664547c3ab83ebc311 Mon Sep 17 00:00:00 2001 From: "Magel, Denis" Date: Thu, 18 Sep 2025 10:10:30 +0200 Subject: [PATCH] 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():