from aws_lambda_powertools import Logger from aws_lambda_powertools.utilities.data_classes import ( EventBridgeEvent, event_source, ) from aws_lambda_powertools.utilities.typing import LambdaContext from layercake.dateutils import now, ttl from layercake.dynamodb import ( DynamoDBPersistenceLayer, KeyPair, SortKey, TransactKey, ) from boto3clients import dynamodb_client from config import ( IUGU_ACCOUNT_ID, IUGU_API_TOKEN, IUGU_POSTBACK_URL, IUGU_TEST_MODE, ORDER_TABLE, ) from iugu import Credentials, Iugu, Order logger = Logger(__name__) dyn = DynamoDBPersistenceLayer(ORDER_TABLE, dynamodb_client) iugu = Iugu( Credentials( IUGU_ACCOUNT_ID, IUGU_API_TOKEN, test_mode=IUGU_TEST_MODE, ) ) @event_source(data_class=EventBridgeEvent) @logger.inject_lambda_context def lambda_handler(event: EventBridgeEvent, context: LambdaContext) -> bool: new_image = event.detail['new_image'] now_ = now() order_id = new_image['id'] r = dyn.collection.get_items( TransactKey(order_id) + SortKey('ADDRESS', rename_key='address') + SortKey('ITEMS', path_spec='items', rename_key='items') + SortKey('CREDIT_CARD#PAYMENT_INTENT', rename_key='credit_card'), flatten_top=False, ) payment_method = new_image['payment_method'] is_pix = payment_method == 'PIX' is_bank_slip = payment_method == 'BANK_SLIP' invoice = iugu.create_invoice( order=Order( address=r.get('address', {}), items=r.get('items', []), **new_image, ), postback_url=f'{IUGU_POSTBACK_URL}/{order_id}/postback', ) try: with dyn.transact_writer() as transact: transact.put( item={ 'id': order_id, 'sk': 'INVOICE', 'payment_method': payment_method, 'invoice_id': invoice['secure_id'], 'secure_url': invoice['secure_url'], 'created_at': now_, # Uncomment this when adding for multiple payment providers # 'payment_provider': 'iugu', } | ({'bank_slip': invoice['bank_slip']} if is_bank_slip else {}) | ({'pix': invoice['pix']} if is_pix else {}), cond_expr='attribute_not_exists(sk)', ) if 'credit_card' in r: transact.delete( key=KeyPair(order_id, 'CREDIT_CARD#PAYMENT_INTENT'), ) transact.put( item={ 'id': order_id, 'sk': 'TRANSACTION', 'invoice_id': invoice['secure_id'], 'credit_card': r['credit_card'], 'installments': int(new_image.get('installments', 1)), 'ttl': ttl(start_dt=now_, minutes=5), 'created_at': now_, }, cond_expr='attribute_not_exists(sk)', ) except Exception: pass return True