add notification and send notification

This commit is contained in:
behruz-dev
2025-10-28 16:03:54 +05:00
parent fd6b9ab0c2
commit 544b04a21e
14 changed files with 123 additions and 2 deletions

View File

View File

@@ -0,0 +1,6 @@
from django.apps import AppConfig
class NotificationsConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'core.apps.notifications'

View File

@@ -0,0 +1,31 @@
# Generated by Django 5.2.4 on 2025-10-28 15:45
import django.db.models.deletion
import uuid
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='Notification',
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('token', models.CharField(max_length=255, unique=True)),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='notifications', to=settings.AUTH_USER_MODEL)),
],
options={
'abstract': False,
},
),
]

View File

@@ -0,0 +1 @@
from .notification import *

View File

@@ -0,0 +1,9 @@
from django.db import models
from core.apps.shared.models import BaseModel
from core.apps.accounts.models import User
class Notification(BaseModel):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='notifications')
token = models.CharField(max_length=255, unique=True)

View File

@@ -0,0 +1,11 @@
from rest_framework import serializers
from core.apps.notifications.models import Notification
class NotificationSerializer(serializers.ModelSerializer):
class Meta:
model = Notification
fields = [
'token'
]

View File

@@ -0,0 +1,7 @@
from django.urls import path
from core.apps.notifications.views import notification
urlpatterns = [
path('device/register/', notification.RegisterExpoPushToken.as_view()),
]

View File

@@ -0,0 +1,8 @@
from core.apps.notifications.models import Notification
from core.apps.notifications.utils.send_notification import send_notification
def notify_user(user, title, body):
tokens = Notification.objects.filter(user=user)
for token in tokens:
send_notification(token.token, title, body)

View File

@@ -0,0 +1,16 @@
import requests
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()

View File

@@ -0,0 +1,20 @@
from rest_framework import generics, status
from rest_framework.response import Response
from core.apps.notifications.serializers import notification as serializers
from core.apps.notifications.models import Notification
class RegisterExpoPushToken(generics.GenericAPIView):
serializer_class = serializers.NotificationSerializer
queryset = Notification.objects.all()
def post(self, request):
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
Notification.objects.update_or_create(
user=request.user,
token=serializer.validated_data['token']
)
return Response({"message": "Token saqlandi"}, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)