from typing import Any, Dict, List, Union from smelog.factory import BoundLogger from apollo_playlists_messages.clients.apollo_api import ApolloApiClient from apollo_playlists_messages.clients.gate_api import GateApiClient from apollo_playlists_messages.clients.user_data_api import UserDataClient from apollo_playlists_messages.config import EVENT, FULL_APP_NAME from apollo_playlists_messages.handlers import get_event_handler from apollo_playlists_messages.schemas.events_full import EVENT_CODE_TO_FULL_SCHEMA from apollo_playlists_messages.utils.input import parse_full_events, parse_raw_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 """ event_handler = get_event_handler(EVENT) schema = EVENT_CODE_TO_FULL_SCHEMA[EVENT]() logger.info(f"1. {FULL_APP_NAME} was triggered by an input event\nEvent: {event}") events = parse_raw_input(logger, event) if not events: return logger.info(f"2. {FULL_APP_NAME} has parsed {len(events)} raw events \nEvents: {events}") user_data_api = UserDataClient() apollo_api = ApolloApiClient() gate_api = GateApiClient() events = parse_full_events(logger, user_data_api.get_events_list(ids=[e["id"] for e in events]), schema=schema) if not events: return logger.info(f"3. {FULL_APP_NAME} has parsed {len(events)} full events \nEvents: {events}") ignored_playlists = apollo_api.get_blacklisted_playlists() logger.info(f"4. {FULL_APP_NAME} got {len(ignored_playlists)} ignored playlists \nPlaylists: {ignored_playlists}") messages = event_handler(events=events, ignored_playlists=ignored_playlists, gate_api=gate_api, logger=logger) messages_count = len(messages) logger.info(f"4. {FULL_APP_NAME} has formatted {messages_count} messages to create.") if not messages_count: return response = user_data_api.post_messages(data=messages) logger.info( f"5. {FULL_APP_NAME} user_data_api returned {len(response.get('ok', []))}/{messages_count} " f"successful and {len(response.get('failed', []))}/{messages_count} failed items." )