21 poin oleh xguru 2025-07-14 | 1 komentar | Bagikan ke WhatsApp
  • BaaS (Backend-as-a-Service) super ringan yang dibangun hanya dengan pustaka standar Go dalam kurang dari 1.000 baris kode
  • Menyediakan fungsi backend inti yang mirip Firebase/Supabase/Pocketbase berbasis file lokal
    • Penyimpanan data berbasis file menggunakan record berversi di CSV
    • REST API yang mengembalikan JSON
    • Autentikasi berbasis session cookie dan Basic Auth
    • Mendukung RBAC dan sistem izin berbasis pemilik
    • Validasi skema
    • Rendering template berbasis template Go

Cara kerja

  • Penyimpanan data

    • Semua data disimpan dalam file CSV yang dapat dibaca manusia, satu record per baris
    • Kolom pertama tetap sebagai ID record, kolom kedua sebagai nomor versi
    • Metode penyimpanannya append-only, jadi record lama tidak ditimpa dan setiap update selalu menambahkan baris versi baru
    • Saat membaca, hanya record versi terbaru yang selalu digunakan
    • Untuk pencarian dan update yang cepat, informasi file offset dari record versi terbaru untuk tiap resource disimpan sebagai indeks di memori
      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,""  
      
  • Manajemen pengguna dan izin

    • Kredensial pengguna dan daftar peran (Role) disimpan dalam file _users.csv
      admin,1,salt,5V5R4S...====,"admin"  
      alice,1,salt,PXHQWN...====,  
      
    • Menggunakan struktur CSV yang sama seperti semua resource lain, tetapi nama koleksinya adalah _users
    • Pengguna tidak bisa dibuat lewat API dan file harus diedit langsung
  • Manajemen izin

    • Aturan kontrol akses per resource didefinisikan di _permissions.csv
      p1,1,todo,read,,*,"Siapa pun yang terautentikasi dapat membaca ToDo"  
      p2,1,todo,create,,*,"Siapa pun yang terautentikasi dapat menambahkan ToDo baru"  
      p3,1,todo,update,owner,"admin,editor","admin/editor dapat memperbarui ToDo"  
      p4,1,todo,delete,owner,"admin,editor","admin/editor dapat menghapus ToDo"  
      
    • Setiap baris merepresentasikan satu aturan izin

REST API

  • Secara otomatis menyediakan REST API berdasarkan resource (koleksi) yang didefinisikan di _schemas.csv
  • GET /api/{resource}?sort_by={field} : mengambil semua record dari resource tersebut, bisa diurutkan
  • GET /api/{resource}/{id} : mengambil satu record dengan ID tertentu
  • POST /api/{resource} : membuat record baru, memerlukan izin "create"
  • PUT /api/{resource}/{id} : mengubah record yang ada, memerlukan izin "update"
  • DELETE /api/{resource}/{id} : menghapus record tertentu, memerlukan izin "delete"
  • GET /api/events/{resource} : berlangganan stream real-time server-side events (SSE) untuk resource tersebut, memerlukan izin "read"
  • Metode autentikasi

    • Mendukung autentikasi permintaan API dengan Basic Auth atau session cookie
    • Membuat session cookie:
      • kirim username dan password di body ke POST /api/login
      • respons akan menyertakan session cookie, sehingga permintaan berikutnya terautentikasi secara otomatis
    • Logout:
      • saat /api/logout dipanggil, sesi akan dibatalkan dan cookie dihapus

File statis dan template

  • Dapat langsung menyajikan file statis seperti HTML, CSS, JavaScript yang berada di direktori static
  • Selain itu, mendukung rendering template HTML menggunakan paket html/template dari Go
    • File template berada di direktori templates, dan akan dirender otomatis saat diakses melalui URL
  • Data dan fungsi yang dapat digunakan di template
    • .User: informasi pengguna yang sedang terautentikasi (nil jika belum terautentikasi)
    • .Store: instance store Pennybase (digunakan untuk mengambil atau membuat daftar resource)
    • .Request: objek HTTP request saat ini
    • .ID: ID resource yang sedang diakses (jika berlaku)
    • .Authorize: fungsi untuk memeriksa izin aksi pada resource tertentu

Fitur hook

  • Perilaku dapat diperluas dengan satu fungsi hook tunggal
  • Fungsi hook akan otomatis dipanggil saat operasi create, update, delete pada semua resource
  • Cara kerjanya

    • Fungsi hook bekerja dengan menerima empat argumen berikut:
      • trigger: jenis aksi (misalnya create, update, delete)
      • resource: nama resource target operasi
      • user: informasi pengguna yang menjalankan permintaan
      • res: data resource yang berubah
    • Anda bisa melakukan validasi tambahan atau modifikasi data di titik hooking
      • Misalnya, saat membuat resource pesan, author dan waktu pembuatan diisi otomatis
      • Jika fungsi hook mengembalikan error, aksi tersebut langsung dihentikan dan respons error dikirim ke klien
      • Ini bisa dimanfaatkan untuk menerapkan berbagai logika kustom seperti pemeriksaan izin tambahan, koreksi data otomatis, atau pemicu event eksternal

Batasan dan hal yang perlu diperhatikan

  • Semua manajemen pengguna/izin/skema harus dilakukan dengan mengedit file CSV secara langsung
  • Tidak cocok untuk data berskala besar, percabangan izin yang kompleks, atau lingkungan terdistribusi berperforma tinggi
  • Berjalan tanpa pustaka eksternal, hanya dengan kode standar Go (ditujukan untuk pembelajaran/penggunaan sederhana)
  • Lisensi MIT, kode sumber dan strukturnya bebas dimanfaatkan
  • Kontribusi diterima, tetapi mohon tetap menjaga kesederhanaan/kejelasan kode. Ke depannya pengelolaan akan lebih berfokus pada perbaikan bug daripada penambahan fitur

1 komentar

 
nemorize 2025-07-14

wow...