📘 BaseApp Platform: EKSİKSİZ KULLANIM VE GELİŞTİRME KILAVUZU (V1.0)

BU DÖKÜMAN HAKKINDA
Bu döküman, BaseApp platformu için hazırlanan en kapsamlı ve nihai kaynaktır. Hiçbir detay atlanmamış, operasyonel ve teknik tüm bilgiler tek çatı altında toplanmıştır.


📑 İÇİNDEKİLER

BÖLÜM A: OPERASYON VE KULLANIM REHBERİ

  1. Giriş ve Genel Bakış
  2. Müşteri (Firma) Yönetimi
  3. Kullanıcı Yönetimi
  4. Rol ve Yetki Yönetimi
  5. Dinamik Veri (Tablo) Yönetimi
  6. Dashboard ve Arayüz Düzenleme
  7. Çeviri ve Dil Yönetimi
  8. Tema ve Görünüm Ayarları
  9. Gelişmiş: Middleware ve Loglar
  10. Operasyon: Taklit (Impersonation)
  11. Sorun Giderme (Troubleshooting)
  12. Örnek Senaryolar (Adım Adım)

BÖLÜM B: GELİŞTİRME VE MİMARİ REHBERİ

  1. Platform Mimarisi ve İzolasyon
  2. API Referansı: Server-Side (Sandbox)
  3. API Referansı: Client-Side (Dynamic Widget)
  4. Yetki Matrisi (Permission Matrix)
  5. Güvenlik ve Sınırlar
  6. Performans ve Ölçeklenebilirlik

🟢 BÖLÜM A: OPERASYON VE KULLANIM REHBERİ

Bu bölüm, kod yazmadan platformu yönetmek isteyenler, stajyerler ve destek personeli içindir.

1. Giriş ve Genel Bakış

1.1. Platforma Erişim

1.2. Roller: Kim Kimdir?


2. Müşteri (Firma) Yönetimi

Firmanızın iş yaptığı kurumları veya kişileri buradan yönetirsiniz.

2.1. Yeni Müşteri Ekleme

  1. Admin Panel > Müşteriler (Customers) menüsüne gidin.
  2. Sağ üstteki + Yeni Müşteri butonuna tıklayın.
  3. İsim: Firmanın resmi adını yazın (Örn: "Yıldız Market A.Ş.").
  4. Üst Müşteri (Parent): Eğer bu bir şube ise, bağlı olduğu merkezi seçin. (Yoksa boş bırakın).
    • Senaryo: "Marmara Bölge Müdürlüğü"nü eklerken, üst müşteri olarak "Yıldız Market Genel Merkez" seçilmelidir.
  5. Kaydet butonuna basın.

2.2. Hiyerarşi Nedir?

Müşteriler ağaç yapısında birbirine bağlanabilir (Genel Merkez -> Bölge -> Şube). Bu sayede üst birim, alt birimin verilerini görebilir.


3. Kullanıcı Yönetimi

Sisteme giriş yapacak kişileri buradan eklersiniz.

3.1. Yeni Kullanıcı Ekleme

  1. Admin Panel > Ayarlar > Kullanıcılar (Users) menüsüne gidin.
  2. + Yeni Kullanıcı butonuna basın.
  3. Ad Soyad, E-posta bilgilerini girin.
  4. Rol Seçimi (Kritik):
    • Firma çalışanı ise: TENANT_USER.
    • Müşteri çalışanı ise: CUSTOMER.
  5. Müşteri Bağlantısı: Eğer rolü CUSTOMER seçtiyseniz, Bağlı Müşteri kutusu açılır. Buradan hangi firmaya (Örn: "Yıldız Market") ait olduğunu mutlaka seçin.
  6. Geçici şifresini belirleyin ve Kaydet deyin.

3.2. Kullanıcıya Özel Yetki (Dashboard/Entity)

Bir kullanıcıya sadece belirli bir tabloyu veya dashboard'u göstermek için:

  1. Kullanıcı listesinde, kişinin yanındaki Erişim (Kilit İkonu) butonuna tıklayın.
  2. Açılan pencerede Varlık Erişimleri sekmesine gelin.
  3. "Siparişler" tablosunu seçip "Okuma + Yazma" yetkisini işaretleyin.

4. Rol ve Yetki Yönetimi

Personelleriniz (TENANT_USER) neler yapabilir?

4.1. Yeni Özel Rol Oluşturma

  1. Admin Panel > Ayarlar > Roller menüsüne gidin.
  2. + Yeni Rol butonuna basın.
  3. Rol Adı: Örn: "Depo Sorumlusu".
  4. Yetkiler (Permissions): Listeden izinleri seçin.
Yetki Anahtarı Açıklama
ENTITY_VIEW Tüm tabloları (Varlıkları) görüntüleyebilir.
ENTITY_CREATE Yeni kayıt ekleyebilir.
ENTITY_EDIT Mevcut kayıtları düzenleyebilir.
ENTITY_DELETE Kayıt silebilir. (Dikkatli Verin!)
DASHBOARD_VIEW Rapor ekranlarını (Dashboard) görebilir.
DASHBOARD_MANAGE Yeni dashboard oluşturabilir ve tasarım yapabilir.
USERS_MANAGE Alt kullanıcı ekleyip çıkartabilir.
ROLES_MANAGE Yeni rol oluşturabilir.
COMPONENTS_MANAGE Widget kodlarını değiştirebilir. (Sadece Teknik Ekip)

4.2. Rolü Kullanıcıya Atama

  1. Kullanıcılar menüsüne dönün.
  2. Kullanıcıyı düzenle (Kalem ikonu) deyin.
  3. Sistem Rolü: TENANT_USER kalsın.
  4. Özel Rol: Oluşturduğunuz "Depo Sorumlusu" rolünü seçin.

5. Dinamik Veri (Tablo) Yönetimi

Excel tablosu açar gibi veritabanı tablosu oluşturun.

5.1. Yeni Tablo (Entity) Tanımlama

  1. Admin Panel > Geliştirici > Varlıklar (Entities) menüsüne gidin.
  2. + Yeni Varlık butonuna basın.
  3. Adı: "Servis Araçları".
  4. Slug: servis-araclari (Otomatik dolar, değiştirmeyin).
  5. Alanlar (Fields) Ekleme:
    • Plaka -> Tipi: TEXT, Zorunlu: Evet.
    • Kapasite -> Tipi: NUMBER.
    • Aktif -> Tipi: BOOLEAN.
    • Sürücü -> Tipi: RELATION -> Hedef: Personeller.

5.2. Veri Kapsamı (Scope) Ayarı

Tabloyu oluştururken Kapsam kutusuna dikkat edin:

5.3. Veri Girişi

  1. App Panel (veya Admin Panel) > Varlık Kayıtları menüsüne gidin.
  2. Soldan "Servis Araçları"nı seçin.
  3. Excel benzeri liste açılacak. Sağ üstten + Yeni Ekle diyerek araçları kaydedin.

6. Dashboard ve Arayüz Düzenleme

Rapor ekranlarını buradan tasarlarsınız.

6.1. Yeni Dashboard Oluşturma

  1. App Panel > Dashboard menüsüne gidin.
  2. Sayfanın en altındaki veya menüdeki + Yeni Dashboard butonuna basın.
  3. Ekrana boş bir sayfa gelecek. Sağ üstten Kalem (Düzenle) ikonuna tıklayın.

6.2. Widget Ekleme ve Düzenleme

  1. Düzenleme modunda sağda bir panel açılır.
  2. Widget Ekle butonuna basın. Listeden bir widget (Örn: "Basit Kart") seçin ve ekrana sürükleyin.
  3. Boyutlandırma: Kutunun sağ alt köşesinden tutup büyütebilirsiniz.
  4. Ayarlar: Kutunun sağ üstündeki Dişli (Ayarlar) ikonuna basın.
    • Başlık: "Bugünkü Satışlar".
    • API URL: /api/app/entities/records/satislar.
  5. Kaydet (Disket İkonu) butonuna basarak çıkın.

6.3. Simülasyon Modu (Önemli!)

Widget'ları canlıya almadan önce test etmek için:

  1. Geliştirici Paneli > Bileşenler menüsüne gidin.
  2. Bir bileşene tıklayın ve Simülasyon sekmesini açın.
  3. Soldaki JSON editörüne itemConfig ve dashboardConfig verilerini girerek bileşenin farklı durumlarda nasıl göründüğünü anlık olarak test edebilirsiniz.

7. Çeviri ve Dil Yönetimi

Sistemi İngilizce, Almanca vb. dillerde kullanmak için.

7.1. Yeni Çeviri Ekleme

  1. Admin Panel > Ayarlar > Çeviriler (i18n) menüsüne gidin.
  2. + Yeni Anahtar butonuna basın.
  3. Anahtar: menu.servis_araclari (Küçük harf, boşluksuz).
  4. Türkçe: "Servis Araçları".
  5. English: "Service Vehicles".

8. Tema ve Görünüm Ayarları

Markanızın renklerini ve logosunu buradan değiştirin.

  1. Admin Panel > Ayarlar > Tema menüsüne gidin.
  2. Logo: Logonuzun URL'ini yapıştırın.
  3. Renkler:
    • Primary: Ana renk (Butonlar, başlıklar).
    • Secondary: İkincil renk.
  4. Layout (Görünüm Şablonu): Firmanızın genel sayfa yapısını seçin.
    • Varsayılan: Standart üst ve yan menülü yapı.
    • Modern Sidebar: Sadece ikonlardan oluşan dar yan menü.
    • Top Menu Only: Sadece üst menü (Yatay kullanım).
  5. Kaydet butonuna basın. Sayfayı yenilediğinizde renkler değişecektir.

9. Gelişmiş: Middleware ve Loglar

Sistemin arka planında çalışan kuralları buradan izlersiniz.

9.1. Middleware Yönetimi

  1. Admin Panel > Geliştirici > Middleware menüsüne gidin.
  2. Burada "IP Filtresi", "Mesai Kontrolü" gibi kuralları görürsünüz.
  3. Bir kuralı geçici olarak kapatmak için yanındaki Aktif anahtarını kapatın.

9.2. Hata Loglarını Okuma

Bir şeyler ters giderse (Örn: Kayıt eklenemiyor):

  1. Admin Panel > Geliştirici > Logs menüsünü açın.
  2. Burada canlı akan logları göreceksiniz. Kırmızı renkli satırlar hataları gösterir.

10. Operasyon: Taklit (Impersonation)

Bir müşteri "Sisteme giremiyorum" dediğinde, onun gözünden görmek için:

  1. Admin Panel > Kullanıcılar listesine gidin.
  2. O kullanıcının satırındaki Gözlük İkonu (Taklit Et) butonuna basın.
  3. Ekran yenilenecek ve artık o kullanıcıymış gibi sistemi göreceksiniz.
  4. İşiniz bitince sağ üstteki profil menüsünden "Taklidi Durdur" diyerek kendi hesabınıza dönün.

11. Sorun Giderme (Troubleshooting)

Hata Mesajı / Durum Olası Sebep Çözüm
403 Forbidden Yetki eksik veya Scope (Kapsam) yanlış. Kullanıcının rolünü ve Tablonun Scope ayarını kontrol edin.
Script execution timed out Kod 5 saniyeden uzun sürdü. Yazılımcınıza iletin; döngü veya sorgu hatası olabilir.
Relation does not exist Bağlı bir tablo silinmiş. Varlık tanımlarını (Entity Definitions) kontrol edin.
Permission denied Kod içinde yasaklı bir işlem var. Sandbox içinde fs, process gibi sisteme erişen kodlar engellenir.
Invalid tenant context Firma bulunamadı. Girdiğiniz URL (subdomain) veya x-tenant-id başlığı hatalı.
Widget Boş Görünüyor Veri yok veya Adres yanlış. Widget ayarlarındaki API URL'ini (slug) kontrol edin.
Kullanıcı Giremiyor Yanlış adres. Firmanıza özel adresten (firma.app.com) girdiğinden emin olun.

12. Örnek Senaryolar (Adım Adım)

Senaryo 1: Yeni Bir Müşteri ve Personelini Ekleme

  1. Müşteriler menüsünden "ABC Lojistik" firmasını ekle.
  2. Kullanıcılar menüsünden "ahmet@abc.com" kullanıcısını ekle.
  3. Rolünü CUSTOMER seç.
  4. Bağlı Müşteri olarak "ABC Lojistik"i seç.
  5. Kaydet.

Senaryo 2: "Duyurular" Tablosu Oluşturma

  1. Varlıklar menüsünden "Duyurular" tablosu oluştur.
  2. Alanlar: Baslik (TEXT), Icerik (TEXT), Tarih (DATE).
  3. Kapsam: TENANT_SHARED (Tüm personel görsün).
  4. Varlık Kayıtları menüsüne gidip ilk duyuruyu ekle.


🔴 BÖLÜM B: GELİŞTİRME VE MİMARİ REHBERİ

Bu bölüm, sisteme kod yazarak (Middleware, Hook, Widget Script) müdahale edecek geliştiriciler içindir.

13. Platform Mimarisi ve İzolasyon

13.1. Tenant İzolasyonu

Platform, Multi-Tenant mimariye sahiptir. Her veri tenantId ile ayrılır. Güvenlik, veritabanı sürücüsü (Prisma Extension) seviyesinde sağlanır.


14. API Referansı: Server-Side (Sandbox)

Middleware ve Hook kodlarınızda ctx nesnesi üzerinden erişebileceğiniz araçlar:

Araç Metotlar Açıklama
ctx.prisma findFirst, findMany, create, update, delete, count Veritabanı istemcisi. (İzole)
ctx.redis set(key, val), get(key), del(key) Ön bellek (Cache). Tenant'a özel prefix kullanır.
ctx.fetch(url) fetch(url, options) HTTP İstemcisi. (SSRF Korumalı, Localhost'a erişemez).
ctx.eventBus emit(event, data) Sistem içi olay yayınlama.
ctx.bcrypt hash(str, salt), compare(str, hash) Şifre hashleme. Cost factor 10 sabittir.
ctx.console log(), error(), warn() Admin paneline log basar.
ctx.createError ({ statusCode, message }) İşlemi durdurup hata fırlatır.
ctx.getQuery () URL parametrelerini döner.
ctx.readBody async () POST isteğinin gövdesini (JSON) döner.
ctx.setHeader (key, value) Yanıt başlığı ekler.
ctx.payload data DİKKAT: Hook içinde sadece güncel veri (data) vardır.

14.1. ctx.payload Hakkında Uyarı (UPDATE Hook)

UPDATE işlemi sonrası çalışan hook'larda ctx.payload sadece güncel kaydı içerir. Eski kayda (oldData) erişim yoktur.

// ✅ DOĞRU: Güncel veriyi al
const yeniKayit = ctx.payload.data; 

// ❌ YANLIŞ: Eski veriye erişmeye çalışma
// const eskiKayit = ctx.payload.oldData; // Böyle bir alan YOKTUR!

14.2. Middleware Örneği (Mesai Kontrolü)

const saat = new Date().getHours();
if (saat < 9 || saat > 18) {
  throw ctx.createError({
    statusCode: 403,
    statusMessage: 'Sisteme sadece mesai saatlerinde girebilirsiniz.'
  });
}

14.3. Hook Örneği (Stok Düşme)

Siparis tablosuna kayıt eklendiğinde (CREATE) çalışır:

const siparis = ctx.payload.data;

const urun = await ctx.prisma.entityRecord.findFirst({
  where: { 
    entityDefinition: { slug: 'urunler' },
    data: { path: ['id'], equals: siparis.urun_id }
  }
});

if (urun) {
  await ctx.prisma.entityRecord.update({
    where: { id: urun.id },
    data: { data: { ...urun.data, stok: urun.data.stok - siparis.adet } }
  });
  ctx.console.log('Stok güncellendi.');
}

15. API Referansı: Client-Side (Dynamic Widget)

Widget Script'lerinde (setup()) kullanabileceğiniz araçlar:

Servis Adı Açıklama
$fetch veya useNuxtApp().$fetch Sunucudan veri çekme. Doğrudan $fetch('/api...') kullanılabilir.
inject('ui') ui.toast('Mesaj'), ui.alert('Hata'), ui.confirm('Emin mi?')
inject('user') user.value.name, user.value.role
inject('auth') auth.login(), auth.logout()
useRouter() Sayfa yönlendirme. router.push('/...')
inject('navigateTo') Alternatif yönlendirme.

15.1. Widget Script Örneği

{
  props: ['itemConfig', 'dashboardConfig'],
  setup(props) {
    // $fetch globaldir, doğrudan kullanılabilir.
    const ui = inject('ui');
    const products = ref([]);

    onMounted(async () => {
      try {
        const res = await $fetch('/api/app/entities/records/urunler');
        products.value = res.data;
      } catch (e) {
        ui.alert({ title: 'Hata', message: 'Veri çekilemedi!' });
      }
    });

    return { products };
  }
}

15.2. Widget Props Detayı

Widget'lara gelen props objesi şunları içerir:


16. Yetki Matrisi (Permission Matrix)

Hangi rolün neleri yapabileceğinin teknik özeti.

Özellik / Eylem SysAdmin Tenant Admin Tenant User Customer
Firma Oluşturma
Kullanıcı Ekleme ✅ (Kendi) 🔒 (Yetkiyle)
Rol Tanımlama ✅ (Kendi)
Tablo Tanımlama ✅ (Kendi) 🔒 (Yetkiyle)
Veri Girişi ✅ (Kendi)
Dashboard Tasarımı ✅ (Kendi)
Kod Yazma (Middleware) ✅ (Kendi)
Taklit (Impersonate)

17. Güvenlik ve Sınırlar

Platformun sağlığını korumak için, yazdığınız kodlarda bazı sınırlar vardır.

  1. Zaman Aşımı (Timeout): Herhangi bir kod parçası 5 saniye içinde tamamlanmazsa işlem iptal edilir.
  2. Bellek Limiti: 128 MB RAM.
  3. Yasaklı Komutlar: eval, process, fs, window.
  4. SSRF: Sandbox içinden yerel ağlara (Localhost, 192.168.x.x) erişim engellenmiştir.

18. Performans ve Ölçeklenebilirlik


BaseApp Pro - V1.0 - 2026