Create 'v2' get notifications route

Return multiple notifications for a service.
Choosing a page_size or a page_number is no longer allowed.
Instead, there is a `next` link included with will return the
next {default_page_size} notifications in the sequence.

Query parameters accepted are:

 - template_type: filter by specific template types
 - status: filter by specific statuses
 - older_than: return a chronological list of notifications older
   than this one. The notification with the id that is passed in
   is _not_ returned.

Note that both `template_type` and `status` can accept multiple
parameters.  Thus it is possible to call
`/v2/notifications?status=created&status=sending&status=delivered`
This commit is contained in:
Paul Craig
2016-11-23 11:44:38 +00:00
parent 1fce30aaa7
commit effbd315e0
3 changed files with 36 additions and 7 deletions

View File

@@ -1,7 +1,8 @@
from flask import jsonify
from flask import jsonify, request, url_for
from app import api_user
from app.dao import notifications_dao
from app.schemas import notifications_filter_schema
from app.v2.notifications import notification_blueprint
@@ -14,9 +15,30 @@ def get_notification_by_id(id):
return jsonify(notification.serialize()), 200
@notification_blueprint.route("/", methods=['GET'])
@notification_blueprint.route("", methods=['GET'])
def get_notifications():
# validate notifications request arguments
# fetch all notifications
# return notifications_response schema
pass
data = notifications_filter_schema.load(request.args).data
paginated_notifications = notifications_dao.get_notifications_for_service(
str(api_user.service_id),
filter_dict=data,
key_type=api_user.key_type,
personalisation=True,
older_than=data.get('older_than')
)
def _build_links(notifications):
_links = {
'current': url_for(".get_notifications", **request.args.to_dict(flat=False)),
}
if len(notifications):
next_query_params = dict(request.args.to_dict(flat=False), older_than=notifications[-1].id)
_links['next'] = url_for(".get_notifications", **next_query_params)
return _links
return jsonify(
notifications=[notification.serialize() for notification in paginated_notifications.items],
links=_build_links(paginated_notifications.items)
), 200