Merge pull request #1455 from GSA/notify-api-1454

change create notification to only insert once
This commit is contained in:
Carlo Costino
2024-12-03 17:51:13 -05:00
committed by GitHub
3 changed files with 28 additions and 11 deletions

View File

@@ -20,7 +20,10 @@ from app.dao.service_sms_sender_dao import dao_get_service_sms_senders_by_id
from app.dao.templates_dao import dao_get_template_by_id from app.dao.templates_dao import dao_get_template_by_id
from app.enums import JobStatus, KeyType, NotificationType from app.enums import JobStatus, KeyType, NotificationType
from app.errors import TotalRequestsError from app.errors import TotalRequestsError
from app.notifications.process_notifications import persist_notification from app.notifications.process_notifications import (
get_notification,
persist_notification,
)
from app.notifications.validators import check_service_over_total_message_limit from app.notifications.validators import check_service_over_total_message_limit
from app.serialised_models import SerialisedService, SerialisedTemplate from app.serialised_models import SerialisedService, SerialisedTemplate
from app.service.utils import service_allowed_to_send_to from app.service.utils import service_allowed_to_send_to
@@ -271,7 +274,7 @@ def save_email(
"Email {} failed as restricted service".format(notification_id) "Email {} failed as restricted service".format(notification_id)
) )
return return
original_notification = get_notification(notification_id)
try: try:
saved_notification = persist_notification( saved_notification = persist_notification(
template_id=notification["template"], template_id=notification["template"],
@@ -288,7 +291,8 @@ def save_email(
notification_id=notification_id, notification_id=notification_id,
reply_to_text=reply_to_text, reply_to_text=reply_to_text,
) )
# we only want to send once
if original_notification is None:
provider_tasks.deliver_email.apply_async( provider_tasks.deliver_email.apply_async(
[str(saved_notification.id)], queue=QueueNames.SEND_EMAIL [str(saved_notification.id)], queue=QueueNames.SEND_EMAIL
) )
@@ -329,6 +333,8 @@ def save_api_email_or_sms(self, encrypted_notification):
if notification["notification_type"] == NotificationType.EMAIL if notification["notification_type"] == NotificationType.EMAIL
else provider_tasks.deliver_sms else provider_tasks.deliver_sms
) )
original_notification = get_notification(notification["id"])
try: try:
persist_notification( persist_notification(
notification_id=notification["id"], notification_id=notification["id"],
@@ -347,9 +353,10 @@ def save_api_email_or_sms(self, encrypted_notification):
document_download_count=notification["document_download_count"], document_download_count=notification["document_download_count"],
) )
# Only get here if save to the db was successful (i.e. first time) # Only get here if save to the db was successful (i.e. first time)
if original_notification is None:
provider_task.apply_async([notification["id"]], queue=q) provider_task.apply_async([notification["id"]], queue=q)
current_app.logger.debug( current_app.logger.debug(
f"{notification['notification_type']} {notification['id']} has been persisted and sent to delivery queue." f"{notification['id']} has been persisted and sent to delivery queue."
) )
except IntegrityError: except IntegrityError:

View File

@@ -71,6 +71,11 @@ def dao_create_notification(notification):
# notify-api-742 remove phone numbers from db # notify-api-742 remove phone numbers from db
notification.to = "1" notification.to = "1"
notification.normalised_to = "1" notification.normalised_to = "1"
# notify-api-1454 insert only if it doesn't exist
stmt = select(Notification).where(Notification.id == notification.id)
result = db.session.execute(stmt).scalar()
if result is None:
db.session.add(notification) db.session.add(notification)

View File

@@ -8,6 +8,7 @@ from app.config import QueueNames
from app.dao.notifications_dao import ( from app.dao.notifications_dao import (
dao_create_notification, dao_create_notification,
dao_delete_notifications_by_id, dao_delete_notifications_by_id,
get_notification_by_id,
) )
from app.enums import KeyType, NotificationStatus, NotificationType from app.enums import KeyType, NotificationStatus, NotificationType
from app.errors import BadRequestError from app.errors import BadRequestError
@@ -53,6 +54,10 @@ def check_placeholders(template_object):
raise BadRequestError(fields=[{"template": message}], message=message) raise BadRequestError(fields=[{"template": message}], message=message)
def get_notification(notification_id):
return get_notification_by_id(notification_id)
def persist_notification( def persist_notification(
*, *,
template_id, template_id,