mirror of
https://github.com/GSA/notifications-api.git
synced 2025-12-22 08:21:13 -05:00
replacing get_earlier_provider_messages. The old function returned the previous references for earlier events for a broadcast_message. However, these depend on the message sent to a specific provider, so the function needs to change. It now takes in a provider, and only returns broadcast_provider_messages sent to that provider. If there are earlier broadcast_events without a provider_message for the chosen provider, it raises an exception - you cannot cancel a message if all the previous events have not been created properly (as we wouldn't know what references to cancel).
154 lines
4.1 KiB
Python
154 lines
4.1 KiB
Python
import json
|
|
|
|
import boto3
|
|
|
|
from app.config import BroadcastProvider
|
|
|
|
# The variable names in this file have specific meaning in a CAP message
|
|
#
|
|
# identifier is a unique field for each CAP message
|
|
#
|
|
# headline is a field which we are not sure if we will use
|
|
#
|
|
# description is the body of the message
|
|
|
|
# areas is a list of dicts, with the following items
|
|
# * description is a string which populates the areaDesc field
|
|
# * polygon is a list of lat/long pairs
|
|
#
|
|
# previous_provider_messages is a whitespace separated list of message identifiers
|
|
# where each identifier is a previous sent message
|
|
# ie a Cancel message would have a unique identifier but have the identifier of
|
|
# the preceeding Alert message in the previous_provider_messages field
|
|
|
|
|
|
class CBCProxyException(Exception):
|
|
pass
|
|
|
|
|
|
# Noop = no operation
|
|
class CBCProxyNoopClient:
|
|
|
|
def init_app(self, app):
|
|
pass
|
|
|
|
def send_canary(
|
|
self,
|
|
identifier,
|
|
):
|
|
pass
|
|
|
|
def send_link_test(
|
|
self,
|
|
identifier,
|
|
):
|
|
pass
|
|
|
|
def create_and_send_broadcast(
|
|
self,
|
|
identifier, headline, description, areas,
|
|
sent, expires,
|
|
):
|
|
pass
|
|
|
|
# We have not implementated updating a broadcast
|
|
def update_and_send_broadcast(
|
|
self,
|
|
identifier, previous_provider_messages, headline, description, areas,
|
|
sent, expires,
|
|
):
|
|
pass
|
|
|
|
# We have not implemented cancelling a broadcast
|
|
def cancel_broadcast(
|
|
self,
|
|
identifier, previous_provider_messages, headline, description, areas,
|
|
sent, expires,
|
|
):
|
|
pass
|
|
|
|
|
|
class CBCProxyClient:
|
|
provider_function_name_map = {
|
|
BroadcastProvider.EE: 'bt-ee-1-proxy',
|
|
}
|
|
|
|
def init_app(self, app):
|
|
self._lambda_client = boto3.client(
|
|
'lambda',
|
|
region_name='eu-west-2',
|
|
aws_access_key_id=app.config['CBC_PROXY_AWS_ACCESS_KEY_ID'],
|
|
aws_secret_access_key=app.config['CBC_PROXY_AWS_SECRET_ACCESS_KEY'],
|
|
)
|
|
|
|
def _invoke_lambda(self, function_name, payload):
|
|
payload_bytes = bytes(json.dumps(payload), encoding='utf8')
|
|
|
|
result = self._lambda_client.invoke(
|
|
FunctionName=function_name,
|
|
InvocationType='RequestResponse',
|
|
Payload=payload_bytes,
|
|
)
|
|
|
|
if result['StatusCode'] > 299:
|
|
raise CBCProxyException('Could not invoke lambda')
|
|
|
|
if 'FunctionError' in result:
|
|
raise CBCProxyException('Function exited with unhandled exception')
|
|
|
|
return result
|
|
|
|
def send_canary(
|
|
self,
|
|
identifier,
|
|
):
|
|
"""
|
|
canary - a specific lambda that does not connect to a provider, but just confirms the connectivity between
|
|
Notify and the CBC proxy AWS account
|
|
"""
|
|
self._invoke_lambda(function_name='canary', payload={'identifier': identifier})
|
|
|
|
def send_link_test(
|
|
self,
|
|
identifier,
|
|
):
|
|
"""
|
|
link test - open up a connection to a specific provider, and send them an xml payload with a <msgType> of
|
|
test.
|
|
"""
|
|
payload = {'message_type': 'test', 'identifier': identifier}
|
|
|
|
self._invoke_lambda(function_name='bt-ee-1-proxy', payload=payload)
|
|
|
|
def create_and_send_broadcast(
|
|
self,
|
|
identifier, headline, description, areas,
|
|
sent, expires,
|
|
):
|
|
payload = {
|
|
'message_type': 'alert',
|
|
'identifier': identifier,
|
|
'headline': headline,
|
|
'description': description,
|
|
'areas': areas,
|
|
'sent': sent,
|
|
'expires': expires,
|
|
}
|
|
self._invoke_lambda(function_name='bt-ee-1-proxy', payload=payload)
|
|
|
|
# We have not implementated updating a broadcast
|
|
def update_and_send_broadcast(
|
|
self,
|
|
identifier, previous_provider_messages, headline, description, areas,
|
|
sent, expires,
|
|
):
|
|
pass
|
|
|
|
# We have not implemented cancelling a broadcast
|
|
def cancel_broadcast(
|
|
self,
|
|
identifier, previous_provider_messages, headline, description, areas,
|
|
sent, expires,
|
|
):
|
|
pass
|