from typing import List, Dict, Any from smelog.factory import BoundLogger from charts_messages import schemas, config from charts_messages.client.user_data_api import UserDataClient from charts_messages.constants import UNIQUE_CHECK_KEY from charts_messages.processings.get_messages import get_chart_update_messages_for_users from charts_messages.utils import deserialize_event, check_received_event, get_messages_status_length def update_handler(events: List[Dict[str, Any]], logger: BoundLogger): user_data_client = UserDataClient() user_accounts_with_devices = user_data_client.get_user_accounts_with_devices() for event in events: event = deserialize_event(logger, schemas.IncomingUpdateEvent(), event) if not event: continue event_id = event["id"] if not check_received_event(event): logger.warning(f"{event_id} - id Event is no more actual") continue logger.info(f"Starting to process actual event with:\n" f"Event id: {event_id} \n") messages = get_chart_update_messages_for_users(event, user_accounts_with_devices, logger) if not messages: logger.info(f"Event id: {event_id}\n" f"Has no chart update messages to create for any user of\n" f"Total users: {len(user_accounts_with_devices)}" f"Because their notifications are OFF ") continue total_messages_count = len(messages) logger.info(f"Event id: {event_id} \n" f"Has: {total_messages_count} chart update messages created \n") message_status = user_data_client.post_messages( body=messages, unique_mode=config.UNIQUE_MODE, unique_key=UNIQUE_CHECK_KEY) status_ok, status_failed = get_messages_status_length(message_status) logger.info(f"Event id: {event_id} \n" f"Messages sent:\n" f"Successfully: {status_ok}/{total_messages_count} \n," f"Failed: {status_failed}/{total_messages_count}")