From 803e35b14c16c757e88e85b090c49c5f30f5e4c5 Mon Sep 17 00:00:00 2001 From: samanhappy Date: Sun, 23 Nov 2025 22:57:44 +0800 Subject: [PATCH] refactor: Simplify DataService implementation and remove unused DataServicex (#448) --- src/dao/examples.ts | 2 +- src/services/dataService.test.ts | 13 ------ src/services/dataService.ts | 80 +++++++++++++++++++++++--------- src/services/dataServicex.ts | 73 ----------------------------- src/services/services.ts | 9 +--- 5 files changed, 62 insertions(+), 115 deletions(-) delete mode 100644 src/services/dataService.test.ts delete mode 100644 src/services/dataServicex.ts diff --git a/src/dao/examples.ts b/src/dao/examples.ts index e0870ab..73962b9 100644 --- a/src/dao/examples.ts +++ b/src/dao/examples.ts @@ -187,7 +187,7 @@ export async function exampleUserConfigOperations() { console.log('All user configs:', Object.keys(allUserConfigs)); // Get specific section for user - const userRoutingConfig = await userConfigDao.getSection('admin', 'routing'); + const userRoutingConfig = await userConfigDao.getSection('admin', 'routing' as never); console.log('Admin routing config:', userRoutingConfig); // Delete user configuration diff --git a/src/services/dataService.test.ts b/src/services/dataService.test.ts deleted file mode 100644 index 984cfa8..0000000 --- a/src/services/dataService.test.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { DataService } from './dataService.js'; -import { getDataService } from './services.js'; -import './services.js'; - -describe('DataService', () => { - test('should get default implementation and call foo method', async () => { - const dataService: DataService = await getDataService(); - const consoleSpy = jest.spyOn(console, 'log'); - dataService.foo(); - expect(consoleSpy).toHaveBeenCalledWith('default implementation'); - consoleSpy.mockRestore(); - }); -}); diff --git a/src/services/dataService.ts b/src/services/dataService.ts index 0905008..4160afa 100644 --- a/src/services/dataService.ts +++ b/src/services/dataService.ts @@ -1,31 +1,69 @@ import { IUser, McpSettings } from '../types/index.js'; +import { UserContextService } from './userContextService.js'; +import { UserConfig } from '../types/index.js'; -export interface DataService { - foo(): void; - filterData(data: any[], user?: IUser): any[]; - filterSettings(settings: McpSettings, user?: IUser): McpSettings; - mergeSettings(all: McpSettings, newSettings: McpSettings, user?: IUser): McpSettings; - getPermissions(user: IUser): string[]; -} - -export class DataServiceImpl implements DataService { - foo() { - console.log('default implementation'); +export class DataService { + filterData(data: any[], user?: IUser): any[] { + // Use passed user parameter if available, otherwise fall back to context + const currentUser = user || UserContextService.getInstance().getCurrentUser(); + if (!currentUser || currentUser.isAdmin) { + return data; + } else { + return data.filter((item) => item.owner === currentUser?.username); + } } - filterData(data: any[], _user?: IUser): any[] { - return data; + filterSettings(settings: McpSettings, user?: IUser): McpSettings { + // Use passed user parameter if available, otherwise fall back to context + const currentUser = user || UserContextService.getInstance().getCurrentUser(); + if (!currentUser || currentUser.isAdmin) { + const result = { ...settings }; + delete result.userConfigs; + return result; + } else { + const result = { ...settings }; + // TODO: apply userConfig to filter settings as needed + // const userConfig = settings.userConfigs?.[currentUser?.username || '']; + delete result.userConfigs; + return result; + } } - filterSettings(settings: McpSettings, _user?: IUser): McpSettings { - return settings; + mergeSettings(all: McpSettings, newSettings: McpSettings, user?: IUser): McpSettings { + // Use passed user parameter if available, otherwise fall back to context + const currentUser = user || UserContextService.getInstance().getCurrentUser(); + if (!currentUser || currentUser.isAdmin) { + const result = { ...all }; + result.mcpServers = newSettings.mcpServers; + result.users = newSettings.users; + result.systemConfig = newSettings.systemConfig; + result.groups = newSettings.groups; + result.oauthClients = newSettings.oauthClients; + result.oauthTokens = newSettings.oauthTokens; + return result; + } else { + const result = JSON.parse(JSON.stringify(all)); + if (!result.userConfigs) { + result.userConfigs = {}; + } + const systemConfig = newSettings.systemConfig || {}; + const userConfig: UserConfig = { + routing: systemConfig.routing + ? { + // TODO: only allow modifying certain fields based on userConfig permissions + } + : undefined, + }; + result.userConfigs[currentUser?.username || ''] = userConfig; + return result; + } } - mergeSettings(all: McpSettings, newSettings: McpSettings, _user?: IUser): McpSettings { - return newSettings; - } - - getPermissions(_user: IUser): string[] { - return ['*']; + getPermissions(user: IUser): string[] { + if (user && user.isAdmin) { + return ['*', 'x']; + } else { + return ['']; + } } } diff --git a/src/services/dataServicex.ts b/src/services/dataServicex.ts deleted file mode 100644 index 01a4af4..0000000 --- a/src/services/dataServicex.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { IUser, McpSettings, UserConfig } from '../types/index.js'; -import { DataService } from './dataService.js'; -import { UserContextService } from './userContextService.js'; - -export class DataServicex implements DataService { - foo() { - console.log('default implementation'); - } - - filterData(data: any[], user?: IUser): any[] { - // Use passed user parameter if available, otherwise fall back to context - const currentUser = user || UserContextService.getInstance().getCurrentUser(); - if (!currentUser || currentUser.isAdmin) { - return data; - } else { - return data.filter((item) => item.owner === currentUser?.username); - } - } - - filterSettings(settings: McpSettings, user?: IUser): McpSettings { - // Use passed user parameter if available, otherwise fall back to context - const currentUser = user || UserContextService.getInstance().getCurrentUser(); - if (!currentUser || currentUser.isAdmin) { - const result = { ...settings }; - delete result.userConfigs; - return result; - } else { - const result = { ...settings }; - // TODO: apply userConfig to filter settings as needed - // const userConfig = settings.userConfigs?.[currentUser?.username || '']; - delete result.userConfigs; - return result; - } - } - - mergeSettings(all: McpSettings, newSettings: McpSettings, user?: IUser): McpSettings { - // Use passed user parameter if available, otherwise fall back to context - const currentUser = user || UserContextService.getInstance().getCurrentUser(); - if (!currentUser || currentUser.isAdmin) { - const result = { ...all }; - result.mcpServers = newSettings.mcpServers; - result.users = newSettings.users; - result.systemConfig = newSettings.systemConfig; - result.groups = newSettings.groups; - result.oauthClients = newSettings.oauthClients; - result.oauthTokens = newSettings.oauthTokens; - return result; - } else { - const result = JSON.parse(JSON.stringify(all)); - if (!result.userConfigs) { - result.userConfigs = {}; - } - const systemConfig = newSettings.systemConfig || {}; - const userConfig: UserConfig = { - routing: systemConfig.routing - ? { - // TODO: only allow modifying certain fields based on userConfig permissions - } - : undefined, - }; - result.userConfigs[currentUser?.username || ''] = userConfig; - return result; - } - } - - getPermissions(user: IUser): string[] { - if (user && user.isAdmin) { - return ['*', 'x']; - } else { - return ['']; - } - } -} diff --git a/src/services/services.ts b/src/services/services.ts index 0e64d9e..c09f481 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -1,10 +1,5 @@ -import { registerService, getService } from './registry.js'; -import { DataService, DataServiceImpl } from './dataService.js'; - -await registerService('dataService', { - defaultImpl: DataServiceImpl, -}); +import { DataService } from './dataService.js'; export function getDataService(): DataService { - return getService('dataService'); + return new DataService(); }