@node-tenant/tenant-storage-mongodb
v0.1.3
Published
MongoDB storage adapter for @node-tenant/tenant
Maintainers
Readme
@node-tenant/tenant-storage-mongodb
MongoDB storage adapter (Control Plane) for
@node-tenant/tenant🌐 Website: node-tenant.com
This package provides a MongoDB storage adapter for the multi-tenant control layer. It stores and manages the metadata (tenants, domains, organizations, relationships) inside a master MongoDB database.
It fully replaces Prisma, TypeORM, or Sequelize for storing the core tenant metadata.
Installation
npm install @node-tenant/tenant-storage-mongodb mongodbNote: Requires
mongodbas a peer dependency.
Usage
import { MongoClient } from 'mongodb';
import { TenantManager } from '@node-tenant/tenant-core';
import { createMongoStorage } from '@node-tenant/tenant-storage-mongodb';
// 1. Connect to MongoDB
const mongoClient = new MongoClient("mongodb://localhost:27017/");
await mongoClient.connect();
// 2. Select the "master" database for control layer data
const masterDb = mongoClient.db('master_tenants_db');
// 3. Create the storage adapter
const storage = createMongoStorage(masterDb);
// 4. Initialize the Tenant Manager
const manager = new TenantManager({ storage });
// Example: Create a new tenant
await manager.createTenant({
name: 'Acme Corp',
slug: 'acme',
status: 'active',
strategy: 'database', // or 'tenantId'
});Collections Created
This adapter will automatically create and manage documents in the following collections within your chosen database:
tenantstenant_organizationstenant_domainstenant_relationshipsresource_sharesaudit_logs
Integrating with the Data Plane
You can use MongoDB for both the Control Plane (metadata) and the Data Plane (tenant-specific data). How you integrate depends on your multi-tenancy strategy.
Strategy 1: Database-per-Tenant
Combine this package with @node-tenant/tenant-mongodb. The Control Plane uses masterDb, while the Data Plane creates a new database (tenant_<slug>) for each tenant.
import { createMongoDBDatabaseAdapter } from '@node-tenant/tenant-mongodb';
const dbAdapter = createMongoDBDatabaseAdapter({
client: mongoClient,
dbPrefix: 'tenant_', // Isolated databases: tenant_acme, tenant_xyz
});
const manager = new TenantManager({
storage: createMongoStorage(masterDb),
databaseAdapter: dbAdapter,
});Strategy 2: Shared Database (tenantId)
If you want all tenants to share the same master database (separating data logically by a tenantId field), you do not need a Database Adapter. You can simply use masterDb in your routes and append the tenantId.
const manager = new TenantManager({
storage: createMongoStorage(masterDb),
// Omit databaseAdapter entirely
});
// In your route handler:
app.get('/api/orders', async (req, res) => {
const tenant = (req as any).tenant;
// Use the masterDb directly and filter by tenantId
const orders = await masterDb.collection('orders').find({ tenantId: tenant.id }).toArray();
res.json(orders);
});License
MIT © Anupam Vishwakarma
