# Konfigurimi i Supabase (hapat për lançim, pilot)

**Statusi:** ky udhëzues është shkruar pa qasje në projekt Supabase të hostuar. Migrimet janë provuar me Postgres real (PGlite), por asnjë hap këtu nuk është ekzekutuar kundër Supabase. Emrat e menuve në panelin e Supabase mund të kenë ndryshuar: ndiq kuptimin, jo shkronjat. Çdo gjë e shënuar **[verifiko]** është supozim që duhet provuar.

**Rregull:** për mua (Claude) dhe për çdo skedar në kod jepet vetëm **URL e projektit** dhe **çelësi publik** (publishable/anon). Kurrë `service_role` ose `sb_secret_…`, as në bisedë, as në `.env`, as në aplikacion.

## 1. Krijo projektin
1. Projekt i ri në rajonin e BE-së (p.sh. Frankfurt), plan sipas nevojës (kufiri i madhësisë së skedarit audio varet nga plani; librat e gjatë mund të kërkojnë plan me kufi më të lartë **[verifiko]**).
2. Ruaj fjalëkalimin e bazës së të dhënave në menaxher fjalëkalimesh.

## 2. Apliko migrimet (në këtë rend)
`backend/supabase/migrations/`: 0001_init, 0002_new_user, 0003_storage, 0004_staff_aal2, 0005_rights_trigger, 0006_parental_control, 0007_profile_pins, 0008_profile_management, 0009_hardening, 0010_questions.

Mënyra më e thjeshtë: `backend/supabase/ALL_MIGRATIONS.sql` (gjeneruar, provuar që jep të njëjtën skemë si 0001…0010 një nga një) ngjitet një herë te SQL Editor në projekt të ZBRAZËT. Pastaj `backend/supabase/bootstrap_staff.sql` për adminin e parë.

Më të kontrolluar, dy mënyra të tjera:
- **SQL Editor:** hap çdo skedar sipas rendit, ngjit, ekzekuto. Ndalo në gabimin e parë dhe më trego tekstin e plotë.
- **Supabase CLI:** `supabase link --project-ref <ref>` pastaj `supabase db push` (kërkon fjalëkalimin e bazës; e shkruan vetëm ti).

Pas çdo migrimi nuk duhet të ketë gabim. Pastaj kontrollo që ekzistojnë: bucket-et `covers` (publik) dhe `audio` (privat) te Storage; tabela `content_questions`; funksionet `catalog_for_profile`, `questions_for_content`, `reset_parent_pin`, `delete_my_account`.

**Pritet të dalin probleme këtu (rreziqe të njohura, SECURITY_REVIEW):**
- Politikat mbi `storage.objects` (0003) mund të kërkojnë rol tjetër se ai i SQL Editor **[verifiko]**.
- `reset_parent_pin` lexon `auth.sessions`; `delete_my_account` fshin nga `auth.users`. Nëse japin "permission denied", shih RUNBOOKS §4 dhe më trego gabimin.

## 3. Cilësimet e Auth (Authentication)
| Cilësimi | Vlera | Pse |
|---|---|---|
| Email provider | aktiv, **konfirmimi i email-it i kërkuar** | Aplikacioni trajton "konfirmo email-in" (`confirm_email`). `verify-supabase.mjs` paralajmëron nëse është i fikur |
| Gjatësia minimale e fjalëkalimit | ≥ 8 | Aplikacioni kërkon 8 (`MIN_PASSWORD_LENGTH`) |
| Ofrues të jashtëm (Google, Apple…) | të fikur | Aplikacioni përdor vetëm email + fjalëkalim |
| MFA / TOTP | aktiv | Paneli i stafit kërkon aal2 **[verifiko që është aktiv si parazgjedhje]** |
| Site URL | një faqe publike e thjeshtë (p.sh. faqja ku host-ohet `legal/`) | Lidhja në email-in e konfirmimit hap këtë URL; aplikacioni nuk ka ende trajtim lidhjesh të thella |
| Rate limits | lëri parazgjedhjet; rishikoji pas pilotit | Mbrojtje nga fuqia brutale |
| **CAPTCHA** | **mos e aktivizo** | Aplikacioni nuk dërgon token CAPTCHA: regjistrimi dhe hyrja do të dështonin. Hapi i ardhshëm kur të ndërtohet |
| SMTP i vetes | vendose para lançimit (domeni VLERA) | Shërbimi i integruar ka kufi të ulët dërgimi dhe nuk është për prodhim **[verifiko kufijtë aktualë]** |
| Shabllonet e email-it | përkthe në shqip (konfirmimi) | Prindërit e shohin si mesazhin e parë të VLERA-s |

## 4. Stafi i parë (admin)
1. Authentication → Users → **Add user** me email-in tënd dhe fjalëkalim të fortë (auto-konfirmo).
2. SQL Editor:
```sql
insert into public.staff_users (user_id, role)
select id, 'admin' from auth.users where email = 'ti@shembull.al';
```
Redaktorët: `role = 'editor'` (shih `staff_role` në 0001).
3. Hap panelin, hyr, regjistro TOTP në aplikacionin e autentikimit, hyr me kod. Pa aal2 paneli nuk lexon asgjë (0004).
4. Humbi telefonin? RUNBOOKS §1.

## 5. Konfigurimi i klientëve
- Aplikacioni: `app/.env` → `EXPO_PUBLIC_SUPABASE_URL`, `EXPO_PUBLIC_SUPABASE_PUBLISHABLE_KEY`.
- Paneli: redakto `config.js` në server (te dosja e panelit, pa build të ri): `supabaseUrl`, `publishableKey`; lëre `demo: false`. Alternativë: `admin/.env` (`VITE_SUPABASE_URL`, `VITE_SUPABASE_PUBLISHABLE_KEY`) para `npm run build`. `config.js` ka përparësi. Paneli refuzon çelësat `service_role`/`sb_secret_` dhe, me `demo: false`, nuk hapet në version provë.
- Pa këto variabla të dy punojnë në version provë (memorie), jo me Supabase.

## 6. Skripti i verifikimit (vetëm lexim)
```
cd ops && npm install
SUPABASE_URL=https://xxxx.supabase.co SUPABASE_PUBLISHABLE_KEY=sb_publishable_... node verify-supabase.mjs
```
Me llogari prindi provë (krijo me dorë, konfirmo email-in): shto `VERIFY_PARENT_EMAIL` dhe `VERIFY_PARENT_PASSWORD`.

Çfarë kontrollon: refuzon çelësat e fshehtë; lidhja dhe cilësimet e auth (konfirmimi i email-it); anonimi nuk lexon asnjë tabelë të brendshme (përfshirë `content_items`, `content_questions`, `staff_users`) dhe nuk thërret `catalog_for_profile`, `questions_for_content`, `export_my_data`; bucket-i `audio` nuk është publik; me prind provë: nuk lexon tabelat e stafit dhe nuk merr katalog/pyetje për profil të huaj. Raporton si **FAIL** tabelat/funksionet që mungojnë (migrim i paaplikuar) dhe rrjetin e rënë, jo si "mohuar".

Çfarë **nuk** kontrollon (provo me dorë, SECURITY_REVIEW "Çfarë duhet provuar"): panelin me 2FA, `reset_parent_pin` pas 5 min, `delete_my_account`, URL-të e nënshkruara të audios për titull të botuar kundrejt drafti, ngarkimin e skedarëve nga stafi.

Logjika e skriptit është provuar me klient të rremë (17 teste, `cd ops && npm test`); **kundër Supabase real nuk është ekzekutuar kurrë**.

## 7. Provë e plotë e parë (rend i sugjeruar)
1. `verify-supabase.mjs` pa llogari → duhet 0 FAIL.
2. Stafi: hyr në panel, krijo një titull provë (ose importo CSV), ngarko audio + kopertinë, konfirmo të drejtat, publiko.
3. Prindi: regjistrohu në aplikacion (version me `.env`), konfirmo email-in, krijo profil, hap titullin, dëgjo, përgjigju pyetjeve.
4. `verify-supabase.mjs` me prindin provë → 0 FAIL.
5. Provo zonën prindërore (PIN, rivendosje PIN), eksportin dhe fshirjen e llogarisë provë.
6. Më trego gjithçka që dështoi, saktësisht si u shfaq.

## 8. Boshllëqe të njohura në rrjedhën e llogarisë
- **Harrimi i fjalëkalimit:** aplikacioni **nuk ka** ekran "Harruat fjalëkalimin" dhe as trajtim lidhjesh të thella. Rivendosja e fjalëkalimit duhet bërë nga administratori (Authentication → Users) deri sa të ndërtohet.
- Konfirmimi i email-it funksionon pa lidhje të thella, por lidhja hap `Site URL`, jo aplikacionin.
