"""The main app logic.""" from typing import Dict from typing import Iterable from kafka_utils.consumer.deserializer.string import StringDeserializer from kafka_utils.consumer.deserializer.simple_json import JSONDeserializer from kafka_utils.consumer.source.mapping import EventSourceMessage from lambdacommon.common_config import logger import requests from src.common.api_request import get_api_request from src.common.api_request import get_api_response_handlers from src.common.types import BaseStoreAPI def handle_event(event: Dict, api: BaseStoreAPI): """Handle passed event.""" logger.info('The main handler.') for i, record in enumerate(_get_records(event)): logger.info(f'Start processing record #{i}.') api_request = get_api_request(record) raw_api_response = api.call( api_request.endpoint, api_request.endpoint_params) if _is_response_successful(raw_api_response): api_response = raw_api_response.json() record_handlers = get_api_response_handlers(api_request) for record_handler in record_handlers: record_handler(api_request, api_response) logger.info(f'Record #{i} was successfully processed.') else: _handle_unsuccessful_response(raw_api_response) def _get_records(event: Dict) -> Iterable[Dict]: """Flatten records from the source event.""" string_deserializer = StringDeserializer() json_deserializer = JSONDeserializer() for _, msk_message in EventSourceMessage(event): yield json_deserializer.deserialize( string_deserializer.deserialize(msk_message.value)) def _is_response_successful(response: requests.Response) -> bool: """Check if API call was successful.""" return response and response.status_code == 200 def _handle_unsuccessful_response(response: requests.Response): logger.error( f'Spotify API request failed with status code {response.status_code}.' f'{response.text}')