Source code for backend.notification

"""
notification.py
===============
Endpoints for operations related to matching users. All routes start with
/api/notification
All incoming request parameters are wrapped in a JSON body.
All outgoing response returns are wrapped in a JSON entry with key 'payload',
like this:

.. code-block::

    {
      "error": "false",
      "error-msg": None,
        "payload": {
        "return-1": "true"
      }
    }


Note that method documentation assumes you are using jsonResponse/errorResponse
to generate the response, and only shows the actual returns within payload.
Ditto for request parameters.
"""
import functools
from flask import (
    Blueprint, flash, g, redirect, render_template, request, session, url_for, current_app
)
import flask
from werkzeug.security import check_password_hash, generate_password_hash

import json
import datetime
from form_response import *

bp = Blueprint('notification', __name__, url_prefix='/api/notification')

[docs]@bp.route('/add', methods=('GET', 'POST')) def add(): """ POST get currently pending notifications Parameters ---------- uid: str UID to set the notification for notification: Notification Notification object (see notes) Returns ------- notifications: list(Notification) Notes ----- the Notification object is structure as the following: .. code-block:: { msg: str notificationId: str createDate: timestamp read: bool type: "INITIATE" or "MESSAGE" from: str to: uid } Raises ------ BadRequest Some part of the required parameters is missing. """ redis_client = current_app.config['RDSCXN'] if request.method == 'POST': data = request.get_json() if not data: error = 'Data Body Required' return errorResponse(error) uid = data['uid'] if 'uid' in data.keys() else None notification = data['notification'] if 'notification' in data.keys() else None if uid is None: error = 'uid is required.' return errorResponse(error) elif notification is None: error = 'bytes is required.' return errorResponse(error) for entry in ['msg', 'createdDate', 'read', 'type', 'from', 'to']: if entry not in notification.keys(): error = '{} field in notification is required'.format(entry) return errorResponse(error) next_nid = redis_client.get('next_nid') redis_client.incr('next_nid') redis_client.hmset("notif{}".format(next_nid), {'from': notification['from'], 'to': notification['to'], 'msg': notification['msg'], 'createdDate': notification['createdDate'], 'type': notification['type'], 'read': 1 if notification['read'] else 0, 'notificationID': next_nid}) redis_client.rpush("notifications{}".format(uid), next_nid) return jsonResponse() return jsonResponse()
[docs]@bp.route('/get', methods=('GET', 'POST')) def get(): """ POST get currently pending notifications Parameters ---------- uid: str UID for the user requesting notifications Returns ------- notifications: list(Notification) Notes ----- the Notification objects returned by this endpoint each additionally contain a notificationId, which uniquely identifies them. See Also -------- backend.notification.add: implementation of Notification """ redis_client = current_app.config['RDSCXN'] if request.method == 'POST': data = request.get_json() if not data: error = 'Data Body Required' return errorResponse(error) uid = data['uid'] if 'uid' in data.keys() else None if uid is None: error = 'uid is required.' return errorResponse(error) nids = redis_client.lrange('notifications{}'.format(uid), 0, -1) notifs = [] for nid in nids: notif = redis_client.hgetall("notif{}".format(nid)) notif['read'] = notif['read'] == '1' notif['createdDate'] = int(notif['createdDate']) notifs.append(notif) return jsonResponse({'notification': notifs}) return jsonResponse()
[docs]@bp.route('/delete', methods=('GET', 'POST')) def delete(): """ POST delete a given notification Parameters ---------- uid: str notificationId: str Notes ----- Method returns an empty object on success. See Also -------- backend.notification.get: notificationId """ redis_client = current_app.config['RDSCXN'] if request.method == 'POST': data = request.get_json() if not data: error = 'Data Body Required' return errorResponse(error) uid = data['uid'] if 'uid' in data.keys() else None notificationID = data['notificationID'] if 'notificationID' in data.keys() else None if uid is None: error = 'uid is required.' return errorResponse(error) if notificationID is None: error = 'notificationID is required.' return errorResponse(error) user_notifications = redis_client.lrange("notifications{}".format(uid), 0, -1) if notificationID not in user_notifications: error = 'User with UID {} does not have notification with ID {}'.format(uid, notificationID) return errorResponse(error) redis_client.lrem("notifications{}".format(uid), 0, notificationID) redis_client.delete("notif{}".format(notificationID)) return jsonResponse() return jsonResponse()