"""Lambda redeem_voucher function module.""" from kafka import KafkaProducer from marshmallow import EXCLUDE from marshmallow import ValidationError import requests import config from config import app_logger as logger from src.schemas.redeem_voucher import RedeemVoucher class RedeemException(Exception): """Redeem Exception.""" pass class BadRequest(Exception): """Bad Request cannot retry Exception.""" pass def _send_message(event: dict): """Send message to an MSK topic.""" producer = KafkaProducer(**{ 'bootstrap_servers': config.BOOTSTRAP_SERVERS, 'security_protocol': 'SSL', 'client_id': config.CLIENT_ID, 'linger_ms': config.LINGER_MS, 'api_version': config.KAFKA_API_VERSION }) producer.send( config.TOPIC_NAME, RedeemVoucher().dumps(event).encode(), headers=[ ('voucher_code', event['voucher_code'].encode()), ('source_id', event['source_id'].encode()) ]) producer.flush() def handler(event, context): """Lambda entry point.""" try: input_data = event or {} parsed_event = RedeemVoucher().load(input_data, unknown=EXCLUDE) logger.info('Successfully validated the request.') voucher_code = parsed_event['voucher_code'] email = parsed_event['email'] source_id = parsed_event['source_id'] # prepare params and make a redeem request to Voucherify API headers = { 'X-App-Id': config.VOUCHERIFY_APPLICATION_ID, 'X-App-Token': config.VOUCHERIFY_CLIENT_SECRET, } data = { 'customer': { 'source_id': source_id, 'email': email } } url = config.VOUCHERIFY_URL_TEMPLATE.format(voucher_code=voucher_code) response = requests.post(url, json=data, headers=headers) if response.status_code != 200: logger.info( f'Error Voucherify API response ' f'status_code={response.status_code} ' f'error={response.text} ') raise RedeemException('Redeem error. Status: ', response.text) redeem_status = response.json().get('result') if redeem_status == 'SUCCESS': _send_message(parsed_event) else: raise RedeemException( 'Redeem unsuccesful. Status: ', response.text) except ValidationError as err: logger.error('Invalid request.', err.messages) raise BadRequest('Invalid request.', err.messages)