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_DAYSatétoday + HABIT_CACHE_RANGE_DAYSao 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
- Popular cache de hoje e amanhã via
GET /habits/day/<date>(ambos retornam vazio) - Criar um hábito — cache de ambos os dias deve ser invalidado
- Chamar
GET /habits/day/<amanhã>novamente — hábito deve aparecer - Deletar o hábito — cache de ambos os dias deve ser invalidado novamente
Documentação
Nenhuma mudança de documentação necessária.