"""Lambda module.""" import json from content_utils.exceptions import InvalidMessageException from content_utils.exceptions import NoProductDataException from content_utils.exceptions import NoReviewQueueItemDataException from content_utils.logging.logger import ContentLambdaLogger import sentry_sdk from sentry_sdk.integrations.aws_lambda import AwsLambdaIntegration from src import config from src.exceptions import ReviewQueueItemExplicitSkip from src.logic.event_handling import event_handler if config.SENTRY_DSN: sentry_sdk.init( dsn=config.SENTRY_DSN, environment=config.ENVIRONMENT, integrations=[AwsLambdaIntegration(timeout_warning=True)] ) def handler(event, context): """Lambda Entry point.""" content_lambda_logger = ContentLambdaLogger(config.app_logger) content_lambda_logger.logger.debug(event) if not event.get('Records'): content_lambda_logger.logger.info('SQS has no records') for record in event.get('Records'): try: content_lambda_logger.start() content_lambda_logger.set_data(event_key=f'sqs-{event.get("messageId")}') if not record.get('body'): raise InvalidMessageException('event missing "body"') msg_body = json.loads(record['body']) content_lambda_logger.set_data( queue_id=msg_body.get('review_queue_id', ''), product_id=msg_body.get('product_id', ''), operation=msg_body.get('operation') ) result = event_handler(msg_body) content_lambda_logger.set_data(status='success', result=result) except ( InvalidMessageException, NoReviewQueueItemDataException, NoProductDataException, ReviewQueueItemExplicitSkip ) as e: content_lambda_logger.set_data(status='skip', result=str(e)) except Exception as e: content_lambda_logger.set_data(status='error', result=str(e)) raise e finally: content_lambda_logger.end() return {'status': 'complete'}