Kenneth Bruen
3 years ago
5 changed files with 167 additions and 3 deletions
@ -0,0 +1,60 @@
|
||||
from datetime import datetime |
||||
from flask.views import MethodView |
||||
from flask_smorest import Blueprint |
||||
from marshmallow import Schema, fields |
||||
|
||||
from ..db_utils import get_notifications, insert_notification, mark_notification_as_read, whose_notification |
||||
from ..decorators import ensure_logged_in |
||||
from ..models import Notification |
||||
from .. import decorators, returns |
||||
|
||||
bp = Blueprint('notifications', __name__, description='Notifications operations') |
||||
|
||||
@bp.post('/<int:notification_id>/mark_read') |
||||
@ensure_logged_in |
||||
@bp.response(401, returns.ErrorSchema, description='Login failure or not allowed') |
||||
@bp.doc(security=[{'Token': []}]) |
||||
@bp.response(201, description='Successfully marked as read') |
||||
def mark_as_read(notification_id: int): |
||||
"""Mark notification as read""" |
||||
if decorators.user_id != whose_notification(notification_id): |
||||
return returns.abort(returns.UNAUTHORIZED) |
||||
mark_notification_as_read(notification_id) |
||||
|
||||
|
||||
@bp.route('/') |
||||
class NotificationsList(MethodView): |
||||
class NotificationsListPostParams(Schema): |
||||
body = fields.Str(description='Text of the notification') |
||||
read = fields.Bool(default=False, description='Whether the notification was read or not') |
||||
|
||||
class NotificationsListPostSchema(returns.SuccessSchema): |
||||
notification = fields.Nested(Notification.NotificationSchema) |
||||
|
||||
@ensure_logged_in |
||||
@bp.response(401, returns.ErrorSchema, description='Login failure') |
||||
@bp.doc(security=[{'Token': []}]) |
||||
@bp.arguments(NotificationsListPostParams, as_kwargs=True) |
||||
@bp.response(200, NotificationsListPostSchema) |
||||
def post(self, body: str, read: bool = False): |
||||
"""Post a notification to the currently logged in user |
||||
|
||||
The usefulness of this endpoint is questionable besides debugging since it's a notification to self |
||||
""" |
||||
now = datetime.now() |
||||
notification = Notification.new_notification(body, now, read) |
||||
insert_notification(decorators.user_id, notification) |
||||
return returns.success(notification=notification) |
||||
|
||||
class NotificationsListGetSchema(returns.SuccessSchema): |
||||
notifications = fields.List(fields.Nested(Notification.NotificationSchema)) |
||||
|
||||
@ensure_logged_in |
||||
@bp.response(401, returns.ErrorSchema, description='Login failure') |
||||
@bp.doc(security=[{'Token': []}]) |
||||
@bp.response(200, NotificationsListGetSchema) |
||||
def get(self): |
||||
"""Get all notifications for current user""" |
||||
notifications = get_notifications(decorators.user_id) |
||||
|
||||
return returns.success(notifications=notifications) |
Loading…
Reference in new issue