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