Inscrição automática do device nos tópicos FCM padrão

TLDR: Ao registrar um dispositivo push no backend, subscrever automaticamente o token nos tópicos padrão do FCM e persistir os tópicos no campo topics de PushDevices.

Contexto

Hoje o frontend é responsável por inscrever o dispositivo nos tópicos FCM após o login (subscribeToTopic no loginStore.ts). O backend já possui toda a infraestrutura: topic_subscription.subscribe() chama o Firebase Admin SDK e persiste os tópicos no campo topics de PushDevices. O registro do dispositivo já acontece no backend — faz sentido o backend assumir também a subscrição de tópicos, centralizando a responsabilidade e garantindo que o device seja inscrito mesmo que o frontend falhe.

Objetivos

  • Ao criar um PushDevices, disparar automaticamente a subscrição nos tópicos padrão
  • Persistir os tópicos inscritos no campo topics do model
  • Não introduzir duplicação: topic_subscription.subscribe() já é idempotente
  • Manter o comportamento atual do frontend como redundância segura (o FCM é idempotente)

Fora de escopo

— (não registrado na spec original)

Mudanças

apps/notifications/signals.py (novo)

post_save em PushDevices com created=True que dispara a task Celery:

python @receiver(post_save, sender=PushDevices) def on_device_created(sender, instance, created, **kwargs): if not created: return from apps.notifications import tasks as notification_tasks notification_tasks.subscribe_device_to_default_topics.delay(instance.id)

apps/notifications/apps.py

Registrar o signal no ready():

python def ready(self): import apps.notifications.signals # noqa: F401

apps/notifications/tasks.py

Adicionar a task subscribe_device_to_default_topics(device_id: int):

```python @app.task(base=BaseTaskWithRetry, queue=settings.QUEUES.get(“default”)) def subscribe_device_to_default_topics(device_id: int): device = PushDevices.objects.filter(pk=device_id).first() if not device: return

topics = [
    NotificationService.all_topic(),
    "refresh_home",
    f"platform_{device.platform}",
]
topic_subscription.subscribe(device, topics) ```

tests/notifications/test_topic_subscription.py

Testes para subscribe_device_to_default_topics: - device criado → task chama subscribe com os 3 tópicos corretos - platform='ios' → tópico platform_ios; platform='android' → platform_android - device não encontrado → retorna sem erro - em staging (settings.ENV = 'STAGING') → tópico all_staging

Como verificar

  1. Registrar um device via POST /notifications/push/register com token FCM real
  2. Verificar no banco: PushDevices.topics contém os 3 tópicos
  3. pytest tests/notifications/ — todos passam

Documentação

Nenhuma mudança de documentação necessária.