Releases: DropDeart/BaseForge
Release list
v0.6.2-beta: Merge pull request #3 from DropDeart/release/0.6.2-beta
chore(release): version 0.6.2-beta (English/Turkish Designer, English…
v0.6.0-beta
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.API0.6.0-beta'daki yeniBaseControlleryardı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.
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,authenticatedveya rol listesi; listedeownerkaydın sahibini ekler. ownerFieldcreate'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.
anonymousActionsgeriye dönük olarak çalışmaya devam eder.accesskullanmayan 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ı
roles: [Editor, SuperAdmin] # Admin ve User her zaman var
registration:
enabled: false # varsayılan: KAPALI
defaultRole: User- Kayıt kapalıyken
/api/account/register404 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)
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 servisprops'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/meve admin kullanıcı listesiprofiledöner;PUT /api/account/profile(selfalanlar) vePUT /api/admin/users/{id}/profile(hepsi) tipine göre doğrular. Giriş SPA'sında profil ve admin formları otomatik çizilir.user.protoartık auth.yaml'dan üretilir;identity/Userdış 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
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ız99'u kabul edip DB'ye yazıyordu.
Liste filtreleri ve okuma görünürlüğü
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.
readFilterlist 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
| Alan | Sorun | Etki |
|---|---|---|
| API / gRPC | CorrelationIdClientInterceptor DI'a kaydedilmiyordu |
Build başarılı, ilk gerçek gRPC çağrısında çökme. Artık AddBaseForge kaydediyor — mevcut projeler paket güncellemesiyle düzelir |
| Gateway | PathPattern dönüşümü /'ı kodluyordu |
/api/gateway/x/Listings/{id} gibi çok parçalı yollar 404 |
| Identity | Secret'lar auth.yaml kopyasına, imza sertifikası parolası appsettings.json'a yazılıyordu |
Commit edilen dosyalarda parola/secret. Artık yalnızca .env; boş bırakılan secret'lar .env'den geri yüklenir (CLI ve Designer) |
| Identity | Dış giriş, e-postası eşleşen parolalı hesaba otomatik bağlanıyordu | E-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şturuluyordu | Production'da tablolar hiç oluşmuyordu |
| Codegen | jwt.Authority koda gömülüydü |
Artık Auth:Authority ile ezilebilir |
| API | Authority modunda yedek issuer yoktu | Identity yeniden başlarken IDX10204 ile toplu 401. Auth:Issuer verilirse yedek geçerli issuer olur |
| API | İstek logu istisnadan önce yazılıyordu | Hatalı istekler loglarda 200 görünüyordu |
| Codegen | Yeni serviste wwwroot yoktu |
Yerel dotnet run'da görsel yükleme 500 |
| Identity | Admin paneli rol listesi sabitti | Yeni roller panelden atanamıyordu |
| Bağımlılık | Microsoft.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ık | Testlerde SSH.NET 2025.1.0 (yüksek) |
Testcontainers 4.15.0 |
| Codegen / Identity | KnownNetworks eskimiş (ASPDEPR005) |
KnownIPNetworks |
| Designer | Favicon yoktu | Her açılışta konsolda 404 |
| API | Veritabanı kısıt ihlalleri işlenmiyordu | Zorunlu 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) |
| Codegen | Yerel dotnet run'da host.docker.internal çözülmüyordu |
Loglar 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:
EnableJwtartıkMapInboundClaims = false,RoleClaimType = "role",NameClaimType = "sub"kullanıyor. Servis kodundaClaimTypes.Role/ClaimTypes.NameIdentifierile claim arayan yerler kısa adları (role/sub) aramalı.[Authorize(Roles = ...)]veUser.IsInRoleartık ek kod olmadan çalışır; projelerdeki elle yazılmışAdminAuthbenzeri 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'aregistration: { enabled: true }eklemeli. - Middleware sırası:
UseBaseForgeiçinde istek logu artık istisna yakalayıcının dışında.
Yükseltme
- Paketleri
0.6.0-beta'ya yükseltin, CLI'yı güncelleyin:dotnet tool update -g BaseForge.CodeGen --prerelease. - Servisleri yeniden üretin (
baseforge update <servis>); yetkilendirme içinaccess/ownerFieldekleyin. - Prod'da servis ortamına
Auth__Authorityve Identity'nin issuer'ıyla aynıAuth__Issuerverin. - Kayıt gerektiren Identity'lerde
registration.enabled: trueyazın.
Bilinen kısıtlar
superRolesmulti-tenant servislerde kiracı filtresini atlamaz.- Sayaç (increment) uçları her zaman herkese açık.
- Identity admin paneli yalnızca
Adminrolüne açık (SuperAdmin ayrıca Admin olmalı). EnsureCreatedvar 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.protonumaraları değişir — Identity veidentity/Usertüketicileri birlikte yeniden üretilmeli.
v0.4.1-beta
Servis sağlıklarının görüntülenmesi tamamlandı.
Outbox Transition Pattern
- Merkezi Loglama sistemine geçildi.
v0.3.2-beta
v0.3.1-beta
v0.3.0-beta
Sürüm güncellemesi için versiyon eklendi.
v0.2.3-alpha: feat(designer): Inspector Split açık tema + canlı ER diyagramı sekmesi
-CLI Komutlar Eklendi. Arayüz tamamlandı.
v0.2.2-alpha: fix(identity): authorize endpoint login'e 302 ile yönlendirsin
- EnableJwt: authority/JWKS (asimetrik, offline) doğrulama
- Merkez auth: config-driven Identity + baseforge new-identity (CLI scaffold)
- Interaktif login + sosyal sağlayıcı altyapısı (Google/GitHub/Microsoft/Facebook)
- Testcontainers gerçek Postgres entegrasyon testleri + CI
v0.2.1-alpha
- EnableJwt: authority/JWKS (asimetrik, offline) doğrulama
- UseBaseForge JWT etkinse auth middleware ekler
- Merkez auth (BaseForge.Identity) referans servisi
- Testcontainers gerçek Postgres entegrasyon testleri + CI