parent
1ace9341b9
commit
971dbf2088
@ -1,3 +1,108 @@ |
|||||||
from flask import Blueprint |
from flask import Blueprint, jsonify, request, g |
||||||
|
from utils.auth import auth_required |
||||||
|
from db.model import User, Notification, db |
||||||
|
from sqlalchemy import select, and_, desc |
||||||
|
from datetime import datetime |
||||||
|
import uuid |
||||||
|
|
||||||
notification = Blueprint('notification', __name__) |
notification = Blueprint('notification', __name__) |
||||||
|
|
||||||
|
@notification.route('/get', methods=['GET', 'POST']) |
||||||
|
@auth_required() |
||||||
|
def handle_notifications(): |
||||||
|
""" |
||||||
|
Unified endpoint for handling notifications: |
||||||
|
GET: Fetch notifications with optional before/after pagination |
||||||
|
POST: Mark notifications as seen |
||||||
|
|
||||||
|
Query Parameters for GET: |
||||||
|
- before: UUID of notification to get older entries |
||||||
|
- after: UUID of notification to get newer entries |
||||||
|
- limit: Number of notifications to return (default: 10) |
||||||
|
|
||||||
|
POST Body: |
||||||
|
{ |
||||||
|
"notificationIds": ["uuid1", "uuid2", ...] |
||||||
|
} |
||||||
|
""" |
||||||
|
if request.method == 'GET': |
||||||
|
try: |
||||||
|
current_user: User = g.current_user |
||||||
|
limit: int = int(request.args.get('limit', 10)) |
||||||
|
before_id = request.args.get('before') |
||||||
|
after_id = request.args.get('after') |
||||||
|
|
||||||
|
# Base query |
||||||
|
query = select(Notification).where( |
||||||
|
Notification.userID == current_user.id |
||||||
|
) |
||||||
|
|
||||||
|
# Handle pagination |
||||||
|
if before_id: |
||||||
|
try: |
||||||
|
reference_notification = db.session.execute( |
||||||
|
select(Notification) |
||||||
|
.where(and_( |
||||||
|
Notification.id == uuid.UUID(before_id), |
||||||
|
Notification.userID == current_user.id |
||||||
|
)) |
||||||
|
).scalar() |
||||||
|
|
||||||
|
if not reference_notification: |
||||||
|
return jsonify({'message': 'Reference notification not found'}), 404 |
||||||
|
|
||||||
|
query = query.where( |
||||||
|
Notification.notifDate < reference_notification.notifDate |
||||||
|
) |
||||||
|
except ValueError: |
||||||
|
return jsonify({'message': 'Invalid notification ID format'}), 400 |
||||||
|
|
||||||
|
elif after_id: |
||||||
|
try: |
||||||
|
reference_notification = db.session.execute( |
||||||
|
select(Notification) |
||||||
|
.where(and_( |
||||||
|
Notification.id == uuid.UUID(after_id), |
||||||
|
Notification.userID == current_user.id |
||||||
|
)) |
||||||
|
).scalar() |
||||||
|
|
||||||
|
if not reference_notification: |
||||||
|
return jsonify({'message': 'Reference notification not found'}), 404 |
||||||
|
|
||||||
|
query = query.where( |
||||||
|
Notification.notifDate > reference_notification.notifDate |
||||||
|
) |
||||||
|
# For after queries, we need to reverse the order later |
||||||
|
query = query.order_by(Notification.notifDate) |
||||||
|
except ValueError: |
||||||
|
return jsonify({'message': 'Invalid notification ID format'}), 400 |
||||||
|
else: |
||||||
|
# Default ordering |
||||||
|
query = query.order_by(desc(Notification.notifDate)) |
||||||
|
|
||||||
|
# Apply limit and execute query |
||||||
|
query = query.limit(limit) |
||||||
|
notifications = list(db.session.execute(query).scalars()) |
||||||
|
|
||||||
|
# Reverse the order for 'after' queries to maintain consistency |
||||||
|
if after_id: |
||||||
|
notifications.reverse() |
||||||
|
|
||||||
|
# Format response |
||||||
|
notif_list = [{ |
||||||
|
'id': str(notif.id), |
||||||
|
'type': notif.notificationType, |
||||||
|
'data': notif.notificationData, |
||||||
|
'seen': notif.isSeen, |
||||||
|
'date': notif.notifDate.isoformat() |
||||||
|
} for notif in notifications] |
||||||
|
|
||||||
|
return jsonify({ |
||||||
|
'notifications': notif_list, |
||||||
|
'count': len(notif_list), |
||||||
|
'hasMore': len(notif_list) == limit |
||||||
|
}), 200 |
||||||
|
|
||||||
|
except Exception as e: |
||||||
|
return jsonify({'message': f'An error occurred: {str(e)}'}), 500 |
Loading…
Reference in new issue