Device tokens api
authorRadek Czajka <rczajka@rczajka.pl>
Tue, 26 Aug 2025 07:57:15 +0000 (09:57 +0200)
committerRadek Czajka <rczajka@rczajka.pl>
Tue, 26 Aug 2025 07:57:15 +0000 (09:57 +0200)
src/api/urls.py
src/push/api/urls.py [new file with mode: 0644]
src/push/api/views.py [new file with mode: 0644]
src/push/migrations/0005_devicetoken.py [new file with mode: 0644]
src/push/models.py

index c12384c..d4dc0ee 100644 (file)
@@ -22,6 +22,7 @@ urlpatterns1 = [
     path('', include('social.api.urls2')),
     path('', include('bookmarks.api.urls')),
     path('', include('search.api.urls')),
     path('', include('social.api.urls2')),
     path('', include('bookmarks.api.urls')),
     path('', include('search.api.urls')),
+    path('', include('push.api.urls')),
 ]
 
 
 ]
 
 
diff --git a/src/push/api/urls.py b/src/push/api/urls.py
new file mode 100644 (file)
index 0000000..afd91bb
--- /dev/null
@@ -0,0 +1,8 @@
+from django.urls import path
+from . import views
+
+
+urlpatterns = [
+    path('deviceTokens/', views.DeviceTokensView.as_view()),
+    path('deviceTokens/<int:pk>/', views.DeviceTokenView.as_view(), name='push_api_device_token'),
+]
diff --git a/src/push/api/views.py b/src/push/api/views.py
new file mode 100644 (file)
index 0000000..9f838d2
--- /dev/null
@@ -0,0 +1,42 @@
+from rest_framework import serializers
+from rest_framework.generics import ListCreateAPIView, RetrieveUpdateDestroyAPIView
+from rest_framework.permissions import IsAuthenticated
+from api.utils import never_cache
+from api.fields import AbsoluteURLField
+from push import models
+
+
+class DeviceTokenSerializer(serializers.ModelSerializer):
+    href = AbsoluteURLField(
+        view_name='push_api_device_token',
+        view_args=('pk',)
+    )
+
+    class Meta:
+        model = models.DeviceToken
+        fields = ['token', 'created_at', 'updated_at', 'href']
+        read_only_fields = ['created_at', 'updated_at']
+
+    def create(self, validated_data):
+        return models.DeviceToken.objects.create(
+            user=self.context['request'].user,
+            **validated_data
+        )
+
+
+@never_cache
+class DeviceTokensView(ListCreateAPIView):
+    permission_classes = [IsAuthenticated]
+    serializer_class = DeviceTokenSerializer
+
+    def get_queryset(self):
+        return models.DeviceToken.objects.filter(user=self.request.user)
+
+
+@never_cache
+class DeviceTokenView(RetrieveUpdateDestroyAPIView):
+    permission_classes = [IsAuthenticated]
+    serializer_class = DeviceTokenSerializer
+
+    def get_queryset(self):
+        return models.DeviceToken.objects.filter(user=self.request.user)
diff --git a/src/push/migrations/0005_devicetoken.py b/src/push/migrations/0005_devicetoken.py
new file mode 100644 (file)
index 0000000..029051c
--- /dev/null
@@ -0,0 +1,26 @@
+# Generated by Django 4.0.8 on 2025-08-26 07:47
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+        ('push', '0004_alter_notification_body_alter_notification_image_and_more'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='DeviceToken',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('token', models.CharField(max_length=1024)),
+                ('created_at', models.DateTimeField(auto_now_add=True)),
+                ('updated_at', models.DateTimeField(auto_now=True)),
+                ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
+            ],
+        ),
+    ]
index 461845e..71e169e 100644 (file)
@@ -16,3 +16,13 @@ class Notification(models.Model):
 
     def __str__(self):
         return '%s: %s' % (self.timestamp, self.title)
 
     def __str__(self):
         return '%s: %s' % (self.timestamp, self.title)
+
+
+class DeviceToken(models.Model):
+    user = models.ForeignKey('auth.User', models.CASCADE)
+    token = models.CharField(max_length=1024)
+    created_at = models.DateTimeField(auto_now_add=True)
+    updated_at = models.DateTimeField(auto_now=True)
+
+    class Meta:
+        ordering = ('-updated_at',)