mirror of
https://github.com/GSA/notifications-api.git
synced 2025-12-22 16:31:15 -05:00
This removes 3 duplicate instances of the same code, which is still
tested implicitly via test_process_ses_receipt_tasks [1]. In the
next commit we'll make this test more explicit, to reflect that it's
now being reused elsewhere and shouldn't change arbitrarily.
We do lose the "print" statement from the command instance of the
code, but I think that's a very tolerable loss.
[1]: 16ec8ccb8a/tests/app/celery/test_process_ses_receipts_tasks.py (L94)
86 lines
3.5 KiB
Python
86 lines
3.5 KiB
Python
from flask import current_app
|
|
|
|
from app.celery.service_callback_tasks import (
|
|
create_complaint_callback_data,
|
|
create_delivery_status_callback_data,
|
|
send_complaint_to_service,
|
|
send_delivery_status_to_service,
|
|
)
|
|
from app.config import QueueNames
|
|
from app.dao.complaint_dao import save_complaint
|
|
from app.dao.notifications_dao import (
|
|
dao_get_notification_or_history_by_reference,
|
|
)
|
|
from app.dao.service_callback_api_dao import (
|
|
get_service_complaint_callback_api_for_service,
|
|
get_service_delivery_status_callback_api_for_service,
|
|
)
|
|
from app.models import Complaint
|
|
|
|
|
|
def determine_notification_bounce_type(notification_type, ses_message):
|
|
remove_emails_from_bounce(ses_message)
|
|
if ses_message['bounce']['bounceType'] == 'Permanent':
|
|
notification_type = ses_message['bounce']['bounceType'] # permanent or not
|
|
else:
|
|
notification_type = 'Temporary'
|
|
return notification_type, ses_message
|
|
|
|
|
|
def handle_complaint(ses_message):
|
|
recipient_email = remove_emails_from_complaint(ses_message)[0]
|
|
current_app.logger.info("Complaint from SES: \n{}".format(ses_message))
|
|
try:
|
|
reference = ses_message['mail']['messageId']
|
|
except KeyError as e:
|
|
current_app.logger.exception("Complaint from SES failed to get reference from message", e)
|
|
return
|
|
notification = dao_get_notification_or_history_by_reference(reference)
|
|
ses_complaint = ses_message.get('complaint', None)
|
|
|
|
complaint = Complaint(
|
|
notification_id=notification.id,
|
|
service_id=notification.service_id,
|
|
ses_feedback_id=ses_complaint.get('feedbackId', None) if ses_complaint else None,
|
|
complaint_type=ses_complaint.get('complaintFeedbackType', None) if ses_complaint else None,
|
|
complaint_date=ses_complaint.get('timestamp', None) if ses_complaint else None
|
|
)
|
|
save_complaint(complaint)
|
|
return complaint, notification, recipient_email
|
|
|
|
|
|
def remove_mail_headers(dict_to_edit):
|
|
if dict_to_edit['mail'].get('headers'):
|
|
dict_to_edit['mail'].pop('headers')
|
|
if dict_to_edit['mail'].get('commonHeaders'):
|
|
dict_to_edit['mail'].pop('commonHeaders')
|
|
|
|
|
|
def remove_emails_from_bounce(bounce_dict):
|
|
remove_mail_headers(bounce_dict)
|
|
bounce_dict['mail'].pop('destination')
|
|
bounce_dict['bounce'].pop('bouncedRecipients')
|
|
|
|
|
|
def remove_emails_from_complaint(complaint_dict):
|
|
remove_mail_headers(complaint_dict)
|
|
complaint_dict['complaint'].pop('complainedRecipients')
|
|
return complaint_dict['mail'].pop('destination')
|
|
|
|
|
|
def check_and_queue_callback_task(notification):
|
|
# queue callback task only if the service_callback_api exists
|
|
service_callback_api = get_service_delivery_status_callback_api_for_service(service_id=notification.service_id)
|
|
if service_callback_api:
|
|
notification_data = create_delivery_status_callback_data(notification, service_callback_api)
|
|
send_delivery_status_to_service.apply_async([str(notification.id), notification_data],
|
|
queue=QueueNames.CALLBACKS)
|
|
|
|
|
|
def _check_and_queue_complaint_callback_task(complaint, notification, recipient):
|
|
# queue callback task only if the service_callback_api exists
|
|
service_callback_api = get_service_complaint_callback_api_for_service(service_id=notification.service_id)
|
|
if service_callback_api:
|
|
complaint_data = create_complaint_callback_data(complaint, notification, service_callback_api, recipient)
|
|
send_complaint_to_service.apply_async([complaint_data], queue=QueueNames.CALLBACKS)
|