@astratra/store-postgres
v1.0.2
Published
PostgreSQL persistence adapters for Astratra SaaS stores.
Maintainers
Readme
@astratra/store-postgres
Adapters PostgreSQL réels pour les stores usersStore et settingsStore
attendus par @astratra/saas-kit — même contrat que @astratra/store-mongo,
moteur différent. Les deux packages sont indépendants ; un projet Astratra
choisit celui qui correspond à sa base de données.
Le package ne change pas saas-kit : il fournit juste une implémentation
persistante du même contrat que les stores mémoire de développement.
Installation
npm install @astratra/store-postgres pgpg est une dépendance peer optionnelle du package. En pratique, une
application qui gère déjà sa propre connexion Postgres garde son propre
Pool.
Utilisateurs
const { Pool } = require('pg');
const { createPostgresUsersStore } = require('@astratra/store-postgres');
const pool = new Pool({ connectionString: process.env.DATABASE_URL });
const usersStore = createPostgresUsersStore({
pool,
usersTable: 'app_users'
});La table est créée automatiquement au premier usage (CREATE TABLE IF NOT
EXISTS) avec un schéma volontairement souple : email et role sont des
colonnes indexées pour les requêtes rapides, mais l'objet utilisateur complet
(y compris tout champ métier propre à l'application — name, avatar,
tenantId...) est stocké tel quel dans une colonne data JSONB. Aucun schéma
SQL rigide à maintenir côté application.
Par défaut, email a un index unique. Pour désactiver cette contrainte :
const usersStore = createPostgresUsersStore({
pool,
uniqueEmail: false
});Paramètres
const { createPostgresSettingsStore } = require('@astratra/store-postgres');
const settingsStore = createPostgresSettingsStore({
pool,
settingsTable: 'app_settings'
});
await settingsStore.set('timezone', 'Europe/Paris');
const allSettings = await settingsStore.getAll();settingsStore stocke chaque réglage sous forme { key, value JSONB }.
Avec @astratra/saas-kit
const { createSaasApp } = require('@astratra/saas-kit');
const {
createPostgresSettingsStore,
createPostgresUsersStore
} = require('@astratra/store-postgres');
const app = createSaasApp({
usersStore: createPostgresUsersStore({ pool }),
settingsStore: createPostgresSettingsStore({ pool }),
notify,
verifyPassword
});Les méthodes retournent toujours des objets JavaScript simples (jamais une
ligne pg brute) : { ...donnéesJSONB, id }.
Cycle de vie de connexion
Chemin recommandé : passer un pool déjà géré par l'application. Dans ce
mode, l'adapter ne ferme jamais ce pool.
const usersStore = createPostgresUsersStore({ pool });
await usersStore.disconnect(); // no-op pour un pool injectéPour un script ou un petit service autonome, l'adapter peut créer et gérer
son propre Pool via connectionString. Dans ce cas, disconnect() ferme
réellement ce pool.
const usersStore = createPostgresUsersStore({
connectionString: process.env.DATABASE_URL
});
// ...
await usersStore.disconnect();Tests
npm test --workspace @astratra/store-postgresLes tests utilisent pg-mem (moteur SQL compatible Postgres en mémoire),
donc aucune instance PostgreSQL externe n'est requise.
