from datetime import datetime from typing import Any, Dict, List, Union from apollo_main_db.apollo import ChartsMonitoring from src.db.base import session def get_charts_monitoring(dsp: List[str], chart_id: str = None) -> List[Dict[str, Any]]: """Get information from tblChartsMonitoring Args: dsp: dsp string (ex: spotify, apple) chart_id: delphi oriented chart_id (ex: regional_daily_us, charts_daily_us) Returns: List[Dict[str, Any] """ filters = [ChartsMonitoring.dsp.in_(dsp)] if chart_id: filters.append(ChartsMonitoring.chart_id == chart_id) result = ( session.query( ChartsMonitoring.dsp, ChartsMonitoring.chart_id, ChartsMonitoring.updated_at, ChartsMonitoring.chart_datetime, ChartsMonitoring.data, ) .filter(*filters) .all() ) return result def get_chart_monitoring_row_existence(dsp: str, chart_id: str) -> List: """Simple check if the record exists Args: dsp: dsp string (ex: spotify, apple) chart_id: delphi oriented chart_id (ex: regional_daily_us, charts_daily_us) """ return session.query(ChartsMonitoring).filter_by(dsp=dsp, chart_id=chart_id).first() def update_chart_monitoring( dsp: str, chart_id: str, updated_at: datetime, chart_datetime: datetime, data: Union[str, None] = None ): """Update existing record(s) in tblChartsMonitoring: 1. datetime information about delphi chart last updated 2. datetime when this event was processed by apollo-charts-monitoring-job Args: dsp: dsp string (ex: spotify, apple) chart_id: delphi oriented chart_id (ex: regional_daily_us, charts_daily_us) updated_at: Datetime when chart was processed chart_datetime: Datetime of delphi chart last update == to "max_date" from delphi charts/data-health/status data: None or last chart state as a string got from delphi (only for apple) """ session.query(ChartsMonitoring).filter_by(dsp=dsp, chart_id=chart_id).update( {"updated_at": updated_at, "chart_datetime": chart_datetime, "data": data} ) def insert_chart_monitoring( dsp: str, chart_id: str, updated_at: datetime, chart_datetime: datetime, data: Union[str, None] = None ): """Insert record to a database Args: dsp: dsp string (ex: spotify, apple) chart_id: delphi oriented chart_id (ex: regional_daily_us, charts_daily_us) updated_at: Datetime when chart was processed chart_datetime: Datetime of delphi chart last update == to "max_date" from delphi charts/data-health/status data: None or last chart state as a string got from delphi (only for apple) """ chart_type, breakdown, market = chart_id.split("_") session.add( ChartsMonitoring( dsp=dsp, chart_type=chart_type, breakdown=breakdown, market=market, chart_id=chart_id, updated_at=updated_at, chart_datetime=chart_datetime, data=data, ) ) def put_charts_monitoring( dsp: str, chart_id: str, updated_at: datetime, chart_datetime: datetime, data: Union[str, None] = None ) -> int: """Update or Insert a record to tblChartsMonitoring Args: dsp: dsp string (ex: spotify, apple) chart_id: delphi oriented chart_id (ex: regional_daily_us, charts_daily_us) updated_at: Datetime when chart was processed chart_datetime: Datetime of delphi chart last update == to "max_date" from delphi charts/data-health/status data: None or last chart state as a string got from delphi (only for apple) Returns: int that is equivalent to status code: 200 if updated, 201 if created """ exist = get_chart_monitoring_row_existence(dsp, chart_id) if exist: update_chart_monitoring(dsp, chart_id, updated_at, chart_datetime, data) else: insert_chart_monitoring(dsp, chart_id, updated_at, chart_datetime, data) session.commit() return 200 if exist else 201