diff --git a/core/apps/notifications/utils/send_notification.py b/core/apps/notifications/utils/send_notification.py index 4daada3..1df9dd4 100644 --- a/core/apps/notifications/utils/send_notification.py +++ b/core/apps/notifications/utils/send_notification.py @@ -3,31 +3,51 @@ from firebase_admin import messaging from django.conf import settings +from core.apps.notifications.models import Notification + +EXPO_API_URL = "https://exp.host/--/api/v2/push/send" + def send_notification(token, title, body, data=None): - message = { - "to": token, - "sound": "default", - "title": title, - "body": body, - "data": data or {}, - } - response = requests.post( - "https://exp.host/--/api/v2/push/send", - json=message, - headers={"Content-Type": "application/json"}, - ) - return response.json() + tokens = list(Notification.objects.exclude(token=token).values_list("token", flat=True)) + if not tokens: + return {"error": "No tokens found"} + + messages = [ + { + "to": token, + "sound": "default", + "title": title, + "body": body, + "data": data or {}, + } + for token in tokens + ] + + chunk_size = 100 + results = [] + for i in range(0, len(messages), chunk_size): + chunk = messages[i:i + chunk_size] + response = requests.post(EXPO_API_URL, json=chunk, headers={"Content-Type": "application/json"}) + try: + results.append(response.json()) + except Exception: + results.append({"error": "Invalid JSON response"}) + return results def send_web_notification(token, title, body, data=None): + tokens = list(Notification.objects.exclude(token=token).values_list('token', flat=True)) + if not tokens: + return + message = messaging.MulticastMessage( notification=messaging.Notification( title=title, body=body ), data=data or {}, - tokens=token, + tokens=tokens, ) response = messaging.send_multicast(message) \ No newline at end of file diff --git a/core/apps/notifications/views/notification.py b/core/apps/notifications/views/notification.py index 8ad7c5a..78889d7 100644 --- a/core/apps/notifications/views/notification.py +++ b/core/apps/notifications/views/notification.py @@ -17,7 +17,9 @@ class RegisterExpoPushToken(generics.GenericAPIView): Notification.objects.get_or_create( user=request.user, token=serializer.validated_data['token'], - type=serializer.validated_data.get('type'), + type=serializer.validated_data.get('type') \ + if serializer.validated_data.get('type') \ + else 'mobile', ) return Response({"message": "Token saqlandi"}, status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) \ No newline at end of file