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.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