Files
notifications-api/app/v2/notifications/get_notifications.py
T

89 lines
2.9 KiB
Python
Raw Normal View History

2023-03-02 20:20:31 -05:00
from flask import current_app, jsonify, request, url_for
2019-09-03 16:49:03 +01:00
from app import api_user, authenticated_service
2024-01-18 10:03:35 -08:00
from app.aws.s3 import get_personalisation_from_s3
2016-11-18 17:36:11 +00:00
from app.dao import notifications_dao
2016-11-28 14:22:51 +00:00
from app.schema_validation import validate
from app.v2.notifications import v2_notification_blueprint
2021-03-10 13:55:06 +00:00
from app.v2.notifications.notification_schemas import (
get_notifications_request,
notification_by_id,
)
2023-08-29 14:54:30 -07:00
@v2_notification_blueprint.route("/<notification_id>", methods=["GET"])
def get_notification_by_id(notification_id):
_data = {"notification_id": notification_id}
validate(_data, notification_by_id)
2016-11-18 17:36:11 +00:00
notification = notifications_dao.get_notification_with_personalisation(
authenticated_service.id, notification_id, key_type=None
2016-11-18 17:36:11 +00:00
)
2024-01-22 10:55:09 -08:00
notification.personalisation = get_personalisation_from_s3(
notification.service_id,
notification.job_id,
notification.job_row_number,
)
return jsonify(notification.serialize()), 200
2016-11-18 17:36:11 +00:00
2019-09-03 16:49:03 +01:00
2023-08-29 14:54:30 -07:00
@v2_notification_blueprint.route("", methods=["GET"])
def get_notifications():
2016-11-28 14:22:51 +00:00
_data = request.args.to_dict(flat=False)
# flat=False makes everything a list, but we only ever allow one value for "older_than"
2023-08-29 14:54:30 -07:00
if "older_than" in _data:
_data["older_than"] = _data["older_than"][0]
2016-11-28 14:22:51 +00:00
# and client reference
2023-08-29 14:54:30 -07:00
if "reference" in _data:
_data["reference"] = _data["reference"][0]
2023-08-29 14:54:30 -07:00
if "include_jobs" in _data:
_data["include_jobs"] = _data["include_jobs"][0]
2016-11-28 14:22:51 +00:00
data = validate(_data, get_notifications_request)
2016-11-23 11:44:38 +00:00
paginated_notifications = notifications_dao.get_notifications_for_service(
str(authenticated_service.id),
2016-11-23 11:44:38 +00:00
filter_dict=data,
key_type=api_user.key_type,
personalisation=True,
2023-08-29 14:54:30 -07:00
older_than=data.get("older_than"),
client_reference=data.get("reference"),
page_size=current_app.config.get("API_PAGE_SIZE"),
include_jobs=data.get("include_jobs"),
count_pages=False,
2016-11-23 11:44:38 +00:00
)
2024-01-18 10:03:35 -08:00
for notification in paginated_notifications.items:
if notification.job_id is not None:
notification.personalisation = get_personalisation_from_s3(
2024-01-19 08:58:24 -08:00
notification.service_id,
notification.job_id,
notification.job_row_number,
)
2024-01-18 10:03:35 -08:00
2016-11-23 11:44:38 +00:00
def _build_links(notifications):
_links = {
2023-08-29 14:54:30 -07:00
"current": url_for(".get_notifications", _external=True, **data),
2016-11-23 11:44:38 +00:00
}
if len(notifications):
2016-11-28 14:22:51 +00:00
next_query_params = dict(data, older_than=notifications[-1].id)
2023-08-29 14:54:30 -07:00
_links["next"] = url_for(
".get_notifications", _external=True, **next_query_params
)
2016-11-23 11:44:38 +00:00
return _links
2023-08-29 14:54:30 -07:00
return (
jsonify(
notifications=[
notification.serialize()
for notification in paginated_notifications.items
],
links=_build_links(paginated_notifications.items),
),
200,
)