from typing import Any, Dict, List from smelog.factory import BoundLogger from charts_push_messages.client.utils import get_feed_messages_data, post_push_messages from charts_push_messages.processing.check_incoming_events import check_incoming_events from charts_push_messages.processing.get_push_messages import get_push_messages from charts_push_messages.schemas import FeedMessageCreatedWithDataSchema from charts_push_messages.utils.common import handle_events_deserialization, get_messages_status_length, \ handle_diff_source_events def handler(logger: BoundLogger, event: List[Dict[str, Any]]): """Lambda job. Args: logger: Logger instance. event: Lambda event obj. Returns: JSON serializable response """ events = handle_diff_source_events(logger, event) # Get only actual event (FeedMessageCreated) ids from incoming events and log if there are some errors with data actual_feed_message_created_ids = check_incoming_events(logger, events) logger.info(f"Got {len(actual_feed_message_created_ids)} of actual feed messages id(s) to process \n " f"Feed Message id(s): \n" f"{actual_feed_message_created_ids}") # Get all actual Feed Message Created from User Data Api by list of actual event id(s) - deserialize them - # for further data manipulation and push messages creation feed_messages = handle_events_deserialization( logger=logger, schema=FeedMessageCreatedWithDataSchema(), events=get_feed_messages_data( message_ids=actual_feed_message_created_ids ) ) if not feed_messages: logger.info("No actual feed messages") return logger.info("FIRST FEED MESSAGE: \n" f"{feed_messages[0]}") push_messages = get_push_messages(feed_messages) if push_messages: logger.info("FIRST PUSH MESSAGE: \n" f"{push_messages[0]}") total_messages_count = len(push_messages) logger.info(f"Has {total_messages_count} created Push Messages") # Post Feed Messages to User Data Api bulk and get statuses for them message_status = post_push_messages(push_messages=push_messages) # Get count(s) of successful and failed posted push messages status_ok, status_failed = get_messages_status_length(message_status) logger.info(f"Push messages sent \n successfully: {status_ok}/{total_messages_count} \n," f"Push messages failed: {status_failed}/{total_messages_count}")