21 Punkte von xguru 2025-07-14 | 1 Kommentare | Auf WhatsApp teilen
  • Extrem kleines BaaS (Backend-as-a-Service), umgesetzt mit weniger als 1.000 Zeilen Code ausschließlich mit der Go-Standardbibliothek
  • Stellt zentrale Backend-Funktionen ähnlich wie Firebase/Supabase/Pocketbase auf Basis lokaler Dateien bereit
    • Dateibasierte Datenspeicherung mit versionierten Datensätzen in CSV
    • REST API, die JSON zurückgibt
    • Authentifizierung auf Basis von Session-Cookies und Basic Auth
    • Unterstützung für RBAC und ein eigentümerbasiertes Berechtigungssystem
    • Schemavalidierung
    • Template-Rendering auf Basis von Go-Templates

Funktionsweise

  • Datenspeicherung

    • Alle Daten werden in menschenlesbaren CSV-Dateien gespeichert, ein Datensatz pro Zeile
    • Die erste Spalte ist fest die Datensatz-ID, die zweite Spalte die Versionsnummer
    • Die Speicherung erfolgt append-only: Vorhandene Datensätze werden nicht überschrieben, stattdessen wird bei jedem Update immer eine neue Versionszeile angehängt
    • Beim Lesen wird immer nur die neueste Version eines Datensatzes verwendet
    • Für schnelle Abfragen und Updates wird pro Ressource ein In-Memory-Index der Dateioffsets der neuesten Datensatzversionen vorgehalten
      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,""  
      
  • Benutzer- und Berechtigungsverwaltung

    • Benutzer-Anmeldedaten und die Liste der Rollen werden in der Datei _users.csv gespeichert
      admin,1,salt,5V5R4S...====,"admin"  
      alice,1,salt,PXHQWN...====,  
      
    • Hat dieselbe CSV-Struktur wie alle anderen Ressourcen, aber mit dem Sammlungsnamen _users
    • Benutzer können nicht per API erstellt werden; die Datei muss zwingend direkt bearbeitet werden
  • Berechtigungsverwaltung

    • Zugriffsregeln pro Ressource werden in _permissions.csv definiert
      p1,1,todo,read,,*,"Jeder Authentifizierte kann ToDos lesen"  
      p2,1,todo,create,,*,"Jeder Authentifizierte kann neue ToDos hinzufügen"  
      p3,1,todo,update,owner,"admin,editor","admin/editor kann ToDos aktualisieren"  
      p4,1,todo,delete,owner,"admin,editor","admin/editor kann ToDos löschen"  
      
    • Jede Zeile entspricht genau einer Berechtigungsregel

REST API

  • Stellt automatisch eine REST API für die in _schemas.csv definierten Ressourcen (Collections) bereit
  • GET /api/{resource}?sort_by={field} : Ruft alle Datensätze der jeweiligen Ressource ab, Sortierung möglich
  • GET /api/{resource}/{id} : Ruft einen einzelnen Datensatz mit einer bestimmten ID ab
  • POST /api/{resource} : Erstellt einen neuen Datensatz, benötigt die Berechtigung "create"
  • PUT /api/{resource}/{id} : Ändert einen vorhandenen Datensatz, benötigt die Berechtigung "update"
  • DELETE /api/{resource}/{id} : Löscht einen bestimmten Datensatz, benötigt die Berechtigung "delete"
  • GET /api/events/{resource} : Abonniert den Echtzeit-Stream per Server-Sent Events (SSE) für die jeweilige Ressource, benötigt die Berechtigung "read"
  • Authentifizierungsverfahren

    • API-Anfragen unterstützen Basic Auth oder Session-Cookies zur Authentifizierung
    • Session-Cookie erstellen:
      • Anfrage an POST /api/login mit username und password im Body
      • Die Antwort enthält ein Session-Cookie, wodurch nachfolgende Anfragen automatisch authentifiziert werden
    • Logout:
      • Beim Aufruf von /api/logout wird die Session ungültig gemacht und das Cookie gelöscht

Statische Dateien und Templates

  • HTML-, CSS-, JavaScript- und andere statische Dateien im Verzeichnis static können direkt ausgeliefert werden
  • Zusätzlich wird mit dem Go-Paket html/template auch HTML-Template-Rendering unterstützt
    • Die Template-Dateien liegen im Verzeichnis templates und werden beim Zugriff über die URL automatisch gerendert
  • In Templates verfügbare Daten und Funktionen
    • .User: Informationen über den aktuell authentifizierten Benutzer (nil, wenn nicht authentifiziert)
    • .Store: Die Store-Instanz von Pennybase (zum Abrufen und Auflisten von Ressourcen)
    • .Request: Das aktuelle HTTP-Request-Objekt
    • .ID: Die ID der aktuell aufgerufenen Ressource (falls zutreffend)
    • .Authorize: Eine Funktion zum Prüfen der Aktionsberechtigung für eine bestimmte Ressource

Hook-Funktion

  • Das Verhalten kann über eine einzelne Hook-Funktion erweitert werden
  • Die Hook-Funktion wird bei Erstellen (create), Ändern (update) und Löschen (delete) für alle Ressourcen automatisch aufgerufen
  • Funktionsprinzip

    • Die Hook-Funktion arbeitet mit den folgenden vier Argumenten:
      • trigger: Art der Aktion (z. B. create, update, delete)
      • resource: Name der Zielressource
      • user: Benutzerinformationen des Ausführenden der Anfrage
      • res: Die geänderten Ressourcendaten
    • Am Hook-Punkt können zusätzliche Validierungen oder Datenänderungen vorgenommen werden
      • So können etwa beim Erstellen einer Nachrichtenressource automatisch Autor und Erstellungszeit eingetragen werden
      • Wenn die Hook-Funktion einen Fehler zurückgibt, wird die Aktion sofort abgebrochen und der Client erhält eine Fehlermeldung
      • Damit lassen sich verschiedenste Custom-Logiken umsetzen, etwa zusätzliche Berechtigungsprüfungen, automatische Datenkorrekturen oder das Auslösen externer Events

Einschränkungen und Hinweise

  • Die gesamte Verwaltung von Benutzern, Berechtigungen und Schemas erfordert direkte Bearbeitung der CSV-Dateien
  • Für große Datenmengen, komplexe Berechtigungszweige oder hochperformante verteilte Umgebungen ist es nicht geeignet
  • Läuft ohne externe Bibliotheken ausschließlich mit Standard-Go-Code (ausgelegt auf Lernen/einfache Nutzung)
  • MIT-Lizenz, Quellcode und Struktur können frei genutzt werden
  • Beiträge sind willkommen, aber bitte die Einfachheit/Klarheit des Codes bewahren. Geplant ist eher Pflege durch Bugfixes als die weitere Erweiterung des Funktionsumfangs

1 Kommentare

 
nemorize 2025-07-14

wow...