21 points par xguru 2025-07-14 | 1 commentaires | Partager sur WhatsApp
  • Mini BaaS (Backend-as-a-Service) implémenté uniquement avec la bibliothèque standard Go, en moins de 1 000 lignes de code
  • Fournit, sur la base de fichiers locaux, des fonctionnalités backend essentielles similaires à Firebase/Supabase/Pocketbase
    • Stockage de données basé sur des fichiers avec des enregistrements versionnés dans des CSV
    • API REST renvoyant du JSON
    • Authentification basée sur des cookies de session et Basic Auth
    • Prise en charge de RBAC et d’un système de permissions basé sur le propriétaire
    • Validation de schéma
    • Rendu de templates basé sur les templates Go

Fonctionnement

  • Stockage des données

    • Toutes les données sont stockées dans des fichiers CSV lisibles par un humain, à raison d’un enregistrement par ligne
    • La première colonne est fixée à l’ID de l’enregistrement, la deuxième au numéro de version
    • Le mode de stockage est append-only : les enregistrements existants ne sont jamais écrasés et chaque mise à jour ajoute toujours une nouvelle ligne de version
    • Lors de la lecture, seule la version la plus récente de chaque enregistrement est utilisée
    • Pour accélérer les consultations et les mises à jour, un index mémoire des offsets de fichier des enregistrements dans leur dernière version est conservé pour chaque ressource
      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,""  
      
  • Gestion des utilisateurs et des permissions

    • Les informations d’authentification utilisateur et la liste des rôles sont stockées dans le fichier _users.csv
      admin,1,salt,5V5R4S...====,"admin"  
      alice,1,salt,PXHQWN...====,  
      
    • La structure CSV est identique à celle de toutes les autres ressources, mais le nom de collection est _users
    • La création d’utilisateurs via l’API n’est pas possible : il faut impérativement modifier le fichier directement
  • Gestion des permissions

    • Les règles de contrôle d’accès par ressource sont définies dans _permissions.csv
      p1,1,todo,read,,*,"Toute personne authentifiée peut lire les ToDo"  
      p2,1,todo,create,,*,"Toute personne authentifiée peut ajouter un nouveau ToDo"  
      p3,1,todo,update,owner,"admin,editor","Les admin/editor peuvent mettre à jour les ToDo"  
      p4,1,todo,delete,owner,"admin,editor","Les admin/editor peuvent supprimer les ToDo"  
      
    • Chaque ligne représente une règle de permission

API REST

  • Fournit automatiquement une API REST à partir des ressources (collections) définies dans _schemas.csv
  • GET /api/{resource}?sort_by={field} : récupère tous les enregistrements de la ressource, avec possibilité de tri
  • GET /api/{resource}/{id} : récupère un enregistrement unique ayant cet ID
  • POST /api/{resource} : crée un nouvel enregistrement, nécessite la permission "create"
  • PUT /api/{resource}/{id} : modifie un enregistrement existant, nécessite la permission "update"
  • DELETE /api/{resource}/{id} : supprime un enregistrement donné, nécessite la permission "delete"
  • GET /api/events/{resource} : s’abonne au flux temps réel en server-side events (SSE) de cette ressource, nécessite la permission "read"
  • Mode d’authentification

    • L’authentification des requêtes API prend en charge Basic Auth ou les cookies de session
    • Création du cookie de session :
      • envoyer une requête à POST /api/login avec username et password dans le body
      • la réponse inclut un cookie de session, utilisé ensuite pour authentifier automatiquement les requêtes
    • Déconnexion :
      • en appelant /api/logout, la session est invalidée et le cookie supprimé

Fichiers statiques et templates

  • Peut servir directement des fichiers statiques HTML, CSS, JavaScript, etc. placés dans le répertoire static
  • En complément, le rendu de templates HTML est également pris en charge via le package html/template de Go
    • Les fichiers de template se trouvent dans le répertoire templates et sont automatiquement rendus lorsqu’on y accède par URL
  • Données et fonctions utilisables dans les templates
    • .User : informations sur l’utilisateur actuellement authentifié (nil s’il ne l’est pas)
    • .Store : instance de stockage de Pennybase (utilisée pour consulter et lister les ressources)
    • .Request : objet de la requête HTTP courante
    • .ID : ID de la ressource en cours d’accès (si applicable)
    • .Authorize : fonction permettant de vérifier le droit d’exécuter une action sur une ressource donnée

Fonction de hooks

  • Le comportement peut être étendu à l’aide d’une unique fonction de hook
  • La fonction de hook est automatiquement appelée lors des opérations de création (create), modification (update) et suppression (delete) sur toutes les ressources
  • Principe de fonctionnement

    • La fonction de hook reçoit les quatre arguments suivants :
      • trigger : type d’action (par ex. create, update, delete)
      • resource : nom de la ressource concernée
      • user : informations sur l’utilisateur qui exécute la requête
      • res : données de la ressource modifiée
    • Il est possible d’effectuer une validation supplémentaire ou de modifier les données au point de hook
      • Par exemple, lors de la création d’une ressource de message, l’auteur et l’heure de création peuvent être renseignés automatiquement
      • Si la fonction de hook retourne une erreur, l’action est immédiatement interrompue et une réponse d’erreur est renvoyée au client
      • Cela permet d’implémenter diverses logiques personnalisées, comme des vérifications d’autorisation supplémentaires, la correction automatique des données ou le déclenchement d’événements externes

Limites et points d’attention

  • Toute la gestion des utilisateurs, permissions et schémas nécessite une édition directe des fichiers CSV
  • Ne convient pas aux gros volumes de données, aux règles de permissions complexes ni aux environnements distribués à haute performance
  • Fonctionne sans bibliothèque externe, uniquement avec le code standard de Go (orienté apprentissage / usage léger)
  • Licence MIT, avec liberté d’utiliser le code source et la structure
  • Les contributions sont les bienvenues, mais il faut préserver la simplicité / clarté du code. La maintenance prévue privilégie les corrections de bugs plutôt que l’ajout de nouvelles fonctionnalités

1 commentaires

 
nemorize 2025-07-14

waouh...