21 puan yazan xguru 2025-07-14 | 1 yorum | WhatsApp'ta paylaş
  • Yalnızca Go standart kütüphanesiyle, 1.000 satırdan az kodla uygulanmış çok küçük bir BaaS (Backend-as-a-Service)
  • Firebase/Supabase/Pocketbase'e benzer temel backend özelliklerini yerel dosyalar tabanında sunar
    • Sürümlemeli kayıtları CSV içinde kullanan dosya tabanlı veri depolama
    • JSON döndüren REST API
    • Oturum çerezleri ve Basic Auth tabanlı kimlik doğrulama
    • RBAC ve sahip tabanlı yetkilendirme sistemi desteği
    • Şema doğrulama
    • Go template tabanlı şablon render etme

Nasıl çalışır

  • Veri depolama

    • Tüm veriler, insan tarafından okunabilir CSV dosyalarında, her satırda bir kayıt olacak şekilde saklanır
    • İlk sütun kayıt ID'si, ikinci sütun sürüm numarası olarak sabittir
    • Saklama yöntemi append-only'dir; mevcut kayıtların üzerine yazılmaz, her güncellemede her zaman yeni bir sürüm satırı eklenir
    • Okuma işlemlerinde her zaman yalnızca kaydın en güncel sürümü kullanılır
    • Hızlı sorgulama ve güncelleme için, her kaynak adına ait en güncel sürüm kayıtlarının dosya ofset bilgisi bellekte bir indeks olarak tutulur
      s1,1,_permissions,_id,text,,,^.+$  
      s2,1,_permissions,_v,number,1,,  
      s3,1,_permissions,resource,text,,,^.+$  
      s4,1,_permissions,action,text,,,^.+$  
      s5,1,_permissions,field,text,,,^.*$  
      s6,1,_permissions,role,text,,,^.*$  
      s7,1,_users,_id,text,,,^.+$  
      s8,1,_users,_v,number,1,,  
      s9,1,_users,salt,text,,,  
      s10,1,_users,password,text,,,^.+$  
      s11,1,_users,roles,list,,,  
      s12,1,todo,_id,text,,,^.+$  
      s13,1,todo,_v,number,1,,  
      s14,1,todo,description,text,0,0,".+"  
      s15,1,todo,completed,number,0,1,""  
      
  • Kullanıcı ve yetki yönetimi

    • Kullanıcı kimlik bilgileri ve rol listeleri _users.csv dosyasında saklanır
      admin,1,salt,5V5R4S...====,"admin"  
      alice,1,salt,PXHQWN...====,  
      
    • Diğer tüm kaynaklarla aynı CSV yapısı kullanılır, ancak koleksiyon adı _users olur
    • API üzerinden kullanıcı oluşturulamaz; dosya mutlaka doğrudan düzenlenmelidir
  • Yetki yönetimi

    • Kaynak bazlı erişim kontrol kuralları _permissions.csv içinde tanımlanır
      p1,1,todo,read,,*,"Kimliği doğrulanmış herkes ToDo okuyabilir"  
      p2,1,todo,create,,*,"Kimliği doğrulanmış herkes yeni ToDo ekleyebilir"  
      p3,1,todo,update,owner,"admin,editor","admin/editor ToDo güncelleyebilir"  
      p4,1,todo,delete,owner,"admin,editor","admin/editor ToDo silebilir"  
      
    • Her satır tek bir yetki kuralını ifade eder

REST API

  • _schemas.csv içinde tanımlanan kaynaklara (koleksiyonlara) göre REST API otomatik olarak sunulur
  • GET /api/{resource}?sort_by={field} : ilgili kaynağın tüm kayıtlarını getirir, sıralama yapılabilir
  • GET /api/{resource}/{id} : belirli bir ID'ye sahip tek kaydı getirir
  • POST /api/{resource} : yeni kayıt oluşturur, "create" yetkisi gerekir
  • PUT /api/{resource}/{id} : mevcut kaydı değiştirir, "update" yetkisi gerekir
  • DELETE /api/{resource}/{id} : belirli bir kaydı siler, "delete" yetkisi gerekir
  • GET /api/events/{resource} : ilgili kaynağın server-side events (SSE) gerçek zamanlı akışına abone olur, "read" yetkisi gerekir
  • Kimlik doğrulama yöntemi

    • API istekleri için Basic Auth veya oturum çerezi tabanlı kimlik doğrulama desteklenir
    • Oturum çerezi oluşturma:
      • POST /api/login isteğine body içinde username ve password gönderilir
      • Yanıtta oturum çerezi yer alır ve sonraki isteklerde otomatik kimlik doğrulama sağlanır
    • Çıkış yapma:
      • /api/logout çağrıldığında oturum geçersiz kılınır ve çerez silinir

Statik dosyalar ve şablonlar

  • static dizini içindeki HTML, CSS, JavaScript gibi statik dosyalar doğrudan servis edilebilir
  • Buna ek olarak, Go'nun html/template paketi kullanılarak HTML şablon render etme de desteklenir
    • Şablon dosyaları templates dizininde bulunur ve URL üzerinden erişildiğinde otomatik olarak render edilir
  • Şablonlarda kullanılabilecek veri ve fonksiyonlar
    • .User: o anda kimliği doğrulanmış kullanıcı bilgisi (kimlik doğrulanmamışsa nil)
    • .Store: Pennybase'in store örneği (kaynak sorgulama ve listeleme için kullanılır)
    • .Request: mevcut HTTP istek nesnesi
    • .ID: erişilen kaynağın ID'si (uygunsa)
    • .Authorize: belirli bir kaynak üzerinde eylem yetkisini kontrol eden fonksiyon

Hook özelliği

  • Tek bir hook fonksiyonuyla davranış genişletilebilir
  • Hook fonksiyonu, tüm kaynaklarda oluşturma (create), güncelleme (update), silme (delete) işlemlerinde otomatik olarak çağrılır
  • Çalışma prensibi

    • Hook fonksiyonu aşağıdaki dört argümanı alır:
      • trigger: eylem türü (ör. create, update, delete)
      • resource: işlem yapılan kaynağın adı
      • user: isteği yapan kullanıcının bilgisi
      • res: değişen kaynak verisi
    • Hook noktasında ek doğrulama veya veri değiştirme yapılabilir
      • Örnekte olduğu gibi, mesaj kaynağı oluşturulurken author ve oluşturulma zamanı otomatik olarak girilebilir
      • Hook fonksiyonu hata döndürürse ilgili eylem anında durdurulur ve istemciye hata yanıtı iletilir
      • Bu sayede ek yetki kontrolleri, otomatik veri düzeltme, harici olay tetikleme gibi çeşitli özel mantıklar uygulanabilir

Sınırlamalar ve dikkat edilmesi gerekenler

  • Tüm kullanıcı/yetki/şema yönetimi için CSV dosyalarının doğrudan düzenlenmesi gerekir
  • Büyük ölçekli veri, karmaşık yetki dallanmaları veya yüksek performanslı dağıtık ortamlar için uygun değildir
  • Harici kütüphane olmadan, yalnızca standart Go koduyla çalışır (öğrenme amaçlı/basit kullanım odaklı)
  • MIT lisanslıdır; kaynak kod ve yapı serbestçe kullanılabilir
  • Katkılar memnuniyetle karşılanır, ancak kodun sadeliği/açıklığı korunmalıdır. Yeni özellik eklemekten çok hata düzeltmeleri odakta tutulacaktır

1 yorum

 
nemorize 2025-07-14

vay...