Skip to content

BaseForge v0.6.0-beta ​

Bu sürümün ana konuları yetkilendirme ve spec ifade gücü (enum, filtreler, görünürlük, opsiyonel ilişkiler): şimdiye kadar üretilen servisler yalnızca "giriş yapmış mı?" sorusunu soruyordu; artık rol ve kayıt sahipliği spec'ten, Designer'dan tanımlanabiliyor. Ayrıca HekimBurada ve diğer projelerde canlıda bulunup elle yamanan hataların tamamı generator'a taşındı.

Yükseltme notu: Generator ve kütüphane birlikte yükseltilmeli — üretilen kod BaseForge.API 0.6.0-beta'daki yeni BaseController yardımcılarını kullanır. Bkz. Kırıcı değişiklikler.

Yeni özellikler ​

Rol ve sahiplik tabanlı yetkilendirme (access / ownerField) ​

Ayrıntı ve gerekçeler: docs/ARCH.md §6.1.

yaml
auth:
  defaultAccess: authenticated   # belirtilmeyen action'lar (varsayılan)
  superRoles: [SuperAdmin]       # her kuralı otomatik geçer (SaaS platform sahibi)
entities:
  Order:
    ownerField: BuyerId
    access:
      list: [Admin, owner]       # Admin hepsini, diğerleri yalnızca kendi kayıtlarını görür
      create: authenticated
      update: [owner]
      delete: [Admin]
  • Action başına anonymous, authenticated veya rol listesi; listede owner kaydın sahibini ekler.
  • ownerField create'te token'dan damgalanır (istemcinin gönderdiği değer yok sayılır), update'te değiştirilemez.
  • Sahibi olmayan: update/delete → 403, başkasının kaydı getById → 404 (varlığı sızdırılmaz), list → yalnızca kendi kayıtları.
  • Görsel yükleme (/api/media) servisin varsayılan kuralını izler.
  • Kural controller'da hesaplanır, handler'da uygulanır; gRPC'nin kullanıcı bağlamsız servisler arası okumaları etkilenmez.
  • anonymousActions geriye dönük olarak çalışmaya devam eder. access kullanmayan mevcut spec'ler birebir aynı kodu üretir.
  • Servis spec'inde kullanılan bir rol Identity'de tanımlı değilse (yazım hatası) üretim sırasında uyarı verilir.

Identity: roller ve kayıt ayarı ​

yaml
roles: [Editor, SuperAdmin]   # Admin ve User her zaman var
registration:
  enabled: false              # varsayılan: KAPALI
  defaultRole: User
  • Kayıt kapalıyken /api/account/register 404 döner ve dış sağlayıcıyla (Google vb.) ilk kez gelen kullanıcıya da hesap açılmaz.
  • Admin paneli tanımlanan tüm rolleri atayabilir (önceden yalnızca Admin/User).
  • Giriş ekranı kayıt kapalıyken "Kayıt ol" bağlantısını gizler.

Identity: kullanıcı profil alanları (userProfile) ​

yaml
userProfile:
  props:
    Specialty: string
    DiplomaNo: { type: string, nullable: true, maxLength: 32 }
    VerificationStatus: { type: enum, values: [Pending, Approved, Rejected], default: Pending, editableBy: admin, inToken: true }
  • Alanlar ayrı bir tablo yerine doğrudan kullanıcıya (ApplicationUser) eklenir; tanım servis props'uyla aynıdır (enum, nullable, maxLength, default).
  • editableBy: self (varsayılan) → kullanıcı profil sayfasından düzenler; admin → yalnızca admin paneli. inToken: true → alan JWT claim'i olur.
  • /api/account/me ve admin kullanıcı listesi profile döner; PUT /api/account/profile (self alanlar) ve PUT /api/admin/users/{id}/profile (hepsi) tipine göre doğrular. Giriş SPA'sında profil ve admin formları otomatik çizilir.
  • user.proto artık auth.yaml'dan üretilir; identity/User dış referansı olan servisler aynı workspace'teki auth.yaml'ı okuyup profil alanlarını UserReference'ta alır.
  • Mevcut bir Identity veritabanına sonradan eklenen alanların kolonları açılışta oluşturulur (ADD COLUMN IF NOT EXISTS).
  • Önceden: HekimBurada'da yan tablo (DoctorProfile) + elle düzenlenmiş proto. Bkz. docs/ARCH.md §6.3.

Enum alan tipi ​

yaml
Status:
  type: enum
  values: [Draft, Pending, Active, Sold]
  default: Draft
  • Kodda gerçek C# enum (ListingStatus) — elle yazılan kodda tip güvenli karşılaştırma.
  • Veritabanında ve JSON'da (API + RabbitMQ olayları) değer adıyla string olarak saklanır; değer eklenip sıra değişse de eski kayıtlar bozulmaz.
  • Sayısal değerler reddedilir (BaseForge.Core.Serialization.StrictStringEnumConverter) — standart dönüştürücü tanımsız 99'u kabul edip DB'ye yazıyordu.

Liste filtreleri ve okuma görünürlüğü ​

yaml
Post:
  filterable: [Status, AuthorId]      # ?status=Live&authorId=...
  readFilter:
    where: { IsPublished: true }      # herkes yalnızca yayındakileri görür
    bypassRoles: [Admin]
    bypassOwner: true                 # yazar kendi taslaklarını da görür
  • Filtreler prop'lar, ilişki FK'leri ve dış referanslar için eşitlik filtresi üretir.
  • readFilter list ve getById'ye uygulanır (görünmeyen kayıt 404). gRPC servisler arası okumalar etkilenmez. Bkz. docs/ARCH.md §6.2.

Opsiyonel ilişkiler ​

relations altında nullable: true → FK Guid?; üst kategorisi olmayan kök kategori gibi hedefsiz kayıtlar artık oluşturulabilir (önceden FK ihlali).

Workspace'e Loki + Grafana ​

İlk üretimde workspace köküne observability/ eklenir: Loki, Grafana, hazır veri kaynağı ve "BaseForge - Servis Logları" dashboard'u (rastgele admin parolası .env'de). Önceden kullanıcının workspace'inde çalışan bir Loki yoktu ve loglar sessizce yalnızca konsola düşüyordu.

Designer ​

  • Enum değer listesi, opsiyonel ilişki kutusu, liste filtreleri ve görünürlük filtresi bölümleri.
  • Servis ayarlarında varsayılan erişim ve süper roller; entity editöründe sahip alanı ve action başına erişim tablosu; Identity panelinde roller, kayıt aç/kapa ve profil alanları.
  • Loglamanın nereye gittiği (Loki/Grafana) servis ayarlarında açıklanıyor.
  • baseforge new|update <servis> --no-browser: tarayıcıyı otomatik açmadan başlatır.

Önceki beta'dan beri eklenenler ​

  • API Gateway (YARP) üretimi, Sign in with Apple sağlayıcısı, UI Designer altyapısı, yerel CLI güncelleme script'i.

Hata düzeltmeleri ​

AlanSorunEtki
API / gRPCCorrelationIdClientInterceptor DI'a kaydedilmiyorduBuild başarılı, ilk gerçek gRPC çağrısında çökme. Artık AddBaseForge kaydediyor — mevcut projeler paket güncellemesiyle düzelir
GatewayPathPattern dönüşümü /'ı kodluyordu/api/gateway/x/Listings/{id} gibi çok parçalı yollar 404
IdentitySecret'lar auth.yaml kopyasına, imza sertifikası parolası appsettings.json'a yazılıyorduCommit edilen dosyalarda parola/secret. Artık yalnızca .env; boş bırakılan secret'lar .env'den geri yüklenir (CLI ve Designer)
IdentityDış giriş, e-postası eşleşen parolalı hesaba otomatik bağlanıyorduE-postayı doğrulamayan sağlayıcılar üzerinden hesap ele geçirme riski. Parolasız (admin'in eklediği) hesaplar bağlanmaya devam eder
CodegenŞema yalnızca Development'ta oluşturuluyorduProduction'da tablolar hiç oluşmuyordu
Codegenjwt.Authority koda gömülüydüArtık Auth:Authority ile ezilebilir
APIAuthority modunda yedek issuer yoktuIdentity yeniden başlarken IDX10204 ile toplu 401. Auth:Issuer verilirse yedek geçerli issuer olur
APIİstek logu istisnadan önce yazılıyorduHatalı istekler loglarda 200 görünüyordu
CodegenYeni serviste wwwroot yoktuYerel dotnet run'da görsel yükleme 500
IdentityAdmin paneli rol listesi sabittiYeni roller panelden atanamıyordu
BağımlılıkMicrosoft.OpenApi 2.0.0 (GHSA-v5pm-xwqc-g5wc)Üretilen servisler artık Microsoft.AspNetCore.OpenApi 10.0.12 ile yamalı sürümü alıyor
BağımlılıkTestlerde SSH.NET 2025.1.0 (yüksek)Testcontainers 4.15.0
Codegen / IdentityKnownNetworks eskimiş (ASPDEPR005)KnownIPNetworks
DesignerFavicon yoktuHer açılışta konsolda 404
APIVeritabanı kısıt ihlalleri işlenmiyorduZorunlu ilişkisi eksik kayıt / tekrar eden benzersiz alan 500 dönüyordu; artık 400 / 409 (tablo/kısıt adları sızdırılmaz)
CodegenYerel dotnet run'da host.docker.internal çözülmüyorduLoglar Loki'ye, JWT doğrulaması Identity'ye ulaşmıyordu; launchSettings.json artık localhost karşılıklarını veriyor

Kırıcı değişiklikler ​

  • JWT claim eşlemesi: EnableJwt artık MapInboundClaims = false, RoleClaimType = "role", NameClaimType = "sub" kullanıyor. Servis kodunda ClaimTypes.Role / ClaimTypes.NameIdentifier ile claim arayan yerler kısa adları (role / sub) aramalı. [Authorize(Roles = ...)] ve User.IsInRole artık ek kod olmadan çalışır; projelerdeki elle yazılmış AdminAuth benzeri sınıflar kaldırılabilir.
  • Kayıt varsayılan olarak kapalı: yeniden üretilen bir Identity'de kayıt kapanır. Kayıt gereken projeler auth.yaml'a registration: { enabled: true } eklemeli.
  • Middleware sırası: UseBaseForge içinde istek logu artık istisna yakalayıcının dışında.

Yükseltme ​

  1. Paketleri 0.6.0-beta'ya yükseltin, CLI'yı güncelleyin: dotnet tool update -g BaseForge.CodeGen --prerelease.
  2. Servisleri yeniden üretin (baseforge update <servis>); yetkilendirme için access / ownerField ekleyin.
  3. Prod'da servis ortamına Auth__Authority ve Identity'nin issuer'ıyla aynı Auth__Issuer verin.
  4. Kayıt gerektiren Identity'lerde registration.enabled: true yazın.

Bilinen kısıtlar ​

  • superRoles multi-tenant servislerde kiracı filtresini atlamaz.
  • Sayaç (increment) uçları her zaman herkese açık.
  • Identity admin paneli yalnızca Admin rolüne açık (SuperAdmin ayrıca Admin olmalı).
  • EnsureCreated var olan veritabanını güncellemez; servis spec'ine alan eklendiğinde mevcut DB için EF migration gerekir (Identity profil alanları hariç — onlar kolon olarak otomatik eklenir; silme/tip değişikliği elle).
  • Profil alanları kayıt formunda sorulmaz (kayıttan sonra profil sayfasında doldurulur). Alan sırası değişirse user.proto numaraları değişir — Identity ve identity/User tüketicileri birlikte yeniden üretilmeli.

MIT Lisansı ile yayınlanmıştır.