@lobehub/lobehub 2.0.0-next.12 → 2.0.0-next.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +50 -0
- package/changelog/v1.json +18 -0
- package/package.json +1 -1
- package/packages/const/src/version.ts +3 -3
- package/packages/database/src/repositories/dataImporter/deprecated/__tests__/index.test.ts +2 -1
- package/packages/database/src/repositories/dataImporter/deprecated/index.ts +7 -1
- package/src/app/[variants]/(main)/(mobile)/me/(home)/__tests__/useCategory.test.tsx +9 -0
- package/src/app/[variants]/(main)/(mobile)/me/(home)/layout.tsx +0 -2
- package/src/app/[variants]/(main)/chat/@session/features/SessionListContent/List/Item/Actions.tsx +3 -28
- package/src/app/[variants]/(main)/chat/_layout/Desktop/index.tsx +0 -2
- package/src/app/[variants]/(main)/chat/_layout/Mobile.tsx +1 -5
- package/src/app/[variants]/(main)/chat/settings/features/HeaderContent.tsx +2 -62
- package/src/app/[variants]/(main)/image/features/PromptInput/index.tsx +1 -1
- package/src/app/[variants]/(main)/image/page.tsx +0 -2
- package/src/app/[variants]/(main)/profile/_layout/Desktop/index.tsx +23 -24
- package/src/app/[variants]/(main)/profile/_layout/Mobile/index.tsx +5 -9
- package/src/app/[variants]/(main)/settings/_layout/Desktop/index.tsx +0 -2
- package/src/app/[variants]/(main)/settings/_layout/Mobile/index.tsx +0 -2
- package/src/app/[variants]/(main)/settings/provider/(list)/ProviderGrid/Card.tsx +1 -1
- package/src/app/[variants]/loading/index.tsx +1 -10
- package/src/components/Link.tsx +12 -0
- package/src/envs/app.ts +5 -8
- package/src/features/DataImporter/index.tsx +15 -60
- package/src/features/DevPanel/PostgresViewer/usePgTable.ts +3 -2
- package/src/hooks/useInterceptingRoutes.test.ts +21 -3
- package/src/libs/trpc/client/index.ts +0 -1
- package/src/libs/trpc/client/lambda.ts +8 -5
- package/src/libs/trpc/lambda/context.ts +4 -1
- package/src/server/routers/desktop/mcp.ts +1 -3
- package/src/server/routers/lambda/config/index.test.ts +2 -2
- package/src/server/routers/tools/mcp.ts +2 -3
- package/src/server/routers/tools/search.test.ts +1 -7
- package/src/server/routers/tools/search.ts +1 -4
- package/src/services/__tests__/tool.test.ts +0 -3
- package/src/services/aiModel/index.test.ts +0 -3
- package/src/services/aiModel/index.ts +1 -7
- package/src/services/aiProvider/index.test.ts +0 -3
- package/src/services/aiProvider/index.ts +1 -7
- package/src/services/chatGroup/index.ts +1 -10
- package/src/services/config.ts +1 -65
- package/src/services/export/index.ts +1 -4
- package/src/services/file/index.ts +1 -11
- package/src/services/import/index.ts +1 -7
- package/src/services/message/index.ts +1 -11
- package/src/services/plugin/index.ts +1 -11
- package/src/services/session/index.ts +1 -11
- package/src/services/tableViewer/client.ts +12 -15
- package/src/services/thread/index.ts +1 -7
- package/src/services/topic/index.ts +1 -11
- package/src/services/user/index.ts +1 -13
- package/src/store/chat/slices/aiChat/actions/__tests__/generateAIChat.test.ts +0 -241
- package/src/store/chat/slices/aiChat/actions/__tests__/generateAIChatV2.test.ts +26 -1
- package/src/store/chat/slices/aiChat/actions/__tests__/helpers.ts +3 -1
- package/src/store/chat/slices/aiChat/actions/generateAIChat.ts +1 -138
- package/src/store/user/slices/common/action.test.ts +1 -4
- package/src/app/(backend)/trpc/edge/[trpc]/route.ts +0 -26
- package/src/app/[variants]/(main)/(mobile)/me/data/features/Category.tsx +0 -48
- package/src/app/[variants]/(main)/(mobile)/me/data/features/Header.tsx +0 -33
- package/src/app/[variants]/(main)/(mobile)/me/data/layout.tsx +0 -13
- package/src/app/[variants]/(main)/(mobile)/me/data/loading.tsx +0 -5
- package/src/app/[variants]/(main)/(mobile)/me/data/page.tsx +0 -29
- package/src/app/[variants]/(main)/chat/features/Migration/DBReader.ts +0 -290
- package/src/app/[variants]/(main)/chat/features/Migration/ExportConfigButton.tsx +0 -35
- package/src/app/[variants]/(main)/chat/features/Migration/Failed.tsx +0 -120
- package/src/app/[variants]/(main)/chat/features/Migration/Modal.tsx +0 -81
- package/src/app/[variants]/(main)/chat/features/Migration/Start.tsx +0 -108
- package/src/app/[variants]/(main)/chat/features/Migration/UpgradeButton.tsx +0 -71
- package/src/app/[variants]/(main)/chat/features/Migration/const.ts +0 -15
- package/src/app/[variants]/(main)/chat/features/Migration/index.tsx +0 -50
- package/src/app/[variants]/loading/Client/Content.tsx +0 -48
- package/src/app/[variants]/loading/Client/Error.tsx +0 -27
- package/src/app/[variants]/loading/Client/Redirect.tsx +0 -47
- package/src/app/[variants]/loading/Client/index.tsx +0 -22
- package/src/components/InnerLink.tsx +0 -20
- package/src/database/_deprecated/core/__tests__/db-upgrade.test.ts +0 -42
- package/src/database/_deprecated/core/__tests__/db.test.ts +0 -79
- package/src/database/_deprecated/core/__tests__/model.test.ts +0 -55
- package/src/database/_deprecated/core/db.ts +0 -246
- package/src/database/_deprecated/core/index.ts +0 -2
- package/src/database/_deprecated/core/migrations/migrateSettingsToUser/fixtures/input.json +0 -55
- package/src/database/_deprecated/core/migrations/migrateSettingsToUser/fixtures/output.json +0 -60
- package/src/database/_deprecated/core/migrations/migrateSettingsToUser/index.test.ts +0 -14
- package/src/database/_deprecated/core/migrations/migrateSettingsToUser/index.ts +0 -22
- package/src/database/_deprecated/core/migrations/migrateSettingsToUser/type.ts +0 -105
- package/src/database/_deprecated/core/model.ts +0 -218
- package/src/database/_deprecated/core/schemas.ts +0 -88
- package/src/database/_deprecated/core/types/db.ts +0 -15
- package/src/database/_deprecated/models/__DEBUG.ts +0 -124
- package/src/database/_deprecated/models/__tests__/file.test.ts +0 -83
- package/src/database/_deprecated/models/__tests__/message.test.ts +0 -426
- package/src/database/_deprecated/models/__tests__/plugin.test.ts +0 -81
- package/src/database/_deprecated/models/__tests__/session.test.ts +0 -253
- package/src/database/_deprecated/models/__tests__/sessionGroup.test.ts +0 -220
- package/src/database/_deprecated/models/__tests__/topic.test.ts +0 -523
- package/src/database/_deprecated/models/__tests__/user.test.ts +0 -82
- package/src/database/_deprecated/models/file.ts +0 -51
- package/src/database/_deprecated/models/message.ts +0 -277
- package/src/database/_deprecated/models/plugin.ts +0 -62
- package/src/database/_deprecated/models/session.ts +0 -271
- package/src/database/_deprecated/models/sessionGroup.ts +0 -93
- package/src/database/_deprecated/models/topic.ts +0 -250
- package/src/database/_deprecated/models/user.ts +0 -69
- package/src/database/_deprecated/schemas/files.ts +0 -39
- package/src/database/_deprecated/schemas/message.ts +0 -50
- package/src/database/_deprecated/schemas/plugin.ts +0 -12
- package/src/database/_deprecated/schemas/session.ts +0 -54
- package/src/database/_deprecated/schemas/sessionGroup.ts +0 -8
- package/src/database/_deprecated/schemas/topic.ts +0 -12
- package/src/database/_deprecated/schemas/user.ts +0 -40
- package/src/features/DataImporter/_deprecated.ts +0 -43
- package/src/features/InitClientDB/EnableModal.tsx +0 -118
- package/src/features/InitClientDB/ErrorResult.tsx +0 -143
- package/src/features/InitClientDB/InitIndicator.tsx +0 -124
- package/src/features/InitClientDB/PGliteIcon.tsx +0 -28
- package/src/features/InitClientDB/features/DatabaseRepair/Backup.tsx +0 -75
- package/src/features/InitClientDB/features/DatabaseRepair/Diagnosis.tsx +0 -98
- package/src/features/InitClientDB/features/DatabaseRepair/Repair.tsx +0 -218
- package/src/features/InitClientDB/features/DatabaseRepair/index.tsx +0 -91
- package/src/features/InitClientDB/index.tsx +0 -37
- package/src/libs/trpc/client/edge.ts +0 -26
- package/src/libs/trpc/edge/context.ts +0 -71
- package/src/libs/trpc/edge/index.ts +0 -45
- package/src/libs/trpc/edge/init.ts +0 -26
- package/src/libs/trpc/edge/middleware/jwtPayload.test.ts +0 -75
- package/src/libs/trpc/edge/middleware/jwtPayload.ts +0 -14
- package/src/migrations/FromV0ToV1.ts +0 -10
- package/src/migrations/FromV1ToV2/fixtures/input-v1-session.json +0 -191
- package/src/migrations/FromV1ToV2/fixtures/output-v2.json +0 -202
- package/src/migrations/FromV1ToV2/index.ts +0 -82
- package/src/migrations/FromV1ToV2/migrations.test.ts +0 -224
- package/src/migrations/FromV1ToV2/types/v1.ts +0 -78
- package/src/migrations/FromV1ToV2/types/v2.ts +0 -52
- package/src/migrations/FromV2ToV3/fixtures/input-v2-session.json +0 -72
- package/src/migrations/FromV2ToV3/fixtures/output-v3-from-v1.json +0 -203
- package/src/migrations/FromV2ToV3/fixtures/output-v3.json +0 -74
- package/src/migrations/FromV2ToV3/index.ts +0 -30
- package/src/migrations/FromV2ToV3/migrations.test.ts +0 -42
- package/src/migrations/FromV2ToV3/types/v3.ts +0 -27
- package/src/migrations/FromV3ToV4/fixtures/azure-input-v3.json +0 -79
- package/src/migrations/FromV3ToV4/fixtures/azure-output-v4.json +0 -75
- package/src/migrations/FromV3ToV4/fixtures/ollama-input-v3.json +0 -85
- package/src/migrations/FromV3ToV4/fixtures/ollama-output-v4.json +0 -86
- package/src/migrations/FromV3ToV4/fixtures/openai-input-v3.json +0 -77
- package/src/migrations/FromV3ToV4/fixtures/openai-output-v4.json +0 -77
- package/src/migrations/FromV3ToV4/fixtures/openrouter-input-v3.json +0 -82
- package/src/migrations/FromV3ToV4/fixtures/openrouter-output-v4.json +0 -85
- package/src/migrations/FromV3ToV4/fixtures/output-v4-from-v1.json +0 -203
- package/src/migrations/FromV3ToV4/index.ts +0 -102
- package/src/migrations/FromV3ToV4/migrations.test.ts +0 -195
- package/src/migrations/FromV3ToV4/types/v3.ts +0 -52
- package/src/migrations/FromV3ToV4/types/v4.ts +0 -37
- package/src/migrations/FromV4ToV5/fixtures/from-v1-to-v5-output.json +0 -245
- package/src/migrations/FromV4ToV5/fixtures/function-input-v4.json +0 -96
- package/src/migrations/FromV4ToV5/fixtures/function-output-v5.json +0 -120
- package/src/migrations/FromV4ToV5/index.ts +0 -58
- package/src/migrations/FromV4ToV5/migrations.test.ts +0 -49
- package/src/migrations/FromV4ToV5/types/v4.ts +0 -21
- package/src/migrations/FromV4ToV5/types/v5.ts +0 -27
- package/src/migrations/FromV5ToV6/fixtures/from-v1-to-v6-output.json +0 -247
- package/src/migrations/FromV5ToV6/fixtures/session-input-v5.json +0 -81
- package/src/migrations/FromV5ToV6/fixtures/session-output-v6.json +0 -85
- package/src/migrations/FromV5ToV6/index.ts +0 -61
- package/src/migrations/FromV5ToV6/migrations.test.ts +0 -50
- package/src/migrations/FromV5ToV6/types/v5.ts +0 -48
- package/src/migrations/FromV5ToV6/types/v6.ts +0 -63
- package/src/migrations/FromV6ToV7/fixtures/output-v7-from-v1.json +0 -203
- package/src/migrations/FromV6ToV7/fixtures/provider-input-v6.json +0 -103
- package/src/migrations/FromV6ToV7/fixtures/provider-output-v7.json +0 -118
- package/src/migrations/FromV6ToV7/index.ts +0 -101
- package/src/migrations/FromV6ToV7/migrations.test.ts +0 -64
- package/src/migrations/FromV6ToV7/types/v6.ts +0 -61
- package/src/migrations/FromV6ToV7/types/v7.ts +0 -69
- package/src/migrations/VersionController.test.ts +0 -88
- package/src/migrations/VersionController.ts +0 -67
- package/src/migrations/index.ts +0 -61
- package/src/server/routers/edge/appStatus.ts +0 -3
- package/src/server/routers/edge/index.ts +0 -14
- package/src/server/routers/edge/upload.ts +0 -16
- package/src/services/aiModel/client.ts +0 -70
- package/src/services/aiProvider/client.ts +0 -58
- package/src/services/baseClientService/index.ts +0 -9
- package/src/services/chatGroup/client.ts +0 -63
- package/src/services/export/_deprecated.ts +0 -155
- package/src/services/export/client.ts +0 -15
- package/src/services/file/_deprecated.test.ts +0 -119
- package/src/services/file/_deprecated.ts +0 -80
- package/src/services/file/client.test.ts +0 -199
- package/src/services/file/client.ts +0 -85
- package/src/services/import/_deprecated.ts +0 -115
- package/src/services/import/client.test.ts +0 -1015
- package/src/services/import/client.ts +0 -64
- package/src/services/message/_deprecated.test.ts +0 -398
- package/src/services/message/_deprecated.ts +0 -168
- package/src/services/message/client.test.ts +0 -410
- package/src/services/message/client.ts +0 -192
- package/src/services/plugin/_deprecated.test.ts +0 -162
- package/src/services/plugin/_deprecated.ts +0 -42
- package/src/services/plugin/client.test.ts +0 -177
- package/src/services/plugin/client.ts +0 -46
- package/src/services/session/_deprecated.test.ts +0 -440
- package/src/services/session/_deprecated.ts +0 -190
- package/src/services/session/client.test.ts +0 -413
- package/src/services/session/client.ts +0 -193
- package/src/services/thread/client.ts +0 -51
- package/src/services/topic/_deprecated.test.ts +0 -245
- package/src/services/topic/_deprecated.ts +0 -75
- package/src/services/topic/client.ts +0 -89
- package/src/services/topic/pglite.test.ts +0 -212
- package/src/services/user/_deprecated.test.ts +0 -101
- package/src/services/user/_deprecated.ts +0 -70
- package/src/services/user/client.test.ts +0 -111
- package/src/services/user/client.ts +0 -104
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import { clientDB } from '@/database/client/db';
|
|
2
|
-
import { DataImporterRepos } from '@/database/repositories/dataImporter';
|
|
3
|
-
import { BaseClientService } from '@/services/baseClientService';
|
|
4
|
-
import { useUserStore } from '@/store/user';
|
|
5
|
-
import { ImportStage } from '@/types/importer';
|
|
6
|
-
|
|
7
|
-
import { IImportService } from './type';
|
|
8
|
-
|
|
9
|
-
export class ClientService extends BaseClientService implements IImportService {
|
|
10
|
-
private get dataImporter(): DataImporterRepos {
|
|
11
|
-
return new DataImporterRepos(clientDB as any, this.userId);
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
importSettings: IImportService['importSettings'] = async (settings) => {
|
|
15
|
-
await useUserStore.getState().importAppSettings(settings);
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
importData: IImportService['importData'] = async (data, callbacks) => {
|
|
19
|
-
callbacks?.onStageChange?.(ImportStage.Importing);
|
|
20
|
-
const time = Date.now();
|
|
21
|
-
try {
|
|
22
|
-
const result = await this.dataImporter.importData(data);
|
|
23
|
-
const duration = Date.now() - time;
|
|
24
|
-
|
|
25
|
-
callbacks?.onStageChange?.(ImportStage.Success);
|
|
26
|
-
callbacks?.onSuccess?.(result.results, duration);
|
|
27
|
-
} catch (e) {
|
|
28
|
-
console.error(e);
|
|
29
|
-
callbacks?.onStageChange?.(ImportStage.Error);
|
|
30
|
-
const error = e as Error;
|
|
31
|
-
|
|
32
|
-
callbacks?.onError?.({ code: 'ImportError', httpStatus: 0, message: error.message });
|
|
33
|
-
}
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
importPgData: IImportService['importPgData'] = async (
|
|
37
|
-
data,
|
|
38
|
-
{ callbacks, overwriteExisting } = {},
|
|
39
|
-
) => {
|
|
40
|
-
callbacks?.onStageChange?.(ImportStage.Importing);
|
|
41
|
-
const time = Date.now();
|
|
42
|
-
try {
|
|
43
|
-
const result = await this.dataImporter.importPgData(
|
|
44
|
-
data,
|
|
45
|
-
overwriteExisting ? 'override' : 'skip',
|
|
46
|
-
);
|
|
47
|
-
|
|
48
|
-
const duration = Date.now() - time;
|
|
49
|
-
|
|
50
|
-
callbacks?.onStageChange?.(ImportStage.Success);
|
|
51
|
-
if (result.success) {
|
|
52
|
-
callbacks?.onSuccess?.(result.results, duration);
|
|
53
|
-
} else {
|
|
54
|
-
callbacks?.onError?.({ code: 'ImportError', httpStatus: 0, message: result.error.message });
|
|
55
|
-
}
|
|
56
|
-
} catch (e) {
|
|
57
|
-
console.error(e);
|
|
58
|
-
callbacks?.onStageChange?.(ImportStage.Error);
|
|
59
|
-
const error = e as Error;
|
|
60
|
-
|
|
61
|
-
callbacks?.onError?.({ code: 'ImportError', httpStatus: 0, message: error.message });
|
|
62
|
-
}
|
|
63
|
-
};
|
|
64
|
-
}
|
|
@@ -1,398 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
ChatMessageError,
|
|
3
|
-
ChatPluginPayload,
|
|
4
|
-
ChatTTS,
|
|
5
|
-
ChatTranslate,
|
|
6
|
-
UIChatMessage,
|
|
7
|
-
} from '@lobechat/types';
|
|
8
|
-
import dayjs from 'dayjs';
|
|
9
|
-
import { Mock, describe, expect, it, vi } from 'vitest';
|
|
10
|
-
|
|
11
|
-
import { CreateMessageParams, MessageModel } from '@/database/_deprecated/models/message';
|
|
12
|
-
|
|
13
|
-
import { ClientService } from './_deprecated';
|
|
14
|
-
|
|
15
|
-
const messageService = new ClientService();
|
|
16
|
-
|
|
17
|
-
// Mock the MessageModel
|
|
18
|
-
vi.mock('@/database/_deprecated/models/message', () => {
|
|
19
|
-
return {
|
|
20
|
-
MessageModel: {
|
|
21
|
-
create: vi.fn(),
|
|
22
|
-
batchCreate: vi.fn(),
|
|
23
|
-
count: vi.fn(),
|
|
24
|
-
query: vi.fn(),
|
|
25
|
-
delete: vi.fn(),
|
|
26
|
-
bulkDelete: vi.fn(),
|
|
27
|
-
queryBySessionId: vi.fn(),
|
|
28
|
-
update: vi.fn(),
|
|
29
|
-
updatePlugin: vi.fn(),
|
|
30
|
-
batchDelete: vi.fn(),
|
|
31
|
-
clearTable: vi.fn(),
|
|
32
|
-
batchUpdate: vi.fn(),
|
|
33
|
-
queryAll: vi.fn(),
|
|
34
|
-
updatePluginState: vi.fn(),
|
|
35
|
-
},
|
|
36
|
-
};
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
describe('MessageClientService', () => {
|
|
40
|
-
// Mock data
|
|
41
|
-
const mockMessageId = 'mock-message-id';
|
|
42
|
-
const mockMessage = {
|
|
43
|
-
id: mockMessageId,
|
|
44
|
-
content: 'Mock message content',
|
|
45
|
-
sessionId: 'mock-session-id',
|
|
46
|
-
createdAt: 100,
|
|
47
|
-
updatedAt: 100,
|
|
48
|
-
role: 'user',
|
|
49
|
-
// ... other properties
|
|
50
|
-
} as UIChatMessage;
|
|
51
|
-
const mockMessages = [mockMessage];
|
|
52
|
-
|
|
53
|
-
beforeEach(() => {
|
|
54
|
-
// Reset all mocks before running each test case
|
|
55
|
-
vi.resetAllMocks();
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
describe('create', () => {
|
|
59
|
-
it('should create a message and return its id', async () => {
|
|
60
|
-
// Setup
|
|
61
|
-
const createParams = {
|
|
62
|
-
content: 'New message content',
|
|
63
|
-
sessionId: '1',
|
|
64
|
-
// ... other properties
|
|
65
|
-
} as CreateMessageParams;
|
|
66
|
-
(MessageModel.create as Mock).mockResolvedValue({ id: mockMessageId });
|
|
67
|
-
|
|
68
|
-
// Execute
|
|
69
|
-
const messageId = await messageService.createMessage(createParams);
|
|
70
|
-
|
|
71
|
-
// Assert
|
|
72
|
-
expect(MessageModel.create).toHaveBeenCalledWith(createParams);
|
|
73
|
-
expect(messageId).toBe(mockMessageId);
|
|
74
|
-
});
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
describe('batchCreate', () => {
|
|
78
|
-
it('should batch create messages', async () => {
|
|
79
|
-
// Setup
|
|
80
|
-
(MessageModel.batchCreate as Mock).mockResolvedValue(mockMessages);
|
|
81
|
-
|
|
82
|
-
// Execute
|
|
83
|
-
const result = await messageService.batchCreateMessages(mockMessages);
|
|
84
|
-
|
|
85
|
-
// Assert
|
|
86
|
-
expect(MessageModel.batchCreate).toHaveBeenCalledWith(mockMessages);
|
|
87
|
-
expect(result).toBe(mockMessages);
|
|
88
|
-
});
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
describe('removeMessage', () => {
|
|
92
|
-
it('should remove a message by id', async () => {
|
|
93
|
-
// Setup
|
|
94
|
-
(MessageModel.delete as Mock).mockResolvedValue(true);
|
|
95
|
-
|
|
96
|
-
// Execute
|
|
97
|
-
const result = await messageService.removeMessage(mockMessageId);
|
|
98
|
-
|
|
99
|
-
// Assert
|
|
100
|
-
expect(MessageModel.delete).toHaveBeenCalledWith(mockMessageId);
|
|
101
|
-
expect(result).toBe(true);
|
|
102
|
-
});
|
|
103
|
-
});
|
|
104
|
-
describe('removeMessages', () => {
|
|
105
|
-
it('should remove a message by id', async () => {
|
|
106
|
-
// Setup
|
|
107
|
-
(MessageModel.bulkDelete as Mock).mockResolvedValue(true);
|
|
108
|
-
|
|
109
|
-
// Execute
|
|
110
|
-
const result = await messageService.removeMessages([mockMessageId]);
|
|
111
|
-
|
|
112
|
-
// Assert
|
|
113
|
-
expect(MessageModel.bulkDelete).toHaveBeenCalledWith([mockMessageId]);
|
|
114
|
-
expect(result).toBe(true);
|
|
115
|
-
});
|
|
116
|
-
});
|
|
117
|
-
|
|
118
|
-
describe('getMessages', () => {
|
|
119
|
-
it('should retrieve messages by sessionId and topicId', async () => {
|
|
120
|
-
// Setup
|
|
121
|
-
const sessionId = 'session-id';
|
|
122
|
-
const topicId = 'topic-id';
|
|
123
|
-
(MessageModel.query as Mock).mockResolvedValue(mockMessages);
|
|
124
|
-
|
|
125
|
-
// Execute
|
|
126
|
-
const messages = await messageService.getMessages(sessionId, topicId);
|
|
127
|
-
|
|
128
|
-
// Assert
|
|
129
|
-
expect(MessageModel.query).toHaveBeenCalledWith({ sessionId, topicId });
|
|
130
|
-
expect(messages).toEqual(mockMessages.map((i) => ({ ...i, imageList: [] })));
|
|
131
|
-
});
|
|
132
|
-
});
|
|
133
|
-
|
|
134
|
-
describe('getAllMessagesInSession', () => {
|
|
135
|
-
it('should retrieve all messages in a session', async () => {
|
|
136
|
-
// Setup
|
|
137
|
-
const sessionId = 'session-id';
|
|
138
|
-
(MessageModel.queryBySessionId as Mock).mockResolvedValue(mockMessages);
|
|
139
|
-
|
|
140
|
-
// Execute
|
|
141
|
-
const messages = await messageService.getAllMessagesInSession(sessionId);
|
|
142
|
-
|
|
143
|
-
// Assert
|
|
144
|
-
expect(MessageModel.queryBySessionId).toHaveBeenCalledWith(sessionId);
|
|
145
|
-
expect(messages).toBe(mockMessages);
|
|
146
|
-
});
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
describe('removeMessagesByAssistant', () => {
|
|
150
|
-
it('should batch remove messages by assistantId and topicId', async () => {
|
|
151
|
-
// Setup
|
|
152
|
-
const assistantId = 'assistant-id';
|
|
153
|
-
const topicId = 'topic-id';
|
|
154
|
-
(MessageModel.batchDelete as Mock).mockResolvedValue(true);
|
|
155
|
-
|
|
156
|
-
// Execute
|
|
157
|
-
const result = await messageService.removeMessagesByAssistant(assistantId, topicId);
|
|
158
|
-
|
|
159
|
-
// Assert
|
|
160
|
-
expect(MessageModel.batchDelete).toHaveBeenCalledWith(assistantId, topicId);
|
|
161
|
-
expect(result).toBe(true);
|
|
162
|
-
});
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
describe('clearAllMessage', () => {
|
|
166
|
-
it('should clear all messages from the table', async () => {
|
|
167
|
-
// Setup
|
|
168
|
-
(MessageModel.clearTable as Mock).mockResolvedValue(true);
|
|
169
|
-
|
|
170
|
-
// Execute
|
|
171
|
-
const result = await messageService.removeAllMessages();
|
|
172
|
-
|
|
173
|
-
// Assert
|
|
174
|
-
expect(MessageModel.clearTable).toHaveBeenCalled();
|
|
175
|
-
expect(result).toBe(true);
|
|
176
|
-
});
|
|
177
|
-
});
|
|
178
|
-
|
|
179
|
-
describe('bindMessagesToTopic', () => {
|
|
180
|
-
it('should batch update messages to bind them to a topic', async () => {
|
|
181
|
-
// Setup
|
|
182
|
-
const topicId = 'topic-id';
|
|
183
|
-
const messageIds = [mockMessageId];
|
|
184
|
-
(MessageModel.batchUpdate as Mock).mockResolvedValue(mockMessages);
|
|
185
|
-
|
|
186
|
-
// Execute
|
|
187
|
-
const result = await messageService.bindMessagesToTopic(topicId, messageIds);
|
|
188
|
-
|
|
189
|
-
// Assert
|
|
190
|
-
expect(MessageModel.batchUpdate).toHaveBeenCalledWith(messageIds, { topicId });
|
|
191
|
-
expect(result).toBe(mockMessages);
|
|
192
|
-
});
|
|
193
|
-
});
|
|
194
|
-
|
|
195
|
-
describe('getAllMessages', () => {
|
|
196
|
-
it('should retrieve all messages', async () => {
|
|
197
|
-
// Setup
|
|
198
|
-
(MessageModel.queryAll as Mock).mockResolvedValue(mockMessages);
|
|
199
|
-
|
|
200
|
-
// Execute
|
|
201
|
-
const messages = await messageService.getAllMessages();
|
|
202
|
-
|
|
203
|
-
// Assert
|
|
204
|
-
expect(MessageModel.queryAll).toHaveBeenCalled();
|
|
205
|
-
expect(messages).toBe(mockMessages);
|
|
206
|
-
});
|
|
207
|
-
});
|
|
208
|
-
|
|
209
|
-
describe('updateMessageError', () => {
|
|
210
|
-
it('should update the error field of a message', async () => {
|
|
211
|
-
// Setup
|
|
212
|
-
const newError = {
|
|
213
|
-
type: 'InvalidProviderAPIKey',
|
|
214
|
-
message: 'Error occurred',
|
|
215
|
-
} as ChatMessageError;
|
|
216
|
-
(MessageModel.update as Mock).mockResolvedValue({ ...mockMessage, error: newError });
|
|
217
|
-
|
|
218
|
-
// Execute
|
|
219
|
-
const result = await messageService.updateMessageError(mockMessageId, newError);
|
|
220
|
-
|
|
221
|
-
// Assert
|
|
222
|
-
expect(MessageModel.update).toHaveBeenCalledWith(mockMessageId, { error: newError });
|
|
223
|
-
expect(result).toEqual({ ...mockMessage, error: newError });
|
|
224
|
-
});
|
|
225
|
-
});
|
|
226
|
-
|
|
227
|
-
// describe('updateMessagePlugin', () => {
|
|
228
|
-
// it('should update the plugin payload of a message', async () => {
|
|
229
|
-
// // Setup
|
|
230
|
-
// const newPlugin = {
|
|
231
|
-
// type: 'default',
|
|
232
|
-
// apiName: 'abc',
|
|
233
|
-
// arguments: '',
|
|
234
|
-
// identifier: 'plugin1',
|
|
235
|
-
// } as ChatPluginPayload;
|
|
236
|
-
//
|
|
237
|
-
// (MessageModel.update as Mock).mockResolvedValue({ ...mockMessage, plugin: newPlugin });
|
|
238
|
-
//
|
|
239
|
-
// // Execute
|
|
240
|
-
// const result = await messageService.updateMessagePlugin(mockMessageId, newPlugin);
|
|
241
|
-
//
|
|
242
|
-
// // Assert
|
|
243
|
-
// expect(MessageModel.update).toHaveBeenCalledWith(mockMessageId, { plugin: newPlugin });
|
|
244
|
-
// expect(result).toEqual({ ...mockMessage, plugin: newPlugin });
|
|
245
|
-
// });
|
|
246
|
-
// });
|
|
247
|
-
|
|
248
|
-
describe('updateMessagePluginState', () => {
|
|
249
|
-
it('should update the plugin state of a message', async () => {
|
|
250
|
-
// Setup
|
|
251
|
-
const key = 'stateKey';
|
|
252
|
-
const value = 'stateValue';
|
|
253
|
-
const newPluginState = { [key]: value };
|
|
254
|
-
(MessageModel.updatePluginState as Mock).mockResolvedValue({
|
|
255
|
-
...mockMessage,
|
|
256
|
-
pluginState: newPluginState,
|
|
257
|
-
});
|
|
258
|
-
|
|
259
|
-
// Execute
|
|
260
|
-
const result = await messageService.updateMessagePluginState(mockMessageId, { key: value });
|
|
261
|
-
|
|
262
|
-
// Assert
|
|
263
|
-
expect(MessageModel.updatePluginState).toHaveBeenCalledWith(mockMessageId, { key: value });
|
|
264
|
-
expect(result).toEqual({ ...mockMessage, pluginState: newPluginState });
|
|
265
|
-
});
|
|
266
|
-
});
|
|
267
|
-
|
|
268
|
-
describe('updateMessagePluginArguments', () => {
|
|
269
|
-
it('should update the plugin arguments object of a message', async () => {
|
|
270
|
-
// Setup
|
|
271
|
-
const key = 'stateKey';
|
|
272
|
-
const value = 'stateValue';
|
|
273
|
-
(MessageModel.updatePlugin as Mock).mockResolvedValue({});
|
|
274
|
-
|
|
275
|
-
// Execute
|
|
276
|
-
await messageService.updateMessagePluginArguments(mockMessageId, { key: value });
|
|
277
|
-
|
|
278
|
-
// Assert
|
|
279
|
-
expect(MessageModel.updatePlugin).toHaveBeenCalledWith(mockMessageId, {
|
|
280
|
-
arguments: '{"key":"stateValue"}',
|
|
281
|
-
});
|
|
282
|
-
});
|
|
283
|
-
it('should update the plugin arguments string of a message', async () => {
|
|
284
|
-
// Setup
|
|
285
|
-
const key = 'stateKey';
|
|
286
|
-
const value = 'stateValue';
|
|
287
|
-
(MessageModel.updatePlugin as Mock).mockResolvedValue({});
|
|
288
|
-
|
|
289
|
-
// Execute
|
|
290
|
-
await messageService.updateMessagePluginArguments(
|
|
291
|
-
mockMessageId,
|
|
292
|
-
JSON.stringify({ key: value }),
|
|
293
|
-
);
|
|
294
|
-
|
|
295
|
-
// Assert
|
|
296
|
-
expect(MessageModel.updatePlugin).toHaveBeenCalledWith(mockMessageId, {
|
|
297
|
-
arguments: '{"key":"stateValue"}',
|
|
298
|
-
});
|
|
299
|
-
});
|
|
300
|
-
});
|
|
301
|
-
|
|
302
|
-
describe('countMessages', () => {
|
|
303
|
-
it('should count the total number of messages', async () => {
|
|
304
|
-
// Setup
|
|
305
|
-
const mockCount = 10;
|
|
306
|
-
(MessageModel.count as Mock).mockResolvedValue(mockCount);
|
|
307
|
-
|
|
308
|
-
// Execute
|
|
309
|
-
const count = await messageService.countMessages();
|
|
310
|
-
|
|
311
|
-
// Assert
|
|
312
|
-
expect(MessageModel.count).toHaveBeenCalled();
|
|
313
|
-
expect(count).toBe(mockCount);
|
|
314
|
-
});
|
|
315
|
-
});
|
|
316
|
-
|
|
317
|
-
describe('countTodayMessages', () => {
|
|
318
|
-
it('should count the number of messages created today', async () => {
|
|
319
|
-
// Setup
|
|
320
|
-
const today = dayjs().format('YYYY-MM-DD');
|
|
321
|
-
const mockMessages = [
|
|
322
|
-
{ ...mockMessage, createdAt: today },
|
|
323
|
-
{ ...mockMessage, createdAt: today },
|
|
324
|
-
{ ...mockMessage, createdAt: '2023-01-01' },
|
|
325
|
-
];
|
|
326
|
-
(MessageModel.queryAll as Mock).mockResolvedValue(mockMessages);
|
|
327
|
-
|
|
328
|
-
// Execute
|
|
329
|
-
const count = await messageService.countTodayMessages();
|
|
330
|
-
|
|
331
|
-
// Assert
|
|
332
|
-
expect(MessageModel.queryAll).toHaveBeenCalled();
|
|
333
|
-
expect(count).toBe(2);
|
|
334
|
-
});
|
|
335
|
-
});
|
|
336
|
-
|
|
337
|
-
describe('updateMessageTTS', () => {
|
|
338
|
-
it('should update the TTS field of a message', async () => {
|
|
339
|
-
// Setup
|
|
340
|
-
const newTTS: ChatTTS = {
|
|
341
|
-
contentMd5: 'abc',
|
|
342
|
-
file: 'file-abc',
|
|
343
|
-
};
|
|
344
|
-
|
|
345
|
-
(MessageModel.update as Mock).mockResolvedValue({ ...mockMessage, tts: newTTS });
|
|
346
|
-
|
|
347
|
-
// Execute
|
|
348
|
-
const result = await messageService.updateMessageTTS(mockMessageId, newTTS);
|
|
349
|
-
|
|
350
|
-
// Assert
|
|
351
|
-
expect(MessageModel.update).toHaveBeenCalledWith(mockMessageId, { tts: newTTS });
|
|
352
|
-
expect(result).toEqual({ ...mockMessage, tts: newTTS });
|
|
353
|
-
});
|
|
354
|
-
});
|
|
355
|
-
|
|
356
|
-
describe('updateMessageTranslate', () => {
|
|
357
|
-
it('should update the translate field of a message', async () => {
|
|
358
|
-
// Setup
|
|
359
|
-
const newTranslate: ChatTranslate = {
|
|
360
|
-
content: 'Translated text',
|
|
361
|
-
to: 'es',
|
|
362
|
-
};
|
|
363
|
-
|
|
364
|
-
(MessageModel.update as Mock).mockResolvedValue({ ...mockMessage, translate: newTranslate });
|
|
365
|
-
|
|
366
|
-
// Execute
|
|
367
|
-
const result = await messageService.updateMessageTranslate(mockMessageId, newTranslate);
|
|
368
|
-
|
|
369
|
-
// Assert
|
|
370
|
-
expect(MessageModel.update).toHaveBeenCalledWith(mockMessageId, { translate: newTranslate });
|
|
371
|
-
expect(result).toEqual({ ...mockMessage, translate: newTranslate });
|
|
372
|
-
});
|
|
373
|
-
});
|
|
374
|
-
|
|
375
|
-
describe('hasMessages', () => {
|
|
376
|
-
it('should return true if there are messages', async () => {
|
|
377
|
-
// Setup
|
|
378
|
-
(MessageModel.count as Mock).mockResolvedValue(1);
|
|
379
|
-
|
|
380
|
-
// Execute
|
|
381
|
-
const result = await messageService.hasMessages();
|
|
382
|
-
|
|
383
|
-
// Assert
|
|
384
|
-
expect(result).toBe(true);
|
|
385
|
-
});
|
|
386
|
-
|
|
387
|
-
it('should return false if there are no messages', async () => {
|
|
388
|
-
// Setup
|
|
389
|
-
(MessageModel.count as Mock).mockResolvedValue(0);
|
|
390
|
-
|
|
391
|
-
// Execute
|
|
392
|
-
const result = await messageService.hasMessages();
|
|
393
|
-
|
|
394
|
-
// Assert
|
|
395
|
-
expect(result).toBe(false);
|
|
396
|
-
});
|
|
397
|
-
});
|
|
398
|
-
});
|
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
ChatFileItem,
|
|
3
|
-
ChatMessageError,
|
|
4
|
-
ChatTTS,
|
|
5
|
-
ChatTranslate,
|
|
6
|
-
CreateMessageParams,
|
|
7
|
-
CreateNewMessageParams,
|
|
8
|
-
ModelRankItem,
|
|
9
|
-
UIChatMessage,
|
|
10
|
-
} from '@lobechat/types';
|
|
11
|
-
import dayjs from 'dayjs';
|
|
12
|
-
|
|
13
|
-
import { FileModel } from '@/database/_deprecated/models/file';
|
|
14
|
-
import { MessageModel } from '@/database/_deprecated/models/message';
|
|
15
|
-
import { DB_Message } from '@/database/_deprecated/schemas/message';
|
|
16
|
-
|
|
17
|
-
import { IMessageService } from './type';
|
|
18
|
-
|
|
19
|
-
export class ClientService implements IMessageService {
|
|
20
|
-
async createMessage(data: CreateMessageParams) {
|
|
21
|
-
const { id } = await MessageModel.create(data);
|
|
22
|
-
|
|
23
|
-
return id;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
async createNewMessage(data: CreateNewMessageParams) {
|
|
27
|
-
const { id } = await MessageModel.create(data as any);
|
|
28
|
-
const messages = await this.getMessages(data.sessionId, data.topicId);
|
|
29
|
-
|
|
30
|
-
return { id, messages };
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
// @ts-ignore
|
|
34
|
-
async batchCreateMessages(messages: UIChatMessage[]) {
|
|
35
|
-
return MessageModel.batchCreate(messages);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
async getMessages(sessionId: string, topicId?: string): Promise<UIChatMessage[]> {
|
|
39
|
-
const messages = await MessageModel.query({ sessionId, topicId });
|
|
40
|
-
|
|
41
|
-
const fileList = (await Promise.all(
|
|
42
|
-
messages
|
|
43
|
-
.flatMap((item) => item.files)
|
|
44
|
-
.filter(Boolean)
|
|
45
|
-
.map(async (id) => FileModel.findById(id!)),
|
|
46
|
-
)) as ChatFileItem[];
|
|
47
|
-
|
|
48
|
-
return messages.map((item) => ({
|
|
49
|
-
...item,
|
|
50
|
-
imageList: fileList
|
|
51
|
-
.filter((file) => item.files?.includes(file.id) && file.fileType.startsWith('image'))
|
|
52
|
-
.map((file) => ({
|
|
53
|
-
alt: file.name,
|
|
54
|
-
id: file.id,
|
|
55
|
-
url: file.url,
|
|
56
|
-
})),
|
|
57
|
-
}));
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
async getGroupMessages(groupId: string, topicId?: string): Promise<UIChatMessage[]> {
|
|
61
|
-
// For the deprecated service, group messages are the same as regular messages
|
|
62
|
-
// since the old schema doesn't differentiate between session and group messages
|
|
63
|
-
return this.getMessages(groupId, topicId);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
async getAllMessages() {
|
|
67
|
-
return MessageModel.queryAll();
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
async countMessages() {
|
|
71
|
-
return MessageModel.count();
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
// @ts-ignore
|
|
75
|
-
async rankModels(): Promise<ModelRankItem[]> {
|
|
76
|
-
throw new Error('Method not implemented.');
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
// @ts-ignore
|
|
80
|
-
async countWords(): Promise<number> {
|
|
81
|
-
throw new Error('Method not implemented.');
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
// @ts-ignore
|
|
85
|
-
async getHeatmaps() {
|
|
86
|
-
throw new Error('Method not implemented.');
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
async countTodayMessages() {
|
|
90
|
-
const topics = await MessageModel.queryAll();
|
|
91
|
-
return topics.filter(
|
|
92
|
-
(item) => dayjs(item.createdAt).format('YYYY-MM-DD') === dayjs().format('YYYY-MM-DD'),
|
|
93
|
-
).length;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
async getAllMessagesInSession(sessionId: string) {
|
|
97
|
-
return MessageModel.queryBySessionId(sessionId);
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
async updateMessageError(id: string, error: ChatMessageError) {
|
|
101
|
-
return MessageModel.update(id, { error });
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
// @ts-ignore
|
|
105
|
-
async updateMessage(id: string, message: Partial<DB_Message>): Promise<any> {
|
|
106
|
-
return MessageModel.update(id, message);
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
async updateMessageTTS(id: string, tts: Partial<ChatTTS> | false) {
|
|
110
|
-
return MessageModel.update(id, { tts });
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
async updateMessageTranslate(id: string, translate: Partial<ChatTranslate> | false) {
|
|
114
|
-
return MessageModel.update(id, { translate });
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
async updateMessagePluginState(id: string, value: Record<string, any>) {
|
|
118
|
-
return MessageModel.updatePluginState(id, value);
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
async updateMessagePluginArguments(id: string, value: string | Record<string, any>) {
|
|
122
|
-
const args = typeof value === 'string' ? value : JSON.stringify(value);
|
|
123
|
-
|
|
124
|
-
return MessageModel.updatePlugin(id, { arguments: args });
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
async bindMessagesToTopic(topicId: string, messageIds: string[]) {
|
|
128
|
-
return MessageModel.batchUpdate(messageIds, { topicId });
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
async removeMessage(id: string) {
|
|
132
|
-
return MessageModel.delete(id);
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
async removeMessages(ids: string[]) {
|
|
136
|
-
return MessageModel.bulkDelete(ids);
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
async removeMessagesByAssistant(assistantId: string, topicId?: string) {
|
|
140
|
-
return MessageModel.batchDelete(assistantId, topicId);
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
async removeMessagesByGroup(groupId: string, topicId?: string) {
|
|
144
|
-
return MessageModel.batchDelete(groupId, topicId);
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
async removeAllMessages() {
|
|
148
|
-
return MessageModel.clearTable();
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
async hasMessages() {
|
|
152
|
-
const number = await this.countMessages();
|
|
153
|
-
return number > 0;
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
async messageCountToCheckTrace() {
|
|
157
|
-
const number = await this.countMessages();
|
|
158
|
-
return number >= 4;
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
async updateMessagePluginError() {
|
|
162
|
-
throw new Error('Method not implemented.');
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
async updateMessageRAG(): Promise<void> {
|
|
166
|
-
throw new Error('Method not implemented.');
|
|
167
|
-
}
|
|
168
|
-
}
|