▶️ 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ış
-
UI: /portfoy sayfasında "Yeni Portföy" butonu tıklanır
// Frontend <button onClick={() => setShowModal(true)}>Yeni Portföy</button> -
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)
-
Kullanıcı "Oluştur"a basar:
POST /api/portfolio Content-Type: application/json { "ad": "Yeni Portföyüm", "hedef": 1000000000, "hedefKategori": "Genel", "paraBirimi": "TRY" } -
Backend (NestJS service):
- Auth token validate
- DTO validation (class-validator)
- Insert into
portfoliostablo - 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 } } -
Domain Event publish:
EventBus.emit('portfolio:created', { portfolioId: 23920, userId: 80 }) -
WebSocket broadcast: Kullanıcının tüm açık tab'larına
WS event: portfolio:changed Payload: { action: 'created', portfolioId: 23920 } -
Frontend React Query invalidate:
queryClient.invalidateQueries(['portfolio']) // → /api/portfolio yeniden fetch // → Sidebar portföy listesi update // → /portfoy hub sayfa refresh -
Modal kapanır ve
/portfoy/23920sayfasına yönlendirilir. -
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) -
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)
| Sayfa | Ne Değişir |
|---|---|
/portfoy | Liste'de yeni portföy kartı görünür (1/1 → 2/2) |
/portfoy/genel-varlik-ozeti | Toplam 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 |
| PostHog | Event: 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
| Endpoint | Method | Amaç |
|---|---|---|
/api/portfolio | POST | Yeni portföy oluştur |
/api/portfolio | GET | Liste refresh |
/api/portfolio/{newId} | GET | Detay yükle |
| + 12 sub-endpoint | GET | Holdings/trades/history/AI/risk/etc |
⚡ Domain Events Tetiklenen
portfolio:created— Yeni portföy oluşturuldu (sistemde yeni event muhtemel)portfolio:changed— Liste değişti
🗄️ Etkilenen DB Tabloları
| Tablo | İşlem | Kolonlar |
|---|---|---|
portfolios | INSERT | id, kullanici_id, ad, hedef, hedef_kategori, para_birimi, olusturma_tarihi |
domain_events_log | INSERT | id, event_tipi='portfolio:created', payload, olusturma_tarihi |
audit_log | INSERT | id, kullanici_id, eylem='portfolio_create', kaynak_id=23920 |
📖 Portfolio tabloları tam şema →
💾 localStorage Etkisi
Direkt etkilenmez ama:
fvt-panel— Sidebar açık panel state korunur- React Query cache — In-memory, ama browser kapanınca silinir
🎯 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 →