From: Radek Czajka Date: Tue, 26 Aug 2025 07:57:15 +0000 (+0200) Subject: Device tokens api X-Git-Url: https://git.mdrn.pl/wolnelektury.git/commitdiff_plain/b37e135d6fc3938fe91fbb5462f6fdd11797199e?hp=f5743451874346b0dcca3fc18f767ef1d153e84d Device tokens api --- diff --git a/src/api/urls.py b/src/api/urls.py index c12384c03..d4dc0eed5 100644 --- a/src/api/urls.py +++ b/src/api/urls.py @@ -22,6 +22,7 @@ urlpatterns1 = [ 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 index 000000000..afd91bbc0 --- /dev/null +++ b/src/push/api/urls.py @@ -0,0 +1,8 @@ +from django.urls import path +from . import views + + +urlpatterns = [ + path('deviceTokens/', views.DeviceTokensView.as_view()), + path('deviceTokens//', 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 index 000000000..9f838d2a4 --- /dev/null +++ b/src/push/api/views.py @@ -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 index 000000000..029051cf7 --- /dev/null +++ b/src/push/migrations/0005_devicetoken.py @@ -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)), + ], + ), + ] diff --git a/src/push/models.py b/src/push/models.py index 461845e77..71e169ee9 100644 --- a/src/push/models.py +++ b/src/push/models.py @@ -16,3 +16,13 @@ class Notification(models.Model): 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',)