from aws_lambda_powertools.event_handler.exceptions import ( BadRequestError, ) from botocore.exceptions import ClientError from layercake.dateutils import now from layercake.dynamodb import ( ComposeKey, DynamoDBPersistenceLayer, KeyPair, TransactItems, ) def add_email( id: str, email: str, /, *, persistence_layer: DynamoDBPersistenceLayer, ): now_ = now() transact = TransactItems(persistence_layer.table_name) transact.update( key=KeyPair(id, '0'), update_expr='ADD emails :email', expr_attr_values={ ':email': {email}, }, ) transact.put( item={ 'id': id, 'sk': f'emails#{email}', 'email_primary': False, 'email_verified': False, 'create_date': now_, }, cond_expr='attribute_not_exists(sk)', ) transact.put( item={ 'id': 'email', 'sk': email, 'user_id': id, 'create_date': now_, }, cond_expr='attribute_not_exists(sk)', ) try: return persistence_layer.transact_write_items(transact) except ClientError: raise BadRequestError('Email already exists.') def del_email( id: str, email: str, /, *, persistence_layer: DynamoDBPersistenceLayer, ) -> bool: """Delete any email except the primary email.""" transact = TransactItems(persistence_layer.table_name) transact.delete( key=KeyPair('email', email), ) transact.delete( key=KeyPair(id, ComposeKey(email, prefix='emails')), cond_expr='email_primary <> :primary', expr_attr_values={':primary': True}, ) transact.update( key=KeyPair(id, '0'), update_expr='DELETE emails :email', expr_attr_values={ ':email': {email}, }, ) try: return persistence_layer.transact_write_items(transact) except ClientError: raise BadRequestError('Cannot remove the primary email.')