From 0e5ea849b90d02504366cbac1bdf3ff7f8f7c2e1 Mon Sep 17 00:00:00 2001 From: jimmoffet Date: Wed, 28 Sep 2022 13:26:21 -0400 Subject: [PATCH] latest --- .gitignore | 1 + Makefile | 5 +- app/notifications/receive_notifications.py | 56 ++++++++++++++++++++++ requirements.in | 3 +- requirements.txt | 2 +- 5 files changed, 63 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 220a2d3b2..4edc8e0d2 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ queues.csv __pycache__/ *.py[cod] +.venv/ venv/ venv-freeze/ diff --git a/Makefile b/Makefile index 18caff76d..9761abb2e 100644 --- a/Makefile +++ b/Makefile @@ -71,6 +71,7 @@ test: ## Run tests freeze-requirements: ## Pin all requirements including sub dependencies into requirements.txt pip install --upgrade pip-tools pip-compile requirements.in + pip install -r requirements.txt .PHONY: audit audit: @@ -137,11 +138,11 @@ cf-deploy-api-db-migration: cf push notifications-api --no-route -f ${CF_MANIFEST_PATH} rm ${CF_MANIFEST_PATH} - cf run-task notifications-api --command="flask db upgrade" --name api_db_migration + cf run-task notify-api-alt --command="flask db upgrade" --name api_db_migration .PHONY: cf-check-api-db-migration-task cf-check-api-db-migration-task: ## Get the status for the last notifications-api task - @cf curl /v3/apps/`cf app --guid notifications-api`/tasks?order_by=-created_at | jq -r ".resources[0].state" + @cf curl /v3/apps/`cf app --guid notify-api-alt`/tasks?order_by=-created_at | jq -r ".resources[0].state" .PHONY: cf-rollback cf-rollback: ## Rollbacks the app to the previous release diff --git a/app/notifications/receive_notifications.py b/app/notifications/receive_notifications.py index 72103c20f..7b6987ac3 100644 --- a/app/notifications/receive_notifications.py +++ b/app/notifications/receive_notifications.py @@ -23,6 +23,62 @@ INBOUND_SMS_COUNTER = Counter( ['provider'] ) +@receive_notifications_blueprint.route('/notifications/sms/receive/sns', methods=['POST']) +def receive_sns_sms(): + """ + { + "originationNumber":"+14255550182", + "destinationNumber":"+12125550101", + "messageKeyword":"JOIN", # this is optional + "messageBody":"EXAMPLE", + "inboundMessageId":"cae173d2-66b9-564c-8309-21f858e9fb84", + "previousPublishedMessageId":"wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" + } + """ + + post_data = request.get_json() + + # validate sns from common module, WILL ALSO NEED TO AUTO-SUBSCRIBE... raise errors appropriately + + # TODO modify this for AWS SNS + inbound_number = strip_leading_forty_four(post_data['Number']) + + service = fetch_potential_service(inbound_number, 'sns') + if not service: + # since this is an issue with our service <-> number mapping, or no inbound_sms service permission + # we should still tell SNS that we received it successfully + current_app.logger.warning(f"Mapping between service id and inbound number is broken, or service does not have permission to receive inbound sms") + return jsonify({ + "status": "ok" + }), 200 + + INBOUND_SMS_COUNTER.labels("sns").inc() + + content = format_mmg_message(post_data["Message"]) + from_number = post_data['MSISDN'] + provider_ref = post_data["ID"] + date_received = post_data.get('DateRecieved') + provider_name = "sns" + + inbound_payload = {} + + # TODO fill inbound_payload and spread like create_inbound_sms_object(service, **inbound_payload) + inbound = create_inbound_sms_object(service, + content=format_mmg_message(post_data["Message"]), + from_number=from_number, + provider_ref=provider_ref, + date_received=date_received, + provider_name=provider_name) + + # TODO ensure inbound sms callback endpoints are accessible and functioning for notify api users + # tasks.send_inbound_sms_to_service.apply_async([str(inbound.id), str(service.id)], queue=QueueNames.NOTIFY) + + current_app.logger.debug( + '{} received inbound SMS with reference {} from SNS'.format(service.id, inbound.provider_reference)) + + return jsonify({ + "status": "ok" + }), 200 @receive_notifications_blueprint.route('/notifications/sms/receive/mmg', methods=['POST']) def receive_mmg_sms(): diff --git a/requirements.in b/requirements.in index 615065db4..5ef7876a0 100644 --- a/requirements.in +++ b/requirements.in @@ -6,7 +6,7 @@ celery[sqs]==5.2.6 Flask-Bcrypt==1.0.1 flask-marshmallow==0.14.0 Flask-Migrate==3.1.0 -Flask-SQLAlchemy==2.5.1 +git+https://github.com/pallets-eco/flask-sqlalchemy.git@aa7a61a5357cf6f5dcc135d98c781192457aa6fa#egg=Flask-SQLAlchemy==2.5.1 Flask==2.1.2 click-datetime==0.2 # Should be pinned until a new gunicorn release greater than 20.1.0 comes out. (Due to eventlet v0.33 compatibility issues) @@ -25,6 +25,7 @@ lxml==4.9.1 defusedxml==0.7.1 Werkzeug==2.1.1 python-dotenv==0.20.0 +oscrypto notifications-python-client==6.3.0 diff --git a/requirements.txt b/requirements.txt index 3982ed643..154c1c908 100644 --- a/requirements.txt +++ b/requirements.txt @@ -99,7 +99,7 @@ flask-migrate==3.1.0 # via -r requirements.in flask-redis==0.4.0 # via notifications-utils -flask-sqlalchemy==2.5.1 +flask-sqlalchemy @ git+https://github.com/pallets-eco/flask-sqlalchemy.git@aa7a61a5357cf6f5dcc135d98c781192457aa6fa # via # -r requirements.in # flask-migrate