diff --git a/app/__init__.py b/app/__init__.py index 0c2734f77..8d8e18270 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -95,6 +95,7 @@ def register_blueprint(application): from app.notifications.receive_notifications import receive_notifications_blueprint from app.notifications.notifications_ses_callback import ses_callback_blueprint from app.notifications.notifications_sms_callback import sms_callback_blueprint + from app.notifications.notifications_letter_callback import letter_callback_blueprint from app.authentication.auth import requires_admin_auth, requires_auth, requires_no_auth from app.letters.send_letter_jobs import letter_job @@ -155,6 +156,9 @@ def register_blueprint(application): letter_job.before_request(requires_admin_auth) application.register_blueprint(letter_job) + letter_callback_blueprint.before_request(requires_no_auth) + application.register_blueprint(letter_callback_blueprint) + def register_v2_blueprints(application): from app.v2.notifications.post_notifications import v2_notification_blueprint as post_notifications diff --git a/app/notifications/notifications_letter_callback.py b/app/notifications/notifications_letter_callback.py new file mode 100644 index 000000000..f7c357055 --- /dev/null +++ b/app/notifications/notifications_letter_callback.py @@ -0,0 +1,39 @@ +from datetime import datetime + +from flask import ( + Blueprint, + jsonify, + request, + current_app, + json +) + +from app import statsd_client +from app.clients.email.aws_ses import get_aws_responses +from app.dao import ( + notifications_dao +) + +from app.notifications.process_client_response import validate_callback_data + +letter_callback_blueprint = Blueprint('notifications_letter_callback', __name__) + +from app.errors import ( + register_errors, + InvalidRequest +) + +register_errors(letter_callback_blueprint) + + +@letter_callback_blueprint.route('/notifications/letter/dvla', methods=['POST']) +def process_letter_response(): + try: + dvla_request = json.loads(request.data) + current_app.logger.info(dvla_request) + return jsonify( + result="success", message="DVLA callback succeeded" + ), 200 + except ValueError: + error = "DVLA callback failed: invalid json" + raise InvalidRequest(error, status_code=400) diff --git a/tests/app/notifications/rest/test_callbacks.py b/tests/app/notifications/rest/test_callbacks.py index c24bb76d3..780076b34 100644 --- a/tests/app/notifications/rest/test_callbacks.py +++ b/tests/app/notifications/rest/test_callbacks.py @@ -13,6 +13,16 @@ from app.models import NotificationStatistics from tests.app.conftest import sample_notification as create_sample_notification +def test_dvla_callback_should_not_need_auth(client): + data = json.dumps({"somekey": "somevalue"}) + response = client.post( + path='/notifications/letter/dvla', + data=data, + headers=[('Content-Type', 'application/json')]) + + assert response.status_code == 200 + + def test_firetext_callback_should_not_need_auth(client, mocker): mocker.patch('app.statsd_client.incr') response = client.post(