From 3f7b94d9c35f9feed8765c3b507c4260d30fe9cf Mon Sep 17 00:00:00 2001 From: Max Chis Date: Sun, 12 Oct 2025 19:40:27 -0400 Subject: [PATCH] Add record type metrics count logic --- .../metrics/dtos/get/urls/aggregated/core.py | 2 ++ .../metrics/urls/aggregated/query/core.py | 6 ++++ .../query/subqueries/record_type.py | 33 +++++++++++++++++++ 3 files changed, 41 insertions(+) create mode 100644 src/api/endpoints/metrics/urls/aggregated/query/subqueries/record_type.py diff --git a/src/api/endpoints/metrics/dtos/get/urls/aggregated/core.py b/src/api/endpoints/metrics/dtos/get/urls/aggregated/core.py index dd323379..7dbbc48a 100644 --- a/src/api/endpoints/metrics/dtos/get/urls/aggregated/core.py +++ b/src/api/endpoints/metrics/dtos/get/urls/aggregated/core.py @@ -2,6 +2,7 @@ from pydantic import BaseModel +from src.core.enums import RecordType from src.db.models.impl.flag.url_validated.enums import URLType from src.db.models.views.url_status.enums import URLStatusViewEnum @@ -13,4 +14,5 @@ class GetMetricsURLsAggregatedResponseDTO(BaseModel): count_urls_total: int count_urls_status: dict[URLStatusViewEnum, int] count_urls_type: dict[URLType, int] + count_urls_record_type: dict[RecordType, int] oldest_pending_url: GetMetricsURLValidatedOldestPendingURL | None diff --git a/src/api/endpoints/metrics/urls/aggregated/query/core.py b/src/api/endpoints/metrics/urls/aggregated/query/core.py index 7110a48a..c6dbc29f 100644 --- a/src/api/endpoints/metrics/urls/aggregated/query/core.py +++ b/src/api/endpoints/metrics/urls/aggregated/query/core.py @@ -5,8 +5,10 @@ from src.api.endpoints.metrics.urls.aggregated.query.subqueries.all import ALL_SUBQUERY from src.api.endpoints.metrics.urls.aggregated.query.subqueries.oldest_pending_url import \ GetOldestPendingURLQueryBuilder +from src.api.endpoints.metrics.urls.aggregated.query.subqueries.record_type import GetURLRecordTypeCountQueryBuilder from src.api.endpoints.metrics.urls.aggregated.query.subqueries.status import GetURLStatusCountQueryBuilder from src.api.endpoints.metrics.urls.aggregated.query.subqueries.url_type import GetURLTypeCountQueryBuilder +from src.core.enums import RecordType from src.db.helpers.session import session_helper as sh from src.db.models.impl.flag.url_validated.enums import URLType from src.db.models.views.url_status.enums import URLStatusViewEnum @@ -26,9 +28,13 @@ async def run(self, session: AsyncSession) -> GetMetricsURLsAggregatedResponseDT validated_counts: dict[URLType, int] = \ await GetURLTypeCountQueryBuilder().run(session=session) + record_type_counts: dict[RecordType, int] = \ + await GetURLRecordTypeCountQueryBuilder().run(session=session) + return GetMetricsURLsAggregatedResponseDTO( count_urls_total=await sh.scalar(session, query=ALL_SUBQUERY), oldest_pending_url=oldest_pending_url, count_urls_status=status_counts, count_urls_type=validated_counts, + count_urls_record_type=record_type_counts, ) diff --git a/src/api/endpoints/metrics/urls/aggregated/query/subqueries/record_type.py b/src/api/endpoints/metrics/urls/aggregated/query/subqueries/record_type.py new file mode 100644 index 00000000..a4923af6 --- /dev/null +++ b/src/api/endpoints/metrics/urls/aggregated/query/subqueries/record_type.py @@ -0,0 +1,33 @@ +from typing import Sequence + +from sqlalchemy import select, func, RowMapping +from sqlalchemy.ext.asyncio import AsyncSession + +from src.core.enums import RecordType +from src.db.helpers.session import session_helper as sh +from src.db.models.impl.url.record_type.sqlalchemy import URLRecordType +from src.db.queries.base.builder import QueryBuilderBase + + +class GetURLRecordTypeCountQueryBuilder(QueryBuilderBase): + + async def run( + self, + session: AsyncSession + ) -> dict[RecordType, int]: + query = ( + select( + URLRecordType.record_type, + func.count(URLRecordType.url_id).label("count") + ) + .group_by( + URLRecordType.record_type + ) + ) + + mappings: Sequence[RowMapping] = await sh.mappings(session, query=query) + + return { + mapping["record_type"]: mapping["count"] + for mapping in mappings + } \ No newline at end of file