# Backend no Firebase (fase 2)

Firestore + Cloud Functions + Firebase Auth, substituindo o backend NestJS.
Arquitetura e o **porquê** de cada escolha: `docs/spikes/backend-firebase.md`.

> **Nada aqui exige plano Blaze.** O Emulator Suite roda local e de graça; o
> cartão só entra no dia do deploy. É o que permitiu começar a migração sem
> depender de decisão financeira.

## O que instalar

```bash
brew install openjdk        # o emulador do Firestore é escrito em Java
npm install                 # firebase-tools fica pinado aqui, não global
npm --prefix functions install
```

O OpenJDK do Homebrew é **keg-only**: instala mas não entra no `PATH`. Você não
precisa fazer nada — `scripts/firebase.sh` procura nos lugares conhecidos. Se
estiver em outro, exporte `JAVA_HOME`.

## Como rodar

```bash
npm run emuladores          # Firestore 8080 · Auth 9099 · Functions 5001 · UI 4000
npm test                    # sobe emulador, roda os testes, derruba
npm run build               # compila as Functions
```

Use sempre `scripts/firebase.sh` (é o que os scripts do npm fazem) em vez de
chamar `firebase` direto — ele resolve o Java e barra projeto real.

## Duas travas que existem de propósito

**O `default` é `demo-bolao`, de propósito.** O projeto real é
`bolao-raro-4382d`, registrado como alias `raro` — nunca como `default`. Assim um
comando esquecido sem `--project` cai no demo, não em produção.

```bash
# emulador (o dia a dia)
npm run emuladores

# projeto real: sempre explícito, nas duas variáveis
FIREBASE_PROJETO=bolao-raro-4382d PERMITIR_PROJETO_REAL=true ./scripts/firebase.sh deploy
```

**Estado do projeto real em 07/08:** `bolao-raro-4382d`, na conta
`igorengcomp12@gmail.com`. Firestore **já provisionado** em modo nativo, região
**`southamerica-east1`** (São Paulo) — a região certa para um bolão do
Brasileirão, e a escolha é irreversível. Nenhum app registrado ainda.

**Ligados em 07/08:** *delete protection* e *point-in-time recovery* (a retenção
passou de 1 hora para 7 dias). Feito com o banco vazio, que é o momento mais
barato.

**Região das Functions é a mesma do banco** (`southamerica-east1`), fixada em
`setGlobalOptions`. O padrão do Firebase é `us-central1`, e o primeiro deploy caiu
lá — com o banco em São Paulo, cada leitura da Function cruzaria o continente. É o
tipo de erro que **nenhum teste local pega**: no emulador tudo é localhost.

**Política de limpeza do Artifact Registry ativa** (imagens com mais de 3 dias são
apagadas), nas duas regiões. Sem isso a fatura cresce em silêncio conforme os
deploys acumulam imagens de container.

**O projeto é `demo-bolao` nos testes.** O Firebase trata id com prefixo `demo-` como
projeto de demonstração: o SDK **nunca** fala com serviço real. É a proteção
contra rodar teste contra produção sem perceber. Para apontar para um projeto de
verdade é preciso ser explícito:

```bash
FIREBASE_PROJETO=meu-projeto PERMITIR_PROJETO_REAL=true ./scripts/firebase.sh deploy
```

**As rules começam fechadas** (`allow read, write: if false`). Participação entra
em `MG-2`, sigilo e prazo em `MG-3`. Abrir primeiro e fechar depois é como um
vazamento chega em produção: o estado intermediário parece funcionar.

## Armadilha registrada

No macOS existe um **stub** em `/usr/bin/java` que responde ao `command -v` e
falha ao executar, com a mesma mensagem de "Java não instalado". Testar presença
não serve; o script testa **execução** (`java -version`). Foi assim que a
primeira tentativa de subir o emulador falhou por um motivo que não tem nada a
ver com Firebase.
