2022-10-03 17:16:59 -07:00
|
|
|
import enum
|
|
|
|
|
from datetime import timedelta
|
2017-03-16 18:15:49 +00:00
|
|
|
|
2022-10-03 17:16:59 -07:00
|
|
|
from flask import Blueprint, current_app, json, jsonify, request
|
|
|
|
|
|
|
|
|
|
from app.celery.process_ses_receipts_tasks import process_ses_results
|
2018-03-16 14:00:49 +00:00
|
|
|
from app.celery.service_callback_tasks import (
|
2021-03-10 13:55:06 +00:00
|
|
|
create_complaint_callback_data,
|
2018-07-18 17:03:16 +01:00
|
|
|
create_delivery_status_callback_data,
|
2021-03-10 13:55:06 +00:00
|
|
|
send_complaint_to_service,
|
|
|
|
|
send_delivery_status_to_service,
|
2018-03-16 14:00:49 +00:00
|
|
|
)
|
2017-12-01 21:13:01 +00:00
|
|
|
from app.config import QueueNames
|
2021-03-10 13:55:06 +00:00
|
|
|
from app.dao.complaint_dao import save_complaint
|
2022-09-15 14:59:13 -07:00
|
|
|
from app.dao.notifications_dao import dao_get_notification_history_by_reference
|
2021-03-10 13:55:06 +00:00
|
|
|
from app.dao.service_callback_api_dao import (
|
|
|
|
|
get_service_complaint_callback_api_for_service,
|
|
|
|
|
get_service_delivery_status_callback_api_for_service,
|
|
|
|
|
)
|
2022-10-03 17:16:59 -07:00
|
|
|
from app.errors import InvalidRequest
|
2021-03-10 13:55:06 +00:00
|
|
|
from app.models import Complaint
|
2022-09-15 14:59:13 -07:00
|
|
|
from app.notifications.callbacks import create_complaint_callback_data
|
2022-10-03 17:16:59 -07:00
|
|
|
from app.notifications.sns_handlers import sns_notification_handler
|
2022-09-15 14:59:13 -07:00
|
|
|
|
2022-10-03 17:16:59 -07:00
|
|
|
ses_callback_blueprint = Blueprint('notifications_ses_callback', __name__)
|
|
|
|
|
DEFAULT_MAX_AGE = timedelta(days=10000)
|
2022-09-15 14:59:13 -07:00
|
|
|
|
2022-10-03 17:16:59 -07:00
|
|
|
# 400 counts as a permanent failure so SNS will not retry.
|
|
|
|
|
# 500 counts as a failed delivery attempt so SNS will retry.
|
|
|
|
|
# See https://docs.aws.amazon.com/sns/latest/dg/DeliveryPolicies.html#DeliveryPolicies
|
|
|
|
|
@ses_callback_blueprint.route('/notifications/email/ses', methods=['POST'])
|
|
|
|
|
def email_ses_callback_handler():
|
2018-06-04 17:29:58 +01:00
|
|
|
try:
|
2022-10-03 17:16:59 -07:00
|
|
|
data = sns_notification_handler(request.data, request.headers)
|
2022-10-03 20:07:42 -07:00
|
|
|
except InvalidRequest as e:
|
|
|
|
|
return jsonify(
|
|
|
|
|
result="error", message=str(e.message)
|
|
|
|
|
), e.status_code
|
2022-10-03 17:16:59 -07:00
|
|
|
|
|
|
|
|
message = data.get("Message")
|
|
|
|
|
if "mail" in message:
|
|
|
|
|
process_ses_results.apply_async([{"Message": message}], queue=QueueNames.NOTIFY)
|
|
|
|
|
|
|
|
|
|
return jsonify(
|
|
|
|
|
result="success", message="SES-SNS callback succeeded"
|
|
|
|
|
), 200
|