"""Lambda create_subscription function module.""" import config from config import app_logger as logger from marshmallow import EXCLUDE from marshmallow import ValidationError from src.schemas.create_subscription import CreateSubscriptionSchema class RetryException(Exception): """Retry Exception.""" pass class BadRequest(Exception): """Bad Request cannot retry Exception.""" pass def create_subscription(vendor_uuid, identity_id, subscription): """Create subscription for user.""" request_json = { 'follow_all_resources': False, 'automatic': True, 'follow_resources': [vendor_uuid] } result = config.ows_client.put( config.OWS_SERVICE_NAME, config.OWS_SERVICE_ENDPOINT.format(identity_id, subscription), json=request_json, headers=config.OWS_REQUEST_HEADERS, ) if 400 <= result.status_code < 500: logger.info( f'Error ows response status_code={result.status_code}' f' error={result.text} ') raise BadRequest( 'Invalid request when editing {}.'.format(subscription), result.text) elif result.status_code >= 300: logger.info( f'Error ows response status_code={result.status_code}' f' error={result.text} ') raise RetryException( 'Ows Request failed for valid request, so retry.', result.text) result = result.json() return result.get('edit_subscription') def handler(event, context): """Lambda entry point.""" try: input_data = event or {} result = CreateSubscriptionSchema().load(input_data, unknown=EXCLUDE) identity_id = result['identity_id'] vendor_uuid = result['vendor_uuid'] logger.info( f'Successfully validated the request for {identity_id} ' 'Now calling create_subscription.') rejection = create_subscription( vendor_uuid, identity_id, 'email_notification_rejection') approval = create_subscription( vendor_uuid, identity_id, 'email_notification_new_release') return { 'rejection': rejection, 'approval': approval } except ValidationError as err: logger.error('Invalid request.', err.messages) raise BadRequest('Invalid request.', err.messages)