from datetime import datetime from sqlalchemy import and_, desc, func, select from sqlalchemy.ext.asyncio import AsyncSession from db.models import Metrics, MetricsQuery, Query, Url ########################################################### # BLOCK FOR INTERACTION WITH DATABASE IN BUSINESS CONTEXT # ########################################################### class UrlDAL: """Data Access Layer for operating user info""" def __init__(self, db_session: AsyncSession): self.db_session = db_session async def add_new_urls(self, add_values: list[Url]): for new_url in add_values: query = select(Url).where(Url.url == new_url.url) res = await self.db_session.execute(query) if res.scalar_one_or_none() is None: self.db_session.add(new_url) else: # If nessessary we can update data here pass await self.db_session.flush() return class MetricDAL: """Data Access Layer for operating user info""" def __init__(self, db_session: AsyncSession): self.db_session = db_session async def get_last_metrics_date(self) -> datetime | None: query = ( select(Metrics.date).group_by(Metrics.date).order_by(Metrics.date.desc()) ) result = await self.db_session.execute(query) if result is None: return None last_date = result.scalars().first() return last_date