@lobehub/lobehub 2.0.0-next.13 → 2.0.0-next.15

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.
Files changed (219) hide show
  1. package/.github/workflows/desktop-pr-build.yml +6 -6
  2. package/.github/workflows/release-desktop-beta.yml +4 -4
  3. package/.github/workflows/release.yml +1 -2
  4. package/.github/workflows/test.yml +4 -5
  5. package/.nvmrc +1 -1
  6. package/CHANGELOG.md +42 -0
  7. package/apps/desktop/tsconfig.json +0 -1
  8. package/changelog/v1.json +14 -0
  9. package/e2e/tsconfig.json +0 -1
  10. package/package.json +58 -58
  11. package/packages/const/src/version.ts +3 -3
  12. package/packages/database/src/repositories/dataImporter/deprecated/__tests__/index.test.ts +2 -1
  13. package/packages/database/src/repositories/dataImporter/deprecated/index.ts +7 -1
  14. package/packages/web-crawler/tsconfig.json +0 -1
  15. package/src/app/[variants]/(main)/(mobile)/me/(home)/__tests__/useCategory.test.tsx +9 -0
  16. package/src/app/[variants]/(main)/(mobile)/me/(home)/layout.tsx +0 -2
  17. package/src/app/[variants]/(main)/chat/@session/features/SessionListContent/List/Item/Actions.tsx +3 -28
  18. package/src/app/[variants]/(main)/chat/_layout/Desktop/index.tsx +0 -2
  19. package/src/app/[variants]/(main)/chat/_layout/Mobile.tsx +1 -5
  20. package/src/app/[variants]/(main)/chat/settings/features/HeaderContent.tsx +2 -62
  21. package/src/app/[variants]/(main)/image/page.tsx +0 -2
  22. package/src/app/[variants]/(main)/profile/_layout/Desktop/index.tsx +23 -24
  23. package/src/app/[variants]/(main)/profile/_layout/Mobile/index.tsx +5 -9
  24. package/src/app/[variants]/(main)/settings/_layout/Desktop/index.tsx +0 -2
  25. package/src/app/[variants]/(main)/settings/_layout/Mobile/index.tsx +0 -2
  26. package/src/app/[variants]/(main)/settings/provider/(list)/ProviderGrid/Card.tsx +1 -1
  27. package/src/app/[variants]/loading/index.tsx +1 -10
  28. package/src/components/Link.tsx +12 -0
  29. package/src/envs/app.ts +5 -8
  30. package/src/features/DataImporter/index.tsx +15 -60
  31. package/src/features/DevPanel/PostgresViewer/usePgTable.ts +3 -2
  32. package/src/hooks/useInterceptingRoutes.test.ts +21 -3
  33. package/src/libs/trpc/client/index.ts +0 -1
  34. package/src/libs/trpc/client/lambda.ts +8 -5
  35. package/src/server/routers/desktop/mcp.ts +1 -3
  36. package/src/server/routers/lambda/config/index.test.ts +2 -2
  37. package/src/server/routers/tools/mcp.ts +2 -3
  38. package/src/server/routers/tools/search.test.ts +1 -7
  39. package/src/server/routers/tools/search.ts +1 -4
  40. package/src/services/__tests__/tool.test.ts +0 -3
  41. package/src/services/aiModel/index.test.ts +0 -3
  42. package/src/services/aiModel/index.ts +1 -7
  43. package/src/services/aiProvider/index.test.ts +0 -3
  44. package/src/services/aiProvider/index.ts +1 -7
  45. package/src/services/chatGroup/index.ts +1 -10
  46. package/src/services/config.ts +1 -65
  47. package/src/services/export/index.ts +1 -4
  48. package/src/services/file/index.ts +1 -11
  49. package/src/services/import/index.ts +1 -7
  50. package/src/services/message/index.ts +1 -11
  51. package/src/services/plugin/index.ts +1 -11
  52. package/src/services/session/index.ts +1 -11
  53. package/src/services/tableViewer/client.ts +12 -15
  54. package/src/services/thread/index.ts +1 -7
  55. package/src/services/topic/index.ts +1 -11
  56. package/src/services/user/index.ts +1 -13
  57. package/src/store/chat/slices/aiChat/actions/__tests__/generateAIChat.test.ts +0 -241
  58. package/src/store/chat/slices/aiChat/actions/__tests__/generateAIChatV2.test.ts +26 -1
  59. package/src/store/chat/slices/aiChat/actions/__tests__/helpers.ts +3 -1
  60. package/src/store/chat/slices/aiChat/actions/generateAIChat.ts +1 -138
  61. package/src/store/user/slices/common/action.test.ts +1 -4
  62. package/tsconfig.json +0 -1
  63. package/src/app/(backend)/trpc/edge/[trpc]/route.ts +0 -26
  64. package/src/app/[variants]/(main)/(mobile)/me/data/features/Category.tsx +0 -48
  65. package/src/app/[variants]/(main)/(mobile)/me/data/features/Header.tsx +0 -33
  66. package/src/app/[variants]/(main)/(mobile)/me/data/layout.tsx +0 -13
  67. package/src/app/[variants]/(main)/(mobile)/me/data/loading.tsx +0 -5
  68. package/src/app/[variants]/(main)/(mobile)/me/data/page.tsx +0 -29
  69. package/src/app/[variants]/(main)/chat/features/Migration/DBReader.ts +0 -290
  70. package/src/app/[variants]/(main)/chat/features/Migration/ExportConfigButton.tsx +0 -35
  71. package/src/app/[variants]/(main)/chat/features/Migration/Failed.tsx +0 -120
  72. package/src/app/[variants]/(main)/chat/features/Migration/Modal.tsx +0 -81
  73. package/src/app/[variants]/(main)/chat/features/Migration/Start.tsx +0 -108
  74. package/src/app/[variants]/(main)/chat/features/Migration/UpgradeButton.tsx +0 -71
  75. package/src/app/[variants]/(main)/chat/features/Migration/const.ts +0 -15
  76. package/src/app/[variants]/(main)/chat/features/Migration/index.tsx +0 -50
  77. package/src/app/[variants]/loading/Client/Content.tsx +0 -48
  78. package/src/app/[variants]/loading/Client/Error.tsx +0 -27
  79. package/src/app/[variants]/loading/Client/Redirect.tsx +0 -47
  80. package/src/app/[variants]/loading/Client/index.tsx +0 -22
  81. package/src/components/InnerLink.tsx +0 -20
  82. package/src/database/_deprecated/core/__tests__/db-upgrade.test.ts +0 -42
  83. package/src/database/_deprecated/core/__tests__/db.test.ts +0 -79
  84. package/src/database/_deprecated/core/__tests__/model.test.ts +0 -55
  85. package/src/database/_deprecated/core/db.ts +0 -246
  86. package/src/database/_deprecated/core/index.ts +0 -2
  87. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/fixtures/input.json +0 -55
  88. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/fixtures/output.json +0 -60
  89. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/index.test.ts +0 -14
  90. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/index.ts +0 -22
  91. package/src/database/_deprecated/core/migrations/migrateSettingsToUser/type.ts +0 -105
  92. package/src/database/_deprecated/core/model.ts +0 -218
  93. package/src/database/_deprecated/core/schemas.ts +0 -88
  94. package/src/database/_deprecated/core/types/db.ts +0 -15
  95. package/src/database/_deprecated/models/__DEBUG.ts +0 -124
  96. package/src/database/_deprecated/models/__tests__/file.test.ts +0 -83
  97. package/src/database/_deprecated/models/__tests__/message.test.ts +0 -426
  98. package/src/database/_deprecated/models/__tests__/plugin.test.ts +0 -81
  99. package/src/database/_deprecated/models/__tests__/session.test.ts +0 -253
  100. package/src/database/_deprecated/models/__tests__/sessionGroup.test.ts +0 -220
  101. package/src/database/_deprecated/models/__tests__/topic.test.ts +0 -523
  102. package/src/database/_deprecated/models/__tests__/user.test.ts +0 -82
  103. package/src/database/_deprecated/models/file.ts +0 -51
  104. package/src/database/_deprecated/models/message.ts +0 -277
  105. package/src/database/_deprecated/models/plugin.ts +0 -62
  106. package/src/database/_deprecated/models/session.ts +0 -271
  107. package/src/database/_deprecated/models/sessionGroup.ts +0 -93
  108. package/src/database/_deprecated/models/topic.ts +0 -250
  109. package/src/database/_deprecated/models/user.ts +0 -69
  110. package/src/database/_deprecated/schemas/files.ts +0 -39
  111. package/src/database/_deprecated/schemas/message.ts +0 -50
  112. package/src/database/_deprecated/schemas/plugin.ts +0 -12
  113. package/src/database/_deprecated/schemas/session.ts +0 -54
  114. package/src/database/_deprecated/schemas/sessionGroup.ts +0 -8
  115. package/src/database/_deprecated/schemas/topic.ts +0 -12
  116. package/src/database/_deprecated/schemas/user.ts +0 -40
  117. package/src/features/DataImporter/_deprecated.ts +0 -43
  118. package/src/features/InitClientDB/EnableModal.tsx +0 -118
  119. package/src/features/InitClientDB/ErrorResult.tsx +0 -143
  120. package/src/features/InitClientDB/InitIndicator.tsx +0 -124
  121. package/src/features/InitClientDB/PGliteIcon.tsx +0 -28
  122. package/src/features/InitClientDB/features/DatabaseRepair/Backup.tsx +0 -75
  123. package/src/features/InitClientDB/features/DatabaseRepair/Diagnosis.tsx +0 -98
  124. package/src/features/InitClientDB/features/DatabaseRepair/Repair.tsx +0 -218
  125. package/src/features/InitClientDB/features/DatabaseRepair/index.tsx +0 -91
  126. package/src/features/InitClientDB/index.tsx +0 -37
  127. package/src/libs/trpc/client/edge.ts +0 -26
  128. package/src/libs/trpc/edge/context.ts +0 -71
  129. package/src/libs/trpc/edge/index.ts +0 -45
  130. package/src/libs/trpc/edge/init.ts +0 -26
  131. package/src/libs/trpc/edge/middleware/jwtPayload.test.ts +0 -75
  132. package/src/libs/trpc/edge/middleware/jwtPayload.ts +0 -14
  133. package/src/migrations/FromV0ToV1.ts +0 -10
  134. package/src/migrations/FromV1ToV2/fixtures/input-v1-session.json +0 -191
  135. package/src/migrations/FromV1ToV2/fixtures/output-v2.json +0 -202
  136. package/src/migrations/FromV1ToV2/index.ts +0 -82
  137. package/src/migrations/FromV1ToV2/migrations.test.ts +0 -224
  138. package/src/migrations/FromV1ToV2/types/v1.ts +0 -78
  139. package/src/migrations/FromV1ToV2/types/v2.ts +0 -52
  140. package/src/migrations/FromV2ToV3/fixtures/input-v2-session.json +0 -72
  141. package/src/migrations/FromV2ToV3/fixtures/output-v3-from-v1.json +0 -203
  142. package/src/migrations/FromV2ToV3/fixtures/output-v3.json +0 -74
  143. package/src/migrations/FromV2ToV3/index.ts +0 -30
  144. package/src/migrations/FromV2ToV3/migrations.test.ts +0 -42
  145. package/src/migrations/FromV2ToV3/types/v3.ts +0 -27
  146. package/src/migrations/FromV3ToV4/fixtures/azure-input-v3.json +0 -79
  147. package/src/migrations/FromV3ToV4/fixtures/azure-output-v4.json +0 -75
  148. package/src/migrations/FromV3ToV4/fixtures/ollama-input-v3.json +0 -85
  149. package/src/migrations/FromV3ToV4/fixtures/ollama-output-v4.json +0 -86
  150. package/src/migrations/FromV3ToV4/fixtures/openai-input-v3.json +0 -77
  151. package/src/migrations/FromV3ToV4/fixtures/openai-output-v4.json +0 -77
  152. package/src/migrations/FromV3ToV4/fixtures/openrouter-input-v3.json +0 -82
  153. package/src/migrations/FromV3ToV4/fixtures/openrouter-output-v4.json +0 -85
  154. package/src/migrations/FromV3ToV4/fixtures/output-v4-from-v1.json +0 -203
  155. package/src/migrations/FromV3ToV4/index.ts +0 -102
  156. package/src/migrations/FromV3ToV4/migrations.test.ts +0 -195
  157. package/src/migrations/FromV3ToV4/types/v3.ts +0 -52
  158. package/src/migrations/FromV3ToV4/types/v4.ts +0 -37
  159. package/src/migrations/FromV4ToV5/fixtures/from-v1-to-v5-output.json +0 -245
  160. package/src/migrations/FromV4ToV5/fixtures/function-input-v4.json +0 -96
  161. package/src/migrations/FromV4ToV5/fixtures/function-output-v5.json +0 -120
  162. package/src/migrations/FromV4ToV5/index.ts +0 -58
  163. package/src/migrations/FromV4ToV5/migrations.test.ts +0 -49
  164. package/src/migrations/FromV4ToV5/types/v4.ts +0 -21
  165. package/src/migrations/FromV4ToV5/types/v5.ts +0 -27
  166. package/src/migrations/FromV5ToV6/fixtures/from-v1-to-v6-output.json +0 -247
  167. package/src/migrations/FromV5ToV6/fixtures/session-input-v5.json +0 -81
  168. package/src/migrations/FromV5ToV6/fixtures/session-output-v6.json +0 -85
  169. package/src/migrations/FromV5ToV6/index.ts +0 -61
  170. package/src/migrations/FromV5ToV6/migrations.test.ts +0 -50
  171. package/src/migrations/FromV5ToV6/types/v5.ts +0 -48
  172. package/src/migrations/FromV5ToV6/types/v6.ts +0 -63
  173. package/src/migrations/FromV6ToV7/fixtures/output-v7-from-v1.json +0 -203
  174. package/src/migrations/FromV6ToV7/fixtures/provider-input-v6.json +0 -103
  175. package/src/migrations/FromV6ToV7/fixtures/provider-output-v7.json +0 -118
  176. package/src/migrations/FromV6ToV7/index.ts +0 -101
  177. package/src/migrations/FromV6ToV7/migrations.test.ts +0 -64
  178. package/src/migrations/FromV6ToV7/types/v6.ts +0 -61
  179. package/src/migrations/FromV6ToV7/types/v7.ts +0 -69
  180. package/src/migrations/VersionController.test.ts +0 -88
  181. package/src/migrations/VersionController.ts +0 -67
  182. package/src/migrations/index.ts +0 -61
  183. package/src/server/routers/edge/appStatus.ts +0 -3
  184. package/src/server/routers/edge/index.ts +0 -14
  185. package/src/server/routers/edge/upload.ts +0 -16
  186. package/src/services/aiModel/client.ts +0 -70
  187. package/src/services/aiProvider/client.ts +0 -58
  188. package/src/services/baseClientService/index.ts +0 -9
  189. package/src/services/chatGroup/client.ts +0 -63
  190. package/src/services/export/_deprecated.ts +0 -155
  191. package/src/services/export/client.ts +0 -15
  192. package/src/services/file/_deprecated.test.ts +0 -119
  193. package/src/services/file/_deprecated.ts +0 -80
  194. package/src/services/file/client.test.ts +0 -199
  195. package/src/services/file/client.ts +0 -85
  196. package/src/services/import/_deprecated.ts +0 -115
  197. package/src/services/import/client.test.ts +0 -1015
  198. package/src/services/import/client.ts +0 -64
  199. package/src/services/message/_deprecated.test.ts +0 -398
  200. package/src/services/message/_deprecated.ts +0 -168
  201. package/src/services/message/client.test.ts +0 -410
  202. package/src/services/message/client.ts +0 -192
  203. package/src/services/plugin/_deprecated.test.ts +0 -162
  204. package/src/services/plugin/_deprecated.ts +0 -42
  205. package/src/services/plugin/client.test.ts +0 -177
  206. package/src/services/plugin/client.ts +0 -46
  207. package/src/services/session/_deprecated.test.ts +0 -440
  208. package/src/services/session/_deprecated.ts +0 -190
  209. package/src/services/session/client.test.ts +0 -413
  210. package/src/services/session/client.ts +0 -193
  211. package/src/services/thread/client.ts +0 -51
  212. package/src/services/topic/_deprecated.test.ts +0 -245
  213. package/src/services/topic/_deprecated.ts +0 -75
  214. package/src/services/topic/client.ts +0 -89
  215. package/src/services/topic/pglite.test.ts +0 -212
  216. package/src/services/user/_deprecated.test.ts +0 -101
  217. package/src/services/user/_deprecated.ts +0 -70
  218. package/src/services/user/client.test.ts +0 -111
  219. 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
- }