You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tailchat/server/services/core/config.service.ts

143 lines
3.5 KiB
TypeScript

import _ from 'lodash';
import {
TcService,
TcPureContext,
config,
TcDbService,
TcContext,
} from 'tailchat-server-sdk';
import type { ConfigDocument, ConfigModel } from '../../models/config';
/**
*
*/
interface ConfigService
extends TcService,
TcDbService<ConfigDocument, ConfigModel> {}
class ConfigService extends TcService {
config = {}; // 自管理的配置项globalConfig是同步过来的
get serviceName(): string {
return 'config';
}
onInit(): void {
this.registerLocalDb(require('../../models/config').default);
this.registerAction('client', this.client, {
cache: {
keys: [],
ttl: 24 * 60 * 60, // 1 day
},
});
this.registerAction('setClientConfig', this.setClientConfig, {
params: {
key: 'string',
value: 'any',
},
visibility: 'public',
});
this.registerAction('all', this.all, {
visibility: 'public',
});
this.registerAction('get', this.get, {
visibility: 'public',
params: {
key: 'string',
},
});
this.registerAction('set', this.set, {
visibility: 'public',
params: {
key: 'string',
value: 'any',
},
});
this.registerAction('addToSet', this.addToSet, {
visibility: 'public',
params: {
key: 'string',
value: 'any',
},
});
this.registerAuthWhitelist(['/client']);
if (config.env === 'development') {
this.cleanActionCache('client'); // 初始化时清理缓存
}
}
/**
*
*
* 使
*
* NOTICE:
*/
async client(ctx: TcPureContext) {
const persistConfig = await this.adapter.model.getAllClientPersistConfig();
return {
tianji: config.tianji,
uploadFileLimit: config.storage.limit,
emailVerification: config.emailVerification,
disableMsgpack: config.feature.disableMsgpack,
disableUserRegister: config.feature.disableUserRegister,
disableGuestLogin: config.feature.disableGuestLogin,
disableCreateGroup: config.feature.disableCreateGroup,
disablePluginStore: config.feature.disablePluginStore,
disableAddFriend: config.feature.disableAddFriend,
disableTelemetry: config.feature.disableTelemetry,
...persistConfig,
};
}
/**
* set client config in tailchat network
*
* usually call from admin
*/
async setClientConfig(
ctx: TcContext<{
key: string;
value: any;
}>
) {
const { key, value } = ctx.params;
const newConfig = await this.adapter.model.setClientPersistConfig(
key,
value
);
await this.cleanActionCache('client', []);
this.broadcastNotify(ctx, 'updateClientConfig', newConfig);
}
async all(ctx: TcContext) {
return this.config;
}
async get(ctx: TcContext<{ key: string }>) {
return this.config[ctx.params.key] ?? null;
}
async set(ctx: TcContext<{ key: string; value: any }>) {
const { key, value } = ctx.params;
_.set(this.config, key, value);
await this.broker.broadcast('config.updated', { config: this.config });
}
/**
*
*/
async addToSet(ctx: TcContext<{ key: string; value: any }>) {
const { key, value } = ctx.params;
const originConfig = _.get(this.config, key) ?? [];
_.set(this.config, key, _.uniq([...originConfig, value]));
await this.broker.broadcast('config.updated', { config: this.config });
}
}
export default ConfigService;