Plan Yönetimi
Endpoint'ler
GET /api/v1/admin/plans listele (pozisyona göre sıralı)
POST /api/v1/admin/plans oluştur
PATCH /api/v1/admin/plans/:code güncelle
POST /api/v1/admin/plans/:code/archive arşivle (yumuşak silme)Hepsi admin gerektirir.
Plan alanları
typescript
{
code: string, // 2–40 karakter, benzersiz kararlı tanımlayıcı
name: string, // 1–80 karakter, görüntü adı
description: string, // 0–500 karakter
position: number, // fiyat tablosunda sıralama
is_featured: boolean, // yükseltme sayfasında vurgula
is_public: boolean, // public fiyat listesinde görünür
is_active: boolean, // yeni abonelikler için mevcut
trial_days: number | null,
prices: {
try: { monthly: number, yearly: number },
usd?: { monthly: number, yearly: number } | null,
},
limits: {
social_accounts: number,
posts_per_month: number, // -1 = sınırsız
ai_credits: number,
team_members: number,
storage_mb: number,
scheduled_posts_max: number,
marketplace_sales: number,
},
features: string[], // insan-okunabilir madde işareti listesi
metadata: Record<string, string>, // sağlayıcıya özgü ref'ler (Stripe price ID'leri vb.)
}Sağlayıcı metadata
Stripe kullanırken, price ID'leri metadata'da sakla:
json
{
"stripe_price_id_monthly": "price_1ABC...",
"stripe_price_id_yearly": "price_1XYZ..."
}Aynı pattern Iyzico (iyzico_subscription_pricing_plan_*) ve PayTR için de geçerlidir.
Arşivleme vs silme
Arşivle (is_active: false + lifecycle hook), planı yeni kayıtlardan gizler ama mevcut aboneleri korur. Geçmiş verilerin kazara kaybını önlemek için sert silme yoktur.