# Operasyon Runbook — Kreş SaaS Platformu

## Günlük Kontroller

```bash
# API sağlık durumu
curl http://localhost:3001/api/v1/health | jq .

# Beklenen çıktı:
# { "status": "ok", "checks": { "database": {"status":"ok"}, ... } }
```

---

## Yeni Ortam Kurulumu

### Sıra önemlidir — adımları atlama.

```bash
# 1. Supabase projesi oluştur, .env dosyasını doldur
cp apps/api/.env.example apps/api/.env
# DATABASE_URL, DIRECT_URL, JWT_SECRET, JWT_REFRESH_SECRET değerlerini doldur

# 2. Bootstrap SQL'leri Supabase SQL Editor'dan sırayla çalıştır
#    infra/sql/01_public_schema.sql
#    infra/sql/02_create_tenant_schema.sql
#    infra/sql/03_seed_super_admin.sql

# 3. Prisma migration'larını uygula
cd apps/api
npx prisma migrate deploy

# 4. Prisma Client'ı üret
npx prisma generate

# 5. API'yi başlat
node register.js
```

---

## Şema Değişikliği (Migration) Prosedürü

```bash
# 1. schema.prisma'yı düzenle
# 2. Migration oluştur
cd apps/api
npx prisma migrate dev --name <degisiklik_adi>

# 3. Üretilen migration.sql dosyasını gözden geçir
cat prisma/migrations/<timestamp>_<degisiklik_adi>/migration.sql

# 4. Staging'e deploy et ve test et
# 5. Production'a deploy et
npx prisma migrate deploy
```

**Yasak:** Supabase SQL Editor'dan doğrudan tablo/kolon ekleme/değiştirme.

---

## Tenant Provisioning Sorunları

### Belirti: "Okul kaydı oluşturulamadı"

```bash
# 1. API loglarında hata mesajını bul (requestId ile)
# 2. create_tenant_schema fonksiyonunu kontrol et
curl http://localhost:3001/api/v1/health | jq .checks.tenantSchemaFn

# 3. Fonksiyon yoksa yeniden yükle
# Supabase SQL Editor → infra/sql/02_create_tenant_schema.sql

# 4. Yarım kalan tenant kaydı varsa temizle
# Supabase SQL Editor:
# DELETE FROM public.subscriptions WHERE tenant_id = '<tenant_id>';
# DELETE FROM public.tenants WHERE id = '<tenant_id>';
# DROP SCHEMA IF EXISTS "tenant_<slug>" CASCADE;
```

### Belirti: "Tenant şeması bulunamadı" (users tablosu yok)

```bash
# Tenant şemasını yeniden oluştur
# Supabase SQL Editor:
# SELECT create_tenant_schema('tenant_<slug>');

# Ardından admin kullanıcıyı manuel ekle
# INSERT INTO tenant_<slug>.users (email, password_hash, role, full_name, is_active)
# VALUES ('<email>', '<bcrypt_hash>', 'ADMIN', '<isim>', true);
```

---

## Okul Listesi / Detay Hatası

### Belirti: Frontend "Okul listesi alınamadı" veya "Okul detayı alınamadı"

```bash
# 1. API'nin çalıştığını doğrula
curl http://localhost:3001/api/v1/health

# 2. Token geçerliliğini kontrol et (browser DevTools → localStorage → accessToken)
# Token'ı decode et: https://jwt.io

# 3. API loglarında requestId ile hatayı bul
# 4. Endpoint'i doğrudan test et
curl -H "Authorization: Bearer <token>" \
     http://localhost:3001/api/v1/admin/tenants

# 5. 401 geliyorsa: token süresi dolmuş, yeniden giriş yap
# 6. 403 geliyorsa: kullanıcı rolü SUPER_ADMIN değil
```

---

## Süper Admin Girişi Çalışmıyor

```bash
# 1. super_admins tablosunu kontrol et
# Supabase SQL Editor:
# SELECT id, email, is_active FROM public.super_admins;

# 2. Kayıt yoksa ekle
# infra/sql/03_seed_super_admin.sql dosyasını çalıştır

# 3. Şifre hash'ini sıfırla (Node.js):
# node -e "const bcrypt = require('bcrypt'); bcrypt.hash('YeniSifre123!', 12).then(h => console.log(h));"
# Supabase SQL Editor:
# UPDATE public.super_admins SET password_hash = '<hash>' WHERE email = 'super@vidikid.com';
```

---

## Migration Drift Tespiti

```bash
# Mevcut DB ile schema.prisma arasındaki farkı göster
cd apps/api
npx prisma migrate status

# Beklenen çıktı: "Database schema is up to date!"
# Eğer "drift detected" görünürse:
npx prisma migrate dev --name fix_drift
```

---

## Rollback Stratejisi

### Migration rollback (Prisma native rollback yoktur)

```bash
# 1. Önceki migration'ın inverse SQL'ini yaz
# 2. Supabase SQL Editor'dan çalıştır
# 3. _prisma_migrations tablosundan ilgili kaydı sil
# DELETE FROM _prisma_migrations WHERE migration_name = '<migration_adi>';
# 4. Prisma migrate status ile doğrula
```

### Tenant recovery (veri kaybı olmadan)

```bash
# Tenant şeması bozulmuşsa yeniden oluştur (veri korunur)
# SELECT create_tenant_schema('tenant_<slug>');
# Bu fonksiyon IF NOT EXISTS kullandığı için idempotent'tir.
```

---

## Incident Triage (5 Dakika Protokolü)

1. `GET /api/v1/health` → hangi check başarısız?
2. API loglarında son 50 satır → `requestId` ile hata bul
3. Supabase Dashboard → Database → Logs → son sorgular
4. Sorun DB ise: bağlantı string'ini doğrula, Supabase project status kontrol et
5. Sorun migration ise: `prisma migrate status` çalıştır
6. Sorun tenant şeması ise: `SELECT create_tenant_schema(...)` çalıştır
