▶️ Senaryo: Yeni Portföy Oluşturdum — Ne Olur?

"+Yeni Portföy" butonuna bastığımda backend'de ve frontend'de ne çalışır?

🎬 Adım Adım Akış

  1. UI: /portfoy sayfasında "Yeni Portföy" butonu tıklanır
    // Frontend
    <button onClick={() => setShowModal(true)}>Yeni Portföy</button>
  2. Modal açılır: Form alanları
    • Portföy adı (zorunlu)
    • Hedef değer (opsiyonel)
    • Hedef kategorisi (Genel / Emeklilik / Ev / Eğitim / Diğer)
    • Para birimi (TRY/USD/EUR)
  3. Kullanıcı "Oluştur"a basar:
    POST /api/portfolio
    Content-Type: application/json
    {
      "ad": "Yeni Portföyüm",
      "hedef": 1000000000,
      "hedefKategori": "Genel",
      "paraBirimi": "TRY"
    }
  4. Backend (NestJS service):
    • Auth token validate
    • DTO validation (class-validator)
    • Insert into portfolios tablo
    • Yeni ID döndür (örn 23920)
    Response 201:
    {
      "success": true,
      "data": {
        "id": 23920,
        "ad": "Yeni Portföyüm",
        "kullaniciId": 80,
        "hedef": 1000000000,
        "hedefKategori": "Genel",
        "olusturmaTarihi": "2026-05-25T00:00:00Z",
        "varlikSayisi": 0,
        "toplamDeger": 0
      }
    }
  5. Domain Event publish:
    EventBus.emit('portfolio:created', { portfolioId: 23920, userId: 80 })
  6. WebSocket broadcast: Kullanıcının tüm açık tab'larına
    WS event: portfolio:changed
    Payload: { action: 'created', portfolioId: 23920 }
  7. Frontend React Query invalidate:
    queryClient.invalidateQueries(['portfolio'])
    // → /api/portfolio yeniden fetch
    // → Sidebar portföy listesi update
    // → /portfoy hub sayfa refresh
  8. Modal kapanır ve /portfoy/23920 sayfasına yönlendirilir.
  9. Portföy detay sayfası açılır — 13 endpoint paralel çağrılır (yeni portföy boş ama hepsi tetiklenir):
    GET /api/portfolio/23920                  → temel data
    GET /api/portfolio/23920/holdings         → []
    GET /api/portfolio/23920/trades           → []
    GET /api/portfolio/23920/history?period=30d → []
    GET /api/portfolio/23920/history?period=all → []
    GET /api/portfolio/23920/ai-analysis      → null (henüz yok)
    GET /api/portfolio/23920/realized-pnl     → 0
    GET /api/portfolio/23920/closed-positions → []
    GET /api/portfolio/23920/returns          → []
    GET /api/portfolio/23920/target-allocation → null
    GET /api/portfolio/23920/dividends        → []
    GET /api/portfolio/23920/dividend-summary → 0
    GET /api/portfolio/23920/risk-score       → null (pozisyon yok)
  10. UI gösterimi: Boş state
    "Portföyünüz boş. İlk işleminizi ekleyerek başlayın."
    [İşlem Ekle] [Cüzdan Detayları]

📊 Etkilenen Sayfalar (Cross-Module)

SayfaNe Değişir
/portfoyListe'de yeni portföy kartı görünür (1/1 → 2/2)
/portfoy/genel-varlik-ozetiToplam portföy sayısı +1 (değer aynı, boş)
Cüzdan widget (portföy hub'da)Değişmez (henüz işlem yok)
Apex AI önerileri"Portföyüm nasıl?" sorusuna context dahil olur
PostHogEvent: portfolio_created trigger

🔄 Veri Akış Diyagramı

[User Click "Yeni Portföy"] │ ▼ [Modal: form fill] │ ▼ [POST /api/portfolio] │ ▼ ┌────────────────────────────────┐ │ BACKEND │ │ 1. Auth check │ │ 2. DTO validate │ │ 3. INSERT INTO portfolios │ │ 4. Return new ID (23920) │ └────────────┬────────────────────┘ │ ├──→ [Domain Event: portfolio:created] │ │ │ ▼ │ [EventBus → Redis Pub/Sub] │ │ │ ▼ │ [WS Gateway broadcast] │ │ │ ▼ │ [User's all tabs receive event] │ │ │ ▼ │ [React Query invalidate ['portfolio']] │ └──→ [Response 201 to user] │ ▼ [Navigate /portfoy/23920] │ ▼ [13 endpoint paralel fetch] │ ▼ [Empty state UI render]

📡 Kullanılan Endpoint'ler

EndpointMethodAmaç
/api/portfolioPOSTYeni portföy oluştur
/api/portfolioGETListe refresh
/api/portfolio/{newId}GETDetay yükle
+ 12 sub-endpointGETHoldings/trades/history/AI/risk/etc

⚡ Domain Events Tetiklenen

🗄️ Etkilenen DB Tabloları

TabloİşlemKolonlar
portfoliosINSERTid, kullanici_id, ad, hedef, hedef_kategori, para_birimi, olusturma_tarihi
domain_events_logINSERTid, event_tipi='portfolio:created', payload, olusturma_tarihi
audit_logINSERTid, kullanici_id, eylem='portfolio_create', kaynak_id=23920

📖 Portfolio tabloları tam şema →

💾 localStorage Etkisi

Direkt etkilenmez ama:

🎯 Sonraki Adım

💡 İşlem Ekleme
Portföy oluşturduktan sonra "İşlem Ekle" butonu ile ilk al/sat işlemini girebilirsin.
📖 "Hisse aldım — ne olur?" senaryosunu oku →