from typing import List, Dict, Any from smelog.factory import BoundLogger from charts_feed_messages.client.utils import get_basic_messages_data, post_feed_messages from charts_feed_messages.processing.check_incoming_events import check_incoming_events from charts_feed_messages.processing.get_feed_messages import get_feed_messages from charts_feed_messages.schemas import MessageEventWithData from charts_feed_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 (Message Created) ids from incoming events and log if there are some errors with data actual_message_created_ids = check_incoming_events(logger, events) logger.info(f"Got {len(actual_message_created_ids)} of actual messages to process \n " f"Message id(s): \n" f"{actual_message_created_ids}") # Get basic messages data from User Data Api by list of actual event id(s) for further data manipulation and feed # messages creation and deserialize them basic_messages = handle_events_deserialization( logger=logger, schema=MessageEventWithData(), events=get_basic_messages_data( message_ids=actual_message_created_ids ) ) if not basic_messages: logger.info("No actual basic messages") return logger.info("FIRST BASIC MESSAGE: \n" f"{basic_messages[0]}") # Create Feed Messages feed_messages = get_feed_messages(basic_messages) if feed_messages: logger.info("FIRST FEED MESSAGE: \n" f"{feed_messages[0]}") total_messages_count = len(feed_messages) logger.info(f"Has {total_messages_count} created Feed Messages") # Post Feed Messages to User Data Api bulk and get statuses for them message_status = post_feed_messages(feed_messages=feed_messages) # Get count(s) of successful and failed posted feed messages status_ok, status_failed = get_messages_status_length(message_status) logger.info(f"Feed messages sent \n successfully: {status_ok}/{total_messages_count} \n," f" Feed messages failed: {status_failed}/{total_messages_count}")