idempotent device token
authorRadek Czajka <rczajka@rczajka.pl>
Wed, 3 Sep 2025 12:58:30 +0000 (14:58 +0200)
committerRadek Czajka <rczajka@rczajka.pl>
Wed, 3 Sep 2025 12:58:30 +0000 (14:58 +0200)
src/push/api/views.py
src/push/migrations/0006_alter_devicetoken_options_alter_devicetoken_token.py [new file with mode: 0644]
src/push/models.py

index 9de21c9..3eae8e3 100644 (file)
@@ -21,10 +21,11 @@ class DeviceTokenSerializer(serializers.ModelSerializer):
             return self.create(self.validated_data)
 
     def create(self, validated_data):
             return self.create(self.validated_data)
 
     def create(self, validated_data):
-        return models.DeviceToken.objects.create(
+        obj, created = models.DeviceToken.objects.get_or_create(
             user=self.context['request'].user,
             token=validated_data['token'],
         )
             user=self.context['request'].user,
             token=validated_data['token'],
         )
+        return obj
 
     def destroy(self, validated_data):
         models.DeviceToken.objects.filter(
 
     def destroy(self, validated_data):
         models.DeviceToken.objects.filter(
diff --git a/src/push/migrations/0006_alter_devicetoken_options_alter_devicetoken_token.py b/src/push/migrations/0006_alter_devicetoken_options_alter_devicetoken_token.py
new file mode 100644 (file)
index 0000000..520404a
--- /dev/null
@@ -0,0 +1,22 @@
+# Generated by Django 4.0.8 on 2025-09-03 12:56
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('push', '0005_devicetoken'),
+    ]
+
+    operations = [
+        migrations.AlterModelOptions(
+            name='devicetoken',
+            options={'ordering': ('-updated_at',)},
+        ),
+        migrations.AlterField(
+            model_name='devicetoken',
+            name='token',
+            field=models.CharField(max_length=1024, unique=True),
+        ),
+    ]
index 71e169e..3d86b96 100644 (file)
@@ -20,7 +20,7 @@ class Notification(models.Model):
 
 class DeviceToken(models.Model):
     user = models.ForeignKey('auth.User', models.CASCADE)
 
 class DeviceToken(models.Model):
     user = models.ForeignKey('auth.User', models.CASCADE)
-    token = models.CharField(max_length=1024)
+    token = models.CharField(max_length=1024, unique=True)
     created_at = models.DateTimeField(auto_now_add=True)
     updated_at = models.DateTimeField(auto_now=True)
 
     created_at = models.DateTimeField(auto_now_add=True)
     updated_at = models.DateTimeField(auto_now=True)