Getting the IntegrityErrors to be OK if the data already exists in the

DB.

Signed-off-by: Cliff Hill <Clifford.hill@gsa.gov>
This commit is contained in:
Cliff Hill
2024-12-23 11:17:51 -05:00
parent d5e1008b19
commit 46ec1aafa8
3 changed files with 37 additions and 24 deletions

View File

@@ -23,6 +23,7 @@ from app.enums import JobStatus, KeyType, NotificationType
from app.errors import TotalRequestsError from app.errors import TotalRequestsError
from app.notifications.process_notifications import ( from app.notifications.process_notifications import (
get_notification, get_notification,
notification_exists,
persist_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
@@ -218,6 +219,7 @@ def save_sms(self, service_id, notification_id, encrypted_notification, sender_i
job = dao_get_job_by_id(job_id) job = dao_get_job_by_id(job_id)
created_by_id = job.created_by_id created_by_id = job.created_by_id
try:
saved_notification = persist_notification( saved_notification = persist_notification(
template_id=notification["template"], template_id=notification["template"],
template_version=notification["template_version"], template_version=notification["template_version"],
@@ -234,6 +236,11 @@ def save_sms(self, service_id, notification_id, encrypted_notification, sender_i
notification_id=notification_id, notification_id=notification_id,
reply_to_text=reply_to_text, reply_to_text=reply_to_text,
) )
except IntegrityError as e:
if notification_exists(notification_id):
saved_notification = get_notification(notification_id)
else:
raise
# Kick off sns process in provider_tasks.py # Kick off sns process in provider_tasks.py
sn = saved_notification sn = saved_notification
@@ -247,11 +254,8 @@ def save_sms(self, service_id, notification_id, encrypted_notification, sender_i
) )
current_app.logger.debug( current_app.logger.debug(
"SMS {} created at {} for job {}".format( f"SMS {saved_notification.id} created at {saved_notification.created_at} "
saved_notification.id, f"for job {notification.get('job', None)}"
saved_notification.created_at,
notification.get("job", None),
)
) )
except SQLAlchemyError as e: except SQLAlchemyError as e:

View File

@@ -65,6 +65,12 @@ def dao_get_last_date_template_was_used(template_id, service_id):
return last_date return last_date
def dao_notification_exists(notification_id) -> bool:
stmt = select(Notification).where(Notification.id == notification_id)
result = db.session.execute(stmt).scalar()
return result is not None
@autocommit @autocommit
def dao_create_notification(notification): def dao_create_notification(notification):
if not notification.id: if not notification.id:
@@ -86,9 +92,7 @@ def dao_create_notification(notification):
notification.normalised_to = "1" notification.normalised_to = "1"
# notify-api-1454 insert only if it doesn't exist # notify-api-1454 insert only if it doesn't exist
stmt = select(Notification).where(Notification.id == notification.id) if not dao_notification_exists(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,
dao_notification_exists,
get_notification_by_id, get_notification_by_id,
) )
from app.enums import KeyType, NotificationStatus, NotificationType from app.enums import KeyType, NotificationStatus, NotificationType
@@ -153,6 +154,10 @@ def persist_notification(
return notification return notification
def notification_exists(notification_id):
return dao_notification_exists(notification_id)
def send_notification_to_queue_detached( def send_notification_to_queue_detached(
key_type, notification_type, notification_id, queue=None key_type, notification_type, notification_id, queue=None
): ):