from typing import Any, Dict, List, Union from smelog.factory import BoundLogger from apollo_delphi_events import config from apollo_delphi_events.constants import APP_NAME, UNIQUE_CHECK_KEY from apollo_delphi_events.user_data_api import UserDataClient from apollo_delphi_events.utils import format_output, parse_input def handler(logger: BoundLogger, event: Union[List[Dict[str, Any]], Dict[str, Any]]): """Lambda job. Args: logger: Logger instance. event: List[Lambda event obj]. Returns: JSON serializable response """ logger.info(f"1. {APP_NAME} was triggered by an input event\nEvent: {event}") events = parse_input(logger, event) if not events: return logger.info(f"2. {APP_NAME} has parsed the following input events \nEvents: {events}") data = format_output(events, public=config.PUBLIC, unique_mode=config.UNIQUE_MODE, unique_key=UNIQUE_CHECK_KEY) logger.info(f"3. {APP_NAME} has formatted the output data to send\nData: {data}") response = UserDataClient().post_events(data) logger.info(f"4. {APP_NAME} has posted the data to user-data-api with the following response\nResponse: {response}") failed_items = response.get("failed", []) if not failed_items: return errors_log = "" for i, error in enumerate(failed_items): errors_log += f" {i}| Item={events[i]} | Error={error}\n" events_count, failed_events_count = len(events), len(failed_items) logger.error( f"{APP_NAME}: {events_count - failed_events_count}/{events} were created.\n" f"The following {failed_events_count} items caused errors:\n{errors_log}" )