# GOREV — Fiko AI: uyelik + arac yetkilendirme sistemi

> Bu dosya, onceki calismanin devralmak icin hazirlanmistir. Repoda calisan bir
> temel vardir; **once mevcut durumu oku, sonra uygula**.

## 1. Ne yapilacak ( ozet )

Sisteme **gercek uyelik** ekle:
- Kullanici adi + parola ile **kayit olma** ve **giris yapma**
- **Cikis yapma** ve oturum yonetimi
- Her kullaniciya **kendi arac yetkileri** verilebilmesi

## 2. Mevcut durum ( ONCE OKU )

Kod calisiyor ve testler gecti (27 paket). Yeni ozellik bunun UZERINE eklenecek.

### Zaten var, DEGISTIRME
- `internal/tool/permission.go` — **kullanici bazli arac yetkisi ZATEN mevcut**:
  `GrantStore.PolicyFor(userID)`, `SetPolicy(userID, policy)`, `Users()`
  Yani "her uyeye ayri arac yetkisi" altyapisi hazir. Sadece baglanmasi gerekiyor.
- `internal/tool/executor.go` — yetkiyi HER calistirmada denetliyor
- `internal/api/api.go` — `Deps` yapisi, rota gruplari
- `internal/api/errors.go` — `fail(c, status, code, msg)`, `failDomain(c, err)`
- `internal/api/middleware.go` — `authorize`, `resolveUserID`, `localsUserID`
- `cmd/server/main.go` — DI kurulumu, `stores` yapisi, `repo, closeRepo := openStores(...)`

### Bu turda yazildi (gozlendir, bozma)
- `internal/user/model.go` — User, Role (user/admin), View() (hash sizmaz)
- `internal/user/store.go` — Store arayuzu + MemoryStore
- `internal/user/service.go` — bcrypt, Register/Authenticate/Login/Validate/Logout
- `internal/user/service_test.go` — **8 test, hepsi gecti**
- `internal/storage/mongostore/user_repo.go` — MongoDB deposu
- `internal/api/auth.go` — register/login/logout/me uclari
- `config/config.go` — `Users{Enabled, BootstrapUser, BootstrapPassword, SessionTTL}`

### Bilerek yapilanlar
- `F.I.K.O_USERS_ENABLED=false` iken eski akis (X-Fiko-User) calisir
- Token'da parola OZETI tutulur, token'in kendisi degil
- Gecersiz giriste TEK mesaj doner (kullanici var/yok sizmasin)
- "Kullanici yok" yolunda da bcrypt calisir (zamanlama dengesi)

## 3. YAPILACAKLAR

### 3.1 Dogrulama ( once bunu calistir )
```bash
cd backend
go build ./... && go vet ./... && gofmt -l .
go test ./... -count=1
```
Hepsi yesil olmadan devam etme.

### 3.2 Arayuz — giris/uyelik ekrani
`frontend/src/app/core/auth.store.ts` ve `features/auth/login.ts` zaten var ama
**API anahtari** icin yazildi. Bunlari degistir:

1. `auth.service.ts` (yeni): register / login / logout / me cagrilari
2. `auth.store.ts`:
   - `token` signal (sessionStorage), `user` signal
   - `probe()` yerine `me()` cagrisi: oturum var mi diye sor
   - Interceptor `Authorization: Bearer <token>` eklesin
   - **WebSocket**: tarayici ozel baslik gonderemez. Sunucu `?key=` veya
     `?token=` ile kabul ediyor — ws.service.ts URL'ine ekle
3. `login.ts`: **Giris** ve **Kayit** sekmeleri
4. Ayarlar ekranina **Cikis yap** dugmesi + kullanici adi gosterimi
5. **Basina donme:** sayfa yenileyince oturum geri gelmeli (sessionStorage)

### 3.3 Uye bazli arac yetkileri
- Ara yuz: hangi araclarin hangi uyeye acik olacagini ayarlayan ekran
- API zaten var (`GET/PUT /api/permissions`) — `GrantStore` uye bazli calisiyor
- **Yonetici (admin)** rolunden sadece yonetici gorur/duzenler
- Yeni uye varsayilan: yalnizca `execute` (guvenli baslangic)

### 3.4 WebSocket dogrulama
`/ws` ucu da oturum token'i kontrol etmeli. `checkAuth` su an sadece
`X-Fiko-Auth` ve `?key=` bakıyor — **Bearer token** ve **cerez** de eklenmeli.

### 3.5 Dokumantasyon
- `docs/API.md` — `/api/auth/*` uclari
- `docs/MIMARI.md` — kimlik modeli (kullanici/rol/yetki ayrimi)
- `backend/.env.example` — `FIKO_USERS_ENABLED` acıklaması

## 3.6 ONEMLI — "kullanici bazli" ne demek (onceki cevabin dongusu)

Soru: *"kullanici bazli derken sen ne anladin?"*

Onceki calismada **su anlasilmisti** (ve YETERSIZDI):

- `X-Fiko-User` basligi ile **verinin kimin kutusunda duracagi** seciliyor.
- Yani `local` kullanicisinin konusmalarini `local` gorur.
- Bu **kimlik dogrulamasi DEGIL**, sadece sahiplik ayirimi.
- Ustelik baslik istemciye acik oldugu icin **taklit edilebilirdi**.

**Sizin istediginiz** (bu calismanin konusu):

| | Onceki (yanlis) | Istenen (yeni) |
|---|---|---|
| Giris | Yok, baslik yazmak yeterli | Kullanici adi + parola |
| Kimlik dogrulama | Yok, taklit edilebilir | Sunucu dogrular |
| Uyelik | Yok | Kayit olma ekrani |
| Oturum | Yok | Token, cikis yapma |
| Arac yetkisi | `GrantStore` ZATEN uye bazli | Baglansin + arayuz |

Ozet: onceki yalnizca **veri ayrimi** idi; sizin istediginiz **kimlik dogrulama
+ uyelik + oturum**. Aradaki fark sudur:

- Onceki: istemci "ben local'im" der, sunucu **inanir**.
- Yeni: istemci giremez, sunucu **parolayi dogrular**, token verir.

## 4. Guvenlik kurallari ( ihlal = hata )

1. Parola **duz metin asla** saklanmaz (bcrypt, cost >= 10)
2. `UserView` parola ozeti **icermez**
3. Gecersiz giris: **tek mesaj** ("kullanici adi veya parola hatali")
4. Token sunucuda **ozet olarak** saklanir (SHA-256)
5. Kullanici adi buyuk/kucuk harf **ayni hesap** sayilir
6. Sabit zamanli karsilastirma (`crypto/subtle`) — `secureEqual` var
7. Yetkisiz uclar **gorunmez** (404), sadece reddedilmez (403)
8. Hesap devre disi birakilabilmeli (`disabled`)

## 5. Kurallar

- **Calisan kodu bozma.** Her adimdan sonra build + test calistir.
- Mevcut yorum **duzgun Turkce** ve neden'i anlatir — **o stili sürdür**
- Yeni dosya acarken once `xxx_test.go` yaz, sonra uygulamayi yaz
- `PowerShell` uzerinde `go test 2>&1 | Out-String` hatalari **yutar**.
  Dogru kalip:
  ```powershell
  cmd /c "go test ./... 2>&1" | Select-String -Pattern 'FAIL|^ok |\.go:[0-9]+'
  ```
- `ng test` ~35 sn surer; arka planda calistir:
  `Start-Process cmd /c "npx ng test > t.log"` sonra `t.log` oku

## 6. Bitis kriterleri

- [ ] `go build ./... && go vet ./... && gofmt -l .` temiz
- [ ] `go test ./...` tamamen gecti (FAIL yok)
- [ ] `npx ng test` gecti (mevcut: 394 test / 23 dosya)
- [ ] `npx ng build` temiz
- [ ] Iki kullanici ile canli test: A'nin verisini B GOREMEZ
- [ ] Uye A'ya tool izni verilince sadece A calistirabiliyor
- [ ] Cikis yapinca oturum sonlaniyor
- [ ] Sayfa yenilemede oturum duruyor
- [ ] `/api/system` kimlik durumunu bildiriyor

## 7. Cevap beklentisi

Calisip calismadigini **raporla**. Varsayimlarini yaz.
Test sonuclarini komut ciktisiyla goster. "Yaptim" deme, **kanit** goster.
