ctx.dataSourceManager

Manajer data source (instance DataSourceManager), untuk mengelola dan mengakses berbagai data source (seperti database utama main, database log logging, dll.). Digunakan saat ada multi-data-source atau perlu mengakses metadata lintas data source.

Skenario Penggunaan

SkenarioDeskripsi
Multi-Data-SourceEnumerate semua data source, mendapatkan data source tertentu berdasarkan key
Akses Lintas Data SourceSaat data source dari konteks saat ini tidak diketahui, mengakses metadata berdasarkan "key data source + nama data table"
Mendapatkan Field Berdasarkan Path LengkapMenggunakan format dataSourceKey.collectionName.fieldPath untuk mendapatkan definisi field lintas data source

Perhatian: Jika hanya beroperasi pada data source saat ini, lebih utamakan ctx.dataSource; gunakan ctx.dataSourceManager saat perlu enumerate atau berpindah data source.

Definisi Tipe

dataSourceManager: DataSourceManager;

class DataSourceManager {
  constructor();

  // Manajemen data source
  addDataSource(ds: DataSource | DataSourceOptions): void;
  upsertDataSource(ds: DataSource | DataSourceOptions): void;
  removeDataSource(key: string): void;
  clearDataSources(): void;

  // Pembacaan data source
  getDataSources(): DataSource[];                     // Mendapatkan semua data source
  getDataSource(key: string): DataSource | undefined;  // Mendapatkan data source berdasarkan key

  // Mengakses metadata berdasarkan data source + data table
  getCollection(dataSourceKey: string, collectionName: string): Collection | undefined;
  getCollectionField(fieldPathWithDataSource: string): CollectionField | undefined;
}

Hubungan dengan ctx.dataSource

KebutuhanPenggunaan yang Direkomendasikan
Data source tunggal yang terikat konteks saat inictx.dataSource (seperti data source dari halaman/block saat ini)
Entry point semua data sourcectx.dataSourceManager
Enumerate atau berpindah data sourcectx.dataSourceManager.getDataSources() / getDataSource(key)
Mendapatkan data table di dalam data source saat inictx.dataSource.getCollection(name)
Mendapatkan data table lintas data sourcectx.dataSourceManager.getCollection(dataSourceKey, collectionName)
Mendapatkan field di dalam data source saat inictx.dataSource.getCollectionField('users.profile.avatar')
Mendapatkan field lintas data sourcectx.dataSourceManager.getCollectionField('main.users.profile.avatar')

Contoh

Mendapatkan Data Source Tertentu

// Mendapatkan data source bernama 'main'
const mainDS = ctx.dataSourceManager.getDataSource('main');

// Mendapatkan semua data table di bawah data source tersebut
const collections = mainDS?.getCollections();

Mengakses Metadata Data Table Lintas Data Source

// Mendapatkan data table berdasarkan dataSourceKey + collectionName
const users = ctx.dataSourceManager.getCollection('main', 'users');
const orders = ctx.dataSourceManager.getCollection('main', 'orders');

// Mendapatkan primary key data table
const primaryKey = users?.filterTargetKey ?? 'id';

Mendapatkan Definisi Field Berdasarkan Path Lengkap

// Format: dataSourceKey.collectionName.fieldPath
// Mendapatkan definisi field berdasarkan "key data source.data table.path field"
const field = ctx.dataSourceManager.getCollectionField('main.users.profile.avatar');

// Mendukung path field relasi
const userNameField = ctx.dataSourceManager.getCollectionField('main.orders.createdBy.name');

Iterasi Semua Data Source

const dataSources = ctx.dataSourceManager.getDataSources();
for (const ds of dataSources) {
  ctx.logger.info(`Data source: ${ds.key}, Nama tampilan: ${ds.displayName}`);
  const collections = ds.getCollections();
  for (const col of collections) {
    ctx.logger.info(`  - Data table: ${col.name}`);
  }
}

Memilih Data Source secara Dinamis Berdasarkan Variabel

const dsKey = ctx.getVar('dataSourceKey') ?? 'main';
const collectionName = ctx.getVar('collectionName') ?? 'users';
const col = ctx.dataSourceManager.getCollection(dsKey, collectionName);
if (col) {
  const fields = col.getFields();
  // ...
}

Hal yang Perlu Diperhatikan

  • Format path getCollectionField adalah dataSourceKey.collectionName.fieldPath, segmen pertama adalah key data source, selanjutnya adalah nama data table dan path field.
  • getDataSource(key) mengembalikan undefined jika data source tidak ada, disarankan melakukan pengecekan null sebelum digunakan.
  • addDataSource akan melempar exception jika key sudah ada; upsertDataSource akan menimpa atau menambah.

Terkait