Invalidar cache de hábitos ao criar, atualizar ou deletar hábito

TLDR: Ao criar, atualizar ou deletar um hábito, invalidar o cache dos 15 dias anteriores e 15 dias posteriores ao dia atual do usuário, evitando que datas passadas e futuras exibam dados desatualizados.

Contexto

O cache de GET /habits/day/<date> usa a key habits_by_date:{user_id}:{date} com TTL até meia-noite. Ao criar ou atualizar um hábito, apenas o cache de hoje era invalidado (perform_create e perform_update no HabitViewSet). Deletar um hábito não invalidava nenhum cache.

O front exibe um carrossel de dias. Quando um hábito é criado hoje, o cache dos dias passados e futuros não era invalidado — se o usuário já tivesse aberto algum desses dias anteriormente, o cache ficava stale e o hábito não aparecia (ou continuava aparecendo após deleção).

Objetivos

  • Invalidar o cache de today - HABIT_CACHE_RANGE_DAYS até today + HABIT_CACHE_RANGE_DAYS ao criar, atualizar ou deletar um hábito
  • HABIT_CACHE_RANGE_DAYS = 15 — cobre 15 dias para trás e 15 dias para frente (31 dias no total) ## Mudanças
Arquivo O que muda
apps/habits/services.py Adicionar constante HABIT_CACHE_RANGE_DAYS = 15 e função clear_habit_execution_cache(user_id) que deleta 31 keys (today - 15 a today + 15)
apps/habits/tasks.py Chamar clear_habit_execution_cache(habit.user_id) ao final de generate_habit_executions e update_habit_executions
apps/habits/views.py Remover cache.delete(hoje) de perform_create e perform_update — a limpeza agora ocorre nas tasks; adicionar perform_destroy chamando clear_habit_execution_cache diretamente (deleção é síncrona, sem task)

Como verificar

  1. Popular cache de hoje e amanhã via GET /habits/day/<date> (ambos retornam vazio)
  2. Criar um hábito — cache de ambos os dias deve ser invalidado
  3. Chamar GET /habits/day/<amanhã> novamente — hábito deve aparecer
  4. Deletar o hábito — cache de ambos os dias deve ser invalidado novamente

Documentação

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