Liberium DB

Base de données distribuée NoSQL, compatible Firestore, conçue pour la performance et le temps réel.

Introduction

Liberium DB est un système de stockage de documents hautement disponible. Il utilise une architecture multi-tenant native, permettant de séparer logiquement les données de vos différents environnements ou clients.

Points Forts

  • Temps Réel : Abonnements via WebSockets pour des mises à jour instantanées.
  • Standard Firestore : API quasi-identique pour une adoption immédiate.
  • Souveraineté : Hébergé sur notre propre infrastructure distribuée.
  • Atomicité : Support complet des transactions et des écritures par lots (Batches).

Initialisation du SDK

Le SDK peut être utilisé dans le navigateur ou dans un environnement Node.js.

// Import via script tag (Browser)
<script src="https://liberium.net/sdk.js"></script>

// Initialisation
const db = new LiberiumDB({
  url: 'https://liberium.net',
  tenantId: 'votre-tenant-id',
  apiKey: 'votre-cle-api'
});

Modèle de Données

Les données sont organisées en Collections qui contiennent des Documents.

Collections

Conteneurs de documents. Pas de schéma rigide requis.

db.collection('users')

Documents

L'unité de base. Stocké au format JSON.

await docRef.get()

Opérations de Base

Ajouter/Écraser un document

La méthode set() crée ou remplace complètement un document.

await db.collection('posts').doc('my-post-id').set({
  title: 'Hello Liberium',
  content: 'Ceci est mon premier post',
  createdAt: LiberiumSentinels.serverTimestamp()
});

Mettre à jour partiellement

La méthode update() ne modifie que les champs spécifiés.

await db.collection('posts').doc('my-post-id').update({
  status: 'published'
});

Temps Réel (Abonnements)

Recevez des notifications dès qu'une donnée change dans la base.

// Écouter un document spécifique
db.collection('chats').doc('general').onSnapshot((doc) => {
  console.log("Nouveau message:", doc.data());
}, (error) => {
  console.error("Erreur d'écoute:", error);
});

// Écouter une requête entière
db.collection('tasks')
  .where('status', '==', 'pending')
  .onSnapshot((querySnapshot) => {
    querySnapshot.forEach(doc => {
      console.log(doc.id, " => ", doc.data());
    });
  });

Transactions et Atomicité

Transactions

Utilisez les transactions pour les opérations qui dépendent de la valeur actuelle d'un document (ex: compteur).

await db.runTransaction(async (transaction) => {
  const docRef = db.collection('stats').doc('counters');
  const sfDoc = await transaction.get(docRef);
  
  const newPopulation = (sfDoc.data().population || 0) + 1;
  transaction.update(docRef, { population: newPopulation });
});

Types de données et Sentinelles

En plus des types JSON standards, nous supportons des valeurs spéciales :

  • LiberiumSentinels.serverTimestamp() : Horodatage serveur.
  • LiberiumSentinels.deleteField() : Supprime un champ lors d'un update.
  • LiberiumSentinels.increment(n) : Incrémente une valeur numériquement.
  • LiberiumSentinels.arrayUnion(...items) : Ajoute des éléments à un tableau s'ils n'existent pas.