# BPF 2026 — Build workflow

## Cum funcționează

Aplicația **nu mai apelează Airtable direct din browser**. La fiecare update:

1. Echipa editează în Airtable (BPF_Venues, BPF_Events, etc.) ca de obicei.
2. **Tu** rulezi `python3 build.py` — script-ul fetch-uiește cele 5 tabele și scrie `data.json`.
3. Deploy: drag-drop folderul pe Cloudflare Pages (sau push git, dacă-l setezi).

PAT-ul Airtable trăiește **doar în `.env`** pe Mac-ul tău. Nu mai ajunge în client.

## Comenzi

```bash
# Refresh date din Airtable
python3 build.py

# Deploy local pentru test
python3 -m http.server 8000
```

## Fișiere importante

| Fișier | Rol | Commit în git? |
|---|---|---|
| `BPFmap.html` | App | ✅ Da |
| `data.json` | Date Airtable cached (regenerat) | ✅ Da (e parte din deploy) |
| `build.py` | Script fetch Airtable | ✅ Da |
| `.env` | PAT (secret) | ❌ NU (gitignored) |
| `.env.example` | Template fără secrete | ✅ Da |
| `.gitignore` | Excluderi git | ✅ Da |

## Rotare PAT

După ce ai validat că bake-ul merge:
1. Mergi pe https://airtable.com/create/tokens
2. Generezi un PAT nou cu scopuri `data.records:read` pe baza `appQ7B5TqP7RRK5Xp`
3. Înlocuiești `AIRTABLE_PAT=...` în `.env`
4. Rulezi `python3 build.py` să confirmi că merge cu PAT-ul nou
5. Revochezi PAT-ul vechi din UI Airtable

Acum, chiar dacă cineva a copiat PAT-ul vechi din HTML, e invalid server-side.

## Troubleshooting

| Simptom | Cauză | Fix |
|---|---|---|
| `FAIL: ... HTTP 401` | PAT invalid/expirat | Re-generează în Airtable, update `.env` |
| `FAIL: ... HTTP 403` | PAT fără scope pe bază | Edit token, adaugă baza BPF 2026 |
| `FAIL: ... HTTP 429` | Rate limit Airtable | Așteaptă 30s, re-rulează |
| App-ul nu încarcă date | `data.json` lipsește sau invalid | Rulează `python3 build.py` |
