Extending Synchronized Data Sources
Overview
NocoBase allows users to extend data source types for user data synchronization as needed.
Server Side
Data Source Interface
The built-in user data synchronization plugin provides registration and management for data source types. To extend a data source type, inherit the SyncSource abstract class provided by the plugin and implement the relevant standard interfaces.
import { SyncSource, UserData } from '@nocobase/plugin-user-data-sync';
class CustomSyncSource extends SyncSource {
async pull(): Promise<UserData[]> {
return [];
}
}
The SyncSource class includes an options property to retrieve custom configurations for the data source.
import { SyncSource, UserData } from '@nocobase/plugin-user-data-sync';
class CustomSyncSource extends SyncSource {
async pull(): Promise<UserData[]> {
//...
const { appid, secret } = this.options;
//...
return [];
}
}
Description of UserData Fields
| Field | Description |
|---|
dataType | Data type, options are user and department |
uniqueKey | Unique identifier field |
records | Data records |
sourceName | Data source name |
If dataType is user, the records field contains the following fields:
| Field | Description |
|---|
id | User ID |
nickname | User nickname |
avatar | User avatar |
email | Email |
phone | Phone number |
departments | Array of department IDs |
If dataType is department, the records field contains the following fields:
| Field | Description |
|---|
id | Department ID |
name | Department name |
parentId | Parent department ID |
Example Implementation of the Data Source Interface
import { SyncSource, UserData } from '@nocobase/plugin-user-data-sync';
class CustomSyncSource extends SyncSource {
async pull(): Promise<UserData[]> {
// ...
const ThirdClientApi = new ThirdClientApi(
this.options.appid,
this.options.secret,
);
const departments = await this.clientapi.getDepartments();
const users = await this.clientapi.getUsers();
// ...
return [
{
dataType: 'department',
uniqueKey: 'id',
records: departments,
sourceName: this.instance.name,
},
{
dataType: 'user',
uniqueKey: 'id',
records: users,
sourceName: this.instance.name,
},
];
}
}
Registering a Data Source Type
The extended data source must be registered with the data management module.
import UserDataSyncPlugin from '@nocobase/plugin-user-data-sync';
class CustomSourcePlugin extends Plugin {
async load() {
const syncPlugin = this.app.pm.get(
UserDataSyncPlugin,
) as UserDataSyncPlugin;
if (syncPlugin) {
syncPlugin.sourceManager.registerType('custom-source-type', {
syncSource: CustomSyncSource,
title: 'Custom Source',
});
}
}
}
Client Side
The client user interface registers data source types using the registerType method provided by the user data synchronization plugin's client interface:
import SyncPlugin from '@nocobase/plugin-user-data-sync/client';
class CustomSourcePlugin extends Plugin {
async load() {
const sync = this.app.pm.get(SyncPlugin);
sync.registerType(authType, {
components: {
AdminSettingsForm, // Backend management form
},
});
}
}

The top section provides general data source configuration, while the bottom section allows for registration of custom configuration forms.