"""Lambda load-from-s3 function module.""" import pathlib import typing from lambdacommon.common_config import logger import pydantic from src import constants from src.models import LambdaResponse, S3Event from src.processors.banking_details import ( PostBankingDetailsProcessor, PullBankingDetailsProcessor, PurgeBankingDetailsProcessor, RegisterBankingDetailsProcessor, ) from src.processors.base import Processor from src.processors.manufactured_upcs import ManufacturedUpcsProcessor from src.processors.payment_hold import PaymentHoldProcessor, PaymentUnholdProcessor from src.processors.reports import ( GenerateReportBankingDetailsProcessor, GenerateReportNonUsTaxDetailsProcessor, GenerateReportTaxFormProcessor, ) from src.processors.tax_corrections import ( PostTaxCorrectionsProcessor, PostTaxCorrectionsVATProcessor, ) from src.processors.tax_details import ( PostGermanTaxDetailsProcessor, PostNorwayTaxDetailsProcessor, PostSpanishTaxDetailsProcessor, PostUkTaxDetailsProcessor, ) from src.processors.tax_forms import PostTaxFormsProcessor PROCESSORS: typing.Dict[str, type[Processor]] = { 'generate_report_banking_details': GenerateReportBankingDetailsProcessor, 'generate_report_non_us_tax_details': GenerateReportNonUsTaxDetailsProcessor, 'generate_report_tax_form': GenerateReportTaxFormProcessor, 'post_banking_details': PostBankingDetailsProcessor, 'pull_banking_details': PullBankingDetailsProcessor, 'post_german_tax_details': PostGermanTaxDetailsProcessor, 'post_norway_tax_details': PostNorwayTaxDetailsProcessor, 'post_payment_hold': PaymentHoldProcessor, 'post_payment_unhold': PaymentUnholdProcessor, 'post_spanish_tax_details': PostSpanishTaxDetailsProcessor, 'post_tax_corrections': PostTaxCorrectionsProcessor, 'post_tax_corrections_vat': PostTaxCorrectionsVATProcessor, 'post_tax_forms': PostTaxFormsProcessor, 'post_uk_tax_details': PostUkTaxDetailsProcessor, 'purge_banking_details': PurgeBankingDetailsProcessor, 'register_banking_details': RegisterBankingDetailsProcessor, 'sync_manufactured_upcs': ManufacturedUpcsProcessor, } def handler( event: typing.Dict[str, typing.Any], context: typing.Any ) -> typing.Dict[str, typing.Any]: """Lambda entry point.""" logger.info('Received event', extra={'event': event}) try: valid_event: S3Event = S3Event.model_validate(event) except pydantic.ValidationError as e: logger.info(f'Failed to parse event: {e.errors()}') raise e logger.info('Processing event', extra={'event': valid_event}) bucket_name = valid_event.records[0].s3.bucket.name key = valid_event.records[0].s3.object.key path = pathlib.PurePath(key) directory = str(path.parent) processor = PROCESSORS.get(directory) if not processor: message = f'The logic is not assigned for this directory: {directory}' logger.error(message) raise NotImplementedError(message) logger.info( f'Using {processor.__class__.__name__} ' f'processor for the {directory} directory' ) try: processor.execute(bucket_name, key) except Exception as e: logger.error(f'Error processing the file: {bucket_name}/{key}, {e}') raise e return LambdaResponse(status=constants.SUCCESS_STATUS).model_dump()