"""Lambda module.""" from content_utils.exceptions import InvalidMessageException from content_utils.logging.logger import ContentLambdaLogger import sentry_sdk from sentry_sdk.integrations.aws_lambda import AwsLambdaIntegration from src import config from src import constants from src.logic import s3 from src.logic import validate if config.SENTRY_DSN: sentry_sdk.init( dsn=config.SENTRY_DSN, environment=config.ENVIRONMENT, integrations=[AwsLambdaIntegration(timeout_warning=True)] ) lambda_logger = ContentLambdaLogger(config.app_logger) def validate_product_logic(payload): """Validate product logic.""" if payload is None: raise InvalidMessageException(constants.ERROR_MISSING_METADATA) return validate.validate_product(payload) def handler(event, context): """Lambda Entry point.""" response = { 'validations': None, 'failed_validations': None, } data = event.get('data') lambda_logger.start() lambda_logger.set_data( queue_id=data.get('review_queue_id'), product_id=data.get('product_id') ) lambda_logger.logger.debug(event) try: product_metadata = data.get('product_metadata') if product_metadata is None: s3_url = data.get('product_metadata_s3_url') if s3_url: product_metadata = s3.fetch_product_metadata(s3_url) result = validate_product_logic(product_metadata) response.update({ 'validations': result.get('is_valid') and constants.PASS or constants.FAIL, 'failed_validations': result.get('failed_validations') }) lambda_logger.set_data(status='success', result=constants.SUCCESS_VALIDATION_COMPLETE) except Exception as e: lambda_logger.set_data(status='error', result=f'{e}\n{event}') raise e finally: lambda_logger.end() return response