from datetime import datetime, timedelta import json from typing import List from apollo_main_db.apollo.models import ApolloVisitLog from smelog.factory import BoundLogger from track_visit_events_handling import config from track_visit_events_handling.main_db import session_scope def update_legacy_messages(records: List[dict]): """Convert legacy messages to new format. Args: records: Legacy records. """ for item in records: if item.get("spotify_id"): item.update({"dsp_id": 1, "type_id": 1, "instance_id": item["spotify_id"]}) if item.get("apple_id"): item.update({"dsp_id": 2, "type_id": 1, "instance_id": item["apple_id"]}) if "spotify_id" in item: del item["spotify_id"] if "apple_id" in item: del item["apple_id"] def save_track_visits(records: List[dict]): """Insert new track visit logs to the database. Args: records (List[dict]): Track visit records to insert """ update_legacy_messages(records) for i in range(0, len(records), config.TRACK_VISITS_BATCH_SIZE): current_chunk = records[i:i + config.TRACK_VISITS_BATCH_SIZE] with session_scope() as session: session.bulk_insert_mappings(ApolloVisitLog, current_chunk, render_nulls=True) def cleanup_track_visit_logs() -> int: """Remove outdated track page visit logs from the database Returns: int: Affected row count. """ cut_off_time = datetime.utcnow() - timedelta(days=config.TRACK_VISITS_LOG_RETENTION_DAYS) with session_scope() as session: result = session.query(ApolloVisitLog).filter(ApolloVisitLog.created_at < cut_off_time).delete() return result def process_event(logger: BoundLogger, event: dict): """Handler contains business logic Args: logger (logging.Logger): Logger instance event (dict): SQS records. """ records = [json.loads(r["body"]) for r in event["Records"]] save_track_visits(records) logger.info("{} new records saved.".format(len(records))) count = cleanup_track_visit_logs() logger.info("{} outdated records were removed.".format(count))