Skip to content

Commit

Permalink
♻️ refactor(service): Seperate data import and export services
Browse files Browse the repository at this point in the history
  • Loading branch information
CloudPassenger committed Jul 17, 2024
1 parent b63209e commit 881ad71
Show file tree
Hide file tree
Showing 18 changed files with 259 additions and 90 deletions.
10 changes: 5 additions & 5 deletions src/app/(main)/(mobile)/me/data/features/Category.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,33 +5,33 @@ import { useTranslation } from 'react-i18next';

import Cell, { CellProps } from '@/components/Cell';
import DataImporter from '@/features/DataImporter';
import { configService } from '@/services/config';
import { exportService } from '@/services/export';

const Category = memo(() => {
const { t } = useTranslation('common');
const items: CellProps[] = [
{
key: 'allAgent',
label: t('exportType.allAgent'),
onClick: configService.exportAgents,
onClick: exportService.exportAgents,
},
{
key: 'allAgentWithMessage',
label: t('exportType.allAgentWithMessage'),
onClick: configService.exportSessions,
onClick: exportService.exportSessions,
},
{
key: 'globalSetting',
label: t('exportType.globalSetting'),
onClick: configService.exportSettings,
onClick: exportService.exportSettings,
},
{
type: 'divider',
},
{
key: 'all',
label: t('exportType.all'),
onClick: configService.exportAll,
onClick: exportService.exportAll,
},
{
type: 'divider',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import { memo, useMemo } from 'react';
import { useTranslation } from 'react-i18next';

import { isServerMode } from '@/const/version';
import { configService } from '@/services/config';
import { exportService } from '@/services/export';
import { useSessionStore } from '@/store/session';
import { sessionHelpers } from '@/store/session/helpers';
import { sessionGroupSelectors, sessionSelectors } from '@/store/session/selectors';
Expand Down Expand Up @@ -131,14 +131,14 @@ const Actions = memo<ActionProps>(({ group, id, openCreateGroupModal, setOpen })
key: 'agent',
label: t('exportType.agent', { ns: 'common' }),
onClick: () => {
configService.exportSingleAgent(id);
exportService.exportSingleAgent(id);
},
},
{
key: 'agentWithMessage',
label: t('exportType.agentWithMessage', { ns: 'common' }),
onClick: () => {
configService.exportSingleSession(id);
exportService.exportSingleSession(id);
},
},
],
Expand Down
4 changes: 2 additions & 2 deletions src/app/(main)/chat/features/Migration/UpgradeButton.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { ReactNode, memo } from 'react';
import { useTranslation } from 'react-i18next';

import { Migration } from '@/migrations';
import { configService } from '@/services/config';
import { importService } from '@/services/import';
import { useChatStore } from '@/store/chat';
import { useSessionStore } from '@/store/session';

Expand Down Expand Up @@ -35,7 +35,7 @@ const UpgradeButton = memo<UpgradeButtonProps>(

setUpgradeStatus(UpgradeStatus.UPGRADING);

await configService.importConfigState({
await importService.importConfigState({
exportType: 'sessions',
state: data.state,
version: 2,
Expand Down
6 changes: 3 additions & 3 deletions src/app/(main)/chat/settings/features/HeaderContent.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { useTranslation } from 'react-i18next';

import { HEADER_ICON_SIZE } from '@/const/layoutTokens';
import { isServerMode } from '@/const/version';
import { configService } from '@/services/config';
import { exportService } from '@/services/export';
import { useServerConfigStore } from '@/store/serverConfig';
import { useSessionStore } from '@/store/session';

Expand All @@ -29,7 +29,7 @@ export const HeaderContent = memo<{ mobile?: boolean; modal?: boolean }>(({ moda
onClick: () => {
if (!id) return;

configService.exportSingleAgent(id);
exportService.exportSingleAgent(id);
},
},
{
Expand All @@ -38,7 +38,7 @@ export const HeaderContent = memo<{ mobile?: boolean; modal?: boolean }>(({ moda
onClick: () => {
if (!id) return;

configService.exportSingleSession(id);
exportService.exportSingleSession(id);
},
},
],
Expand Down
2 changes: 2 additions & 0 deletions src/const/version.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,5 @@ import { getServerDBConfig } from '@/config/db';
export const CURRENT_VERSION = pkg.version;

export const isServerMode = getServerDBConfig().NEXT_PUBLIC_ENABLED_SERVER_SERVICE;

// 检查是否存在配置遗留
6 changes: 3 additions & 3 deletions src/features/DataImporter/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@ import { useTranslation } from 'react-i18next';
import { Center } from 'react-layout-kit';

import DataStyleModal from '@/components/DataStyleModal';
import { ImportResult, ImportResults, configService } from '@/services/config';
import { ImportResult, importService } from '@/services/import';
import { useChatStore } from '@/store/chat';
import { useSessionStore } from '@/store/session';
import { ErrorShape, FileUploadState, ImportStage } from '@/types/importer';
import { ErrorShape, FileUploadState, ImportResults, ImportStage } from '@/types/importer';
import { importConfigFile } from '@/utils/config';

import ImportError from './Error';
Expand Down Expand Up @@ -148,7 +148,7 @@ const DataImporter = memo<DataImporterProps>(({ children, onFinishImport }) => {
await importConfigFile(file, async (config) => {
setImportState(ImportStage.Preparing);

await configService.importConfigState(config, {
await importService.importConfigState(config, {
onError: (error) => {
setImportError(error);
},
Expand Down
10 changes: 5 additions & 5 deletions src/features/User/UserPanel/useMenu.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ import DataImporter from '@/features/DataImporter';
import { useOpenSettings } from '@/hooks/useInterceptingRoutes';
import { usePWAInstall } from '@/hooks/usePWAInstall';
import { useQueryRoute } from '@/hooks/useQueryRoute';
import { configService } from '@/services/config';
import { exportService } from '@/services/export';
import { SettingsTabs } from '@/store/global/initialState';
import { featureFlagsSelectors, useServerConfigStore } from '@/store/serverConfig';
import { useUserStore } from '@/store/user';
Expand Down Expand Up @@ -143,25 +143,25 @@ export const useMenu = () => {
{
key: 'allAgent',
label: t('exportType.allAgent'),
onClick: configService.exportAgents,
onClick: exportService.exportAgents,
},
{
key: 'allAgentWithMessage',
label: t('exportType.allAgentWithMessage'),
onClick: configService.exportSessions,
onClick: exportService.exportSessions,
},
{
key: 'globalSetting',
label: t('exportType.globalSetting'),
onClick: configService.exportSettings,
onClick: exportService.exportSettings,
},
{
type: 'divider',
},
{
key: 'all',
label: t('exportType.all'),
onClick: configService.exportAll,
onClick: exportService.exportAll,
},
],
icon: <Icon icon={HardDriveUpload} />,
Expand Down
1 change: 0 additions & 1 deletion src/server/modules/DataImporter/__tests__/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import {
users,
} from '@/database/server/schemas/lobechat';
import { CURRENT_CONFIG_VERSION } from '@/migrations';
import { ImportResult } from '@/services/config';
import { ImporterEntryData } from '@/types/importer';

import { DataImporter } from '../index';
Expand Down
2 changes: 1 addition & 1 deletion src/server/modules/DataImporter/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import {
sessions,
topics,
} from '@/database/server/schemas/lobechat';
import { ImportResult } from '@/services/config';
import { ImportResult } from '@/services/import';
import { ImporterEntryData } from '@/types/importer';

export class DataImporter {
Expand Down
77 changes: 14 additions & 63 deletions src/services/config.ts → src/services/export/client.ts
Original file line number Diff line number Diff line change
@@ -1,54 +1,15 @@
import { importService } from '@/services/import';
import { messageService } from '@/services/message';
import { sessionService } from '@/services/session';
import { topicService } from '@/services/topic';
import { useSessionStore } from '@/store/session';
import { sessionSelectors } from '@/store/session/selectors';
import { useUserStore } from '@/store/user';
import { settingsSelectors } from '@/store/user/selectors';
import { ConfigFile } from '@/types/exportConfig';
import { ImportStage, OnImportCallbacks } from '@/types/importer';
import { IExportService } from '@/services/export/type';
import { getAgent, getSession, getSettings } from '@/services/export/utils';
import { ClientService as MessageService } from '@/services/message/client';
import { ClientService as SessionService } from '@/services/session/client';
import { ClientService as TopicService } from '@/services/topic/client';
import { createConfigFile, exportConfigFile } from '@/utils/config';

export interface ImportResult {
added: number;
errors: number;
skips: number;
}
export interface ImportResults {
messages?: ImportResult;
sessionGroups?: ImportResult;
sessions?: ImportResult;
topics?: ImportResult;
type?: string;
}

class ConfigService {
importConfigState = async (config: ConfigFile, callbacks?: OnImportCallbacks): Promise<void> => {
if (config.exportType === 'settings') {
await importService.importSettings(config.state.settings);
callbacks?.onStageChange?.(ImportStage.Success);
return;
}

if (config.exportType === 'all') {
await importService.importSettings(config.state.settings);
}

await importService.importData(
{
messages: (config.state as any).messages || [],
sessionGroups: (config.state as any).sessionGroups || [],
sessions: (config.state as any).sessions || [],
topics: (config.state as any).topics || [],
version: config.version,
},
callbacks,
);
};

// TODO: Separate export feature into a new service like importService
const sessionService = new SessionService();
const messageService = new MessageService();
const topicService = new TopicService();

export class ClientService implements IExportService {
/**
* export all agents
*/
Expand Down Expand Up @@ -79,7 +40,7 @@ class ConfigService {
* export a session
*/
exportSingleSession = async (id: string) => {
const session = this.getSession(id);
const session = getSession(id);
if (!session) return;

const messages = await messageService.getAllMessagesInSession(id);
Expand All @@ -94,7 +55,7 @@ class ConfigService {
* export a topic
*/
exportSingleTopic = async (sessionId: string, topicId: string) => {
const session = this.getSession(sessionId);
const session = getSession(sessionId);
if (!session) return;

const messages = await messageService.getMessages(sessionId, topicId);
Expand All @@ -113,7 +74,7 @@ class ConfigService {
};

exportSingleAgent = async (id: string) => {
const agent = this.getAgent(id);
const agent = getAgent(id);
if (!agent) return;

const config = createConfigFile('agents', { sessionGroups: [], sessions: [agent] });
Expand All @@ -125,7 +86,7 @@ class ConfigService {
* export settings
*/
exportSettings = async () => {
const settings = this.getSettings();
const settings = getSettings();

const config = createConfigFile('settings', { settings });

Expand All @@ -140,20 +101,10 @@ class ConfigService {
const sessionGroups = await sessionService.getSessionGroups();
const messages = await messageService.getAllMessages();
const topics = await topicService.getAllTopics();
const settings = this.getSettings();
const settings = getSettings();

const config = createConfigFile('all', { messages, sessionGroups, sessions, settings, topics });

exportConfigFile(config, 'config');
};

private getSettings = () => settingsSelectors.exportSettings(useUserStore.getState());

private getSession = (id: string) =>
sessionSelectors.getSessionById(id)(useSessionStore.getState());

private getAgent = (id: string) =>
sessionSelectors.getSessionById(id)(useSessionStore.getState());
}

export const configService = new ConfigService();
13 changes: 13 additions & 0 deletions src/services/export/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { isServerMode } from '@/const/version';

import { ClientService } from './client';
import { ServerService } from './server';

export const exportService = isServerMode ? new ServerService() : new ClientService();

// TODO: A new UI to guide users in migrating personal data from Local DB to Server DB
export const getExportService = (mode?: 'client' | 'server') => {
if (mode === 'client') return new ClientService();
if (mode === 'server') return new ServerService();
return exportService;
};
Loading

0 comments on commit 881ad71

Please sign in to comment.