Özet
Özet
- Bir SaaS uygulamasını à-la-carte özellik abonelikleri (özellik başına ödeme) modelinden planlar-only (katmana göre ödeme, özelliklerini al) modeline geçirdi.
- Bunu dört aşamada gerçekleştirdi, böylece hiçbir şey ortada kalmadı: planları ekle → planlara geçiş → organizasyonları migrate et → eski yapıyı kaldır.
- Ders: model migrasyonları, büyük bir değişiklik değil, genişlet, migrate et, daralt şeklinde yapılır; bir anda değiştirmekten daha güvenlidir.
Sorun
Sorun
Eski faturalama sistemi, bir organizasyonun bireysel özelliklere à la carte olarak abone olmasına izin veriyordu. Kağıt üzerinde esnek, pratikte acı verici: hak sahibi(logika) mantığı, iki doğru kaynağa (özellik başına abonelik ve dolaylı bir plan) sahipti ve her kuralın her iki kontrolü de kontrol etmesi gerekiyordu. Tek bir modele düşürme zamanı geldi – bir plan satın alıyorsunuz, plan özellikleri taşır.
Bu tür değişikliklerdeki tuzak, eski sütunları bir anda sökmek isteği. Bunu yaparsanız, her aktifteki abonelik, her kural kontrolü ve eski dili konuşan her webhook anında bozulur.
Aşamalı Plan
Aşamalı Plan
Bunu dört aşamada yönettim. Her aşama kendi başına dağıtılabilir ve uygulamayı çalışır durumda bırakır.
| Aşama | Yaptığı İş | Neden Bu Sıra |
|---|---|---|
| F1 | Planları ön koşul zincirine ekle | Yeni model, hiçbir şey okumadan önce mevcut olmalıdır |
| F2 | Özellikleri plan üzerinde kontrol et, değil özellik aboneliği | Okumalar geçiş yaparken yazma işlemleri hala çift çalışır |
| F3 | Mevcut organizasyonları plana geçir | Eski modelde kimse kalmaması |
| F4 | À-la-carte yapılarını kaldır | Darlık – yalnızca F3’ten sonra güvenli |
Bu, bir alan modeline uygulanan genişlet/daralt kalıbıdır, sadece bir şemaya değil. Genişlet (F1) yeni şeyi eskisinin yanına ekler. Migrate et (F2–F3) okumaları ardından veriyi taşır. Daralt (F4), artık ona işaret eden hiçbir şey kalmadığında eski şeyin silinmesini sağlar.
F1 seed F2 gate on plan F3 backfill orgs F4 drop features
┌────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ plans │ --> │ reads: plan │ -> │ every org on │ -> │ delete a-la- │
│ exist │ │ writes: both │ │ a real plan │ │ carte code │
└────────┘ └──────────────┘ └──────────────┘ └──────────────┘
safe safe safe safe
Plana Göre Kontrol
Plana Göre Kontrol
Kontrol, tek bir soruya çöker: bu organizasyonun planı özelliği veriyor mu? Tek bir hak sahibi yerine iki kontrol.
final class EnsureFeatureAccess
{
public function handle(Request $request, Closure $next, string $feature)
{
$plan = $request->user()->organization->currentPlan();
abort_unless($plan?->grants($feature), 403, 'Upgrade required.');
return $next($request);
}
}
Öne çıkarılması gereken iki uç durum var. Metered özellikler (e-posta gönderimleri, sertifika çıkışı) sadece açık/kapalı değildir – plan bir kredi dengesi sağlar, bu yüzden kontrol kalan kotaları kontrol eder, sadece hak sahipliği değil. Ve internal organizasyonlar (superadmin sahipliğinde) üst düzey planı kalıcı olarak alırlar; bu nedenle operasyon araçları hiçbir zaman ücretlendirme duvarına takılmaz.
Ödeme Durumlarına Dair
Ödeme Durumlarına Dair
Faturalama sürecinde, genellikle yaşanan ödeme ağ geçidi sorunları ortaya çıktı: bir sipariş referansının geçidin 30 karakterlik sınırını aşması, null ödeme telefonunun her ödenen organizasyon için çıkışı engellemesi ve doğrulama hatalarının yüzeye çıkmak yerine gizlenmesi. Bunlar göz alıcı değil – ancak bir fatura migrasyonu, her organizasyonun bir anda yeniden abone olduğu tam zamanıdır.
Kontrolü Test Etme
Kontrolü Test Etme
Önemli olan davranış: hiçbir plan → engellenir; plan veriyorsa → izin verilir.
it('planın vermediği bir özelliği engeller', function () {
$org = Organization::factory()->onPlan()->create();
actingAs($org->owner)
->get()
->assertForbidden();
});
it(, function () {
$org = Organization::factory()->onPlan()->create();
actingAs($org->owner)
->get()
->assertOk();
});
Alınacak Ders
Alınacak Ders
Hak sahipliği işleyişini değiştirdiğinizde, bunu bir şema migrasyonu gibi ele alın; bu iş mantığı olmasına rağmen. Genişletin, okumaları taşımak, verileri migrate etmek ve sonra daraltın – her seferde bir dağıtılabilir aşamada. Dört aşamalı migrasyon yükü, kimsenin erişemediği bir fatura kesiminde yaşanan bir kesintiye göre ucuzdur.
Kaynak: Orijinal Makale


