Refactoring the send to provider code out of the tasks folder

- building a rest endpoint to call that code to compliment the existing task based approach.
This commit is contained in:
Martyn Inglis
2016-09-21 13:27:32 +01:00
parent bd06b18684
commit 991cc884b4
5 changed files with 92 additions and 28 deletions

View File

@@ -31,6 +31,47 @@ def retry_iteration_to_delay(retry=0):
return delays.get(retry, 10)
@notify_celery.task(bind=True, name="deliver_sms", max_retries=5, default_retry_delay=5)
@statsd(namespace="tasks")
def deliver_sms(self, notification_id):
try:
send_to_providers.send_sms_to_provider(notification_id)
except Exception as e:
try:
current_app.logger.error(
"RETRY: SMS notification {} failed".format(notification_id)
)
current_app.logger.exception(e)
self.retry(queue="retry", countdown=retry_iteration_to_delay(self.request.retries))
except self.MaxRetriesExceededError:
current_app.logger.error(
"RETRY FAILED: task send_sms_to_provider failed for notification {}".format(notification_id),
e
)
update_notification_status_by_id(notification_id, 'technical-failure')
@notify_celery.task(bind=True, name="deliver_email", max_retries=5, default_retry_delay=5)
@statsd(namespace="tasks")
def deliver_email(self, notification_id):
try:
send_to_providers.send_email_response(notification_id)
except Exception as e:
try:
current_app.logger.error(
"RETRY: Email notification {} failed".format(notification_id)
)
current_app.logger.exception(e)
self.retry(queue="retry", countdown=retry_iteration_to_delay(self.request.retries))
except self.MaxRetriesExceededError:
current_app.logger.error(
"RETRY FAILED: task send_email_to_provider failed for notification {}".format(notification_id),
e
)
update_notification_status_by_id(notification_id, 'technical-failure')
@notify_celery.task(bind=True, name="send-sms-to-provider", max_retries=5, default_retry_delay=5)
@statsd(namespace="tasks")
def send_sms_to_provider(self, service_id, notification_id):

34
app/delivery/rest.py Normal file
View File

@@ -0,0 +1,34 @@
from flask import Blueprint, jsonify
from app.delivery import send_to_providers
from app.models import EMAIL_TYPE
from app.celery import provider_tasks
from sqlalchemy.orm.exc import NoResultFound
delivery = Blueprint('delivery', __name__)
from app.errors import (
register_errors,
InvalidRequest
)
register_errors(delivery)
@delivery.route('/deliver/notification/<uuid:notification_id>', methods=['POST'])
def send_notification_to_provider(notification_type, notification_id):
if notification_type == EMAIL_TYPE:
send_response(send_to_providers.send_email_response, provider_tasks.deliver_email, notification_id, 'send-email')
else:
send_response(send_to_providers.send_sms_response, provider_tasks.deliver_sms, notification_id, 'send-sms')
return jsonify({}), 204
def send_response(send_call, task_call, notification_id, queue):
try:
send_call(notification_id)
except NoResultFound as e:
raise InvalidRequest(e, status_code=404)
except Exception as e:
task_call.apply_async((str(notification_id)), queue=queue)

View File

@@ -20,10 +20,9 @@ from app.dao.templates_dao import dao_get_template_by_id
from app.models import SMS_TYPE, KEY_TYPE_TEST, BRANDING_ORG, EMAIL_TYPE
def send_sms_to_provider(notification_id):
notification = get_notification_by_id(notification_id)
def send_sms_to_provider(notification):
service = dao_fetch_service_by_id(notification.service_id)
provider = provider_to_use(SMS_TYPE, notification_id)
provider = provider_to_use(SMS_TYPE, notification.id)
if notification.status == 'created':
template_model = dao_get_template_by_id(notification.template_id, notification.template_version)
template = Template(
@@ -33,7 +32,7 @@ def send_sms_to_provider(notification_id):
)
if service.research_mode or notification.key_type == KEY_TYPE_TEST:
send_sms_response.apply_async(
(provider.get_name(), str(notification_id), notification.to), queue='research-mode'
(provider.get_name(), str(notification.id), notification.to), queue='research-mode'
)
notification.billable_units = 0
else: