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
topicsdePushDevices.
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
topicsdo 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
- Registrar um device via
POST /notifications/push/registercom token FCM real - Verificar no banco:
PushDevices.topicscontém os 3 tópicos pytest tests/notifications/— todos passam
Documentação
Nenhuma mudança de documentação necessária.