Manter dados obsoletos em seu banco de dados não é apenas uma questão de organização; é uma questão de custo e performance. Em aplicações como sistemas de bingo, convites de eventos ou tokens temporários, os dados perdem o valor após um curto período.

O recurso de TTL (Time-to-Live) do Firestore permite que você defina uma data de validade para um documento e deixe que o próprio Google se encarregue da “faxina”.

1. O que é o TTL? Link para o cabeçalho

O TTL é uma política de banco de dados onde o Firestore monitora um campo de carimbo de data/hora (Timestamp) específico. Quando o horário atual ultrapassa o horário definido nesse campo, o documento é marcado para exclusão.

Vantagens:

  • Custo Zero: Você não paga pelas operações de exclusão (Delete) realizadas pelo TTL.
  • Sem Servidor: Não é necessário criar Cloud Functions ou Cron Jobs para limpar o banco.
  • Segurança: Garante que dados sensíveis temporários não fiquem armazenados indefinidamente.

2. Configurando a Interface no Angular Link para o cabeçalho

Para trabalhar com TTL, seu modelo de dados deve obrigatoriamente conter um campo do tipo Date ou Timestamp.

// lote.model.ts
export interface Lote {
  id?: string;
  criadoEm: Date;
  expiraEm: Date; // Este campo será usado pelo TTL
  cartelas: any[];
}

3. Implementando no Service Link para o cabeçalho

Ao criar o documento, você deve calcular a data de expiração no lado do cliente ou servidor. No Angular, usamos o objeto Timestamp do @angular/fire/firestore.

import { Injectable, inject } from '@angular/core';
import { Firestore, doc, setDoc, Timestamp } from '@angular/fire/firestore';

@Injectable({ providedIn: 'root' })
export class BingoService {
  private firestore = inject(Firestore);

  async criarLoteComValidade(id: string, horas: number = 24) {
    const loteRef = doc(this.firestore, `lotes/${id}`);
    
    // Cálculo da expiração
    const validade = new Date();
    validade.setHours(validade.getHours() + horas);

    await setDoc(loteRef, {
      criadoEm: Timestamp.now(),
      expiraEm: Timestamp.fromDate(validade), // O Firestore precisa deste formato
      // ...outros dados
    });
  }
}

4. O “Pulo do Gato”: Configuração no Console Link para o cabeçalho

O TTL não vem ativado por padrão. Ele precisa ser configurado no Google Cloud Console (painel de controle avançado do Firebase).

Acesse o Console do Google Cloud.

Selecione seu projeto e navegue até Firestore > TTL.

Clique em Criar Política.

No Grupo de Coleções, coloque o nome da sua coleção (ex: lotes).

No Campo de carimbo de data/hora, digite o nome exato do campo (ex: expiraEm).


  1. Lidando com a “Limpeza Preguiçosa” (Lazy Cleanup)

Um detalhe crucial: o Google processa a fila de exclusão do TTL conforme a disponibilidade de recursos. Isso significa que um documento pode expirar às 10:00, mas ser deletado fisicamente apenas às 10:30.

Para garantir que o usuário não veja dados vencidos nesse intervalo, sua consulta no Angular deve sempre filtrar os resultados:

// Consulta segura no componente
import { collection, query, where, Timestamp } from '@angular/fire/firestore';

const q = query(
  collection(this.firestore, 'lotes'),
  where('expiraEm', '>', Timestamp.now()) // Filtra o que ainda é válido
);

6. Alternativa para o Plano Spark (Gratuito) Link para o cabeçalho

Se o seu projeto não possui uma conta de faturamento vinculada (exigida para ativar APIs de automação no Google Cloud), você pode simular o TTL com uma Limpeza Manual no Admin:

async faxinaManual() {
  const q = query(
    collection(this.firestore, 'lotes'),
    where('expiraEm', '<', Timestamp.now())
  );
  const snapshot = await getDocs(q);
  snapshot.forEach(d => deleteDoc(d.ref));
}

Conclusão Link para o cabeçalho

O TTL é a solução mais elegante para gerenciar o ciclo de vida de dados no Firebase. Ao combinar o campo Timestamp no Angular com a política de TTL no console, você cria uma aplicação auto-sustentável, limpa e econômica.