@lobehub/chat 1.35.9 → 1.35.10

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 (55) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/changelog/v1.json +9 -0
  3. package/package.json +1 -1
  4. package/src/app/(main)/repos/[id]/@menu/default.tsx +2 -1
  5. package/src/app/(main)/repos/[id]/page.tsx +2 -1
  6. package/src/database/schemas/topic.ts +3 -1
  7. package/src/database/server/core/dbForTest.ts +4 -6
  8. package/src/database/server/models/__tests__/_test_template.ts +3 -9
  9. package/src/database/server/models/__tests__/agent.test.ts +2 -8
  10. package/src/database/server/models/__tests__/asyncTask.test.ts +1 -7
  11. package/src/database/server/models/__tests__/chunk.test.ts +155 -16
  12. package/src/database/server/models/__tests__/file.test.ts +123 -15
  13. package/src/database/server/models/__tests__/knowledgeBase.test.ts +6 -12
  14. package/src/database/server/models/__tests__/message.test.ts +230 -7
  15. package/src/database/server/models/__tests__/nextauth.test.ts +1 -7
  16. package/src/database/server/models/__tests__/plugin.test.ts +1 -7
  17. package/src/database/server/models/__tests__/session.test.ts +169 -11
  18. package/src/database/server/models/__tests__/sessionGroup.test.ts +2 -8
  19. package/src/database/server/models/__tests__/topic.test.ts +1 -7
  20. package/src/database/server/models/__tests__/user.test.ts +55 -20
  21. package/src/database/server/models/_template.ts +10 -8
  22. package/src/database/server/models/agent.ts +17 -13
  23. package/src/database/server/models/asyncTask.ts +11 -9
  24. package/src/database/server/models/chunk.ts +19 -14
  25. package/src/database/server/models/embedding.ts +10 -8
  26. package/src/database/server/models/file.ts +19 -17
  27. package/src/database/server/models/knowledgeBase.ts +14 -12
  28. package/src/database/server/models/message.ts +36 -34
  29. package/src/database/server/models/plugin.ts +10 -8
  30. package/src/database/server/models/session.ts +23 -64
  31. package/src/database/server/models/sessionGroup.ts +11 -9
  32. package/src/database/server/models/thread.ts +11 -9
  33. package/src/database/server/models/topic.ts +19 -22
  34. package/src/database/server/models/user.ts +96 -84
  35. package/src/database/type.ts +7 -0
  36. package/src/libs/next-auth/adapter/index.ts +10 -10
  37. package/src/libs/trpc/async/asyncAuth.ts +2 -1
  38. package/src/server/routers/async/file.ts +5 -4
  39. package/src/server/routers/async/ragEval.ts +4 -3
  40. package/src/server/routers/lambda/_template.ts +2 -1
  41. package/src/server/routers/lambda/agent.ts +6 -5
  42. package/src/server/routers/lambda/chunk.ts +5 -5
  43. package/src/server/routers/lambda/file.ts +4 -3
  44. package/src/server/routers/lambda/knowledgeBase.ts +2 -1
  45. package/src/server/routers/lambda/message.ts +4 -2
  46. package/src/server/routers/lambda/plugin.ts +4 -2
  47. package/src/server/routers/lambda/ragEval.ts +2 -1
  48. package/src/server/routers/lambda/session.ts +4 -3
  49. package/src/server/routers/lambda/sessionGroup.ts +2 -1
  50. package/src/server/routers/lambda/thread.ts +3 -2
  51. package/src/server/routers/lambda/topic.ts +4 -2
  52. package/src/server/routers/lambda/user.ts +10 -9
  53. package/src/server/services/chunk/index.ts +3 -2
  54. package/src/server/services/nextAuthUser/index.ts +3 -3
  55. package/src/server/services/user/index.ts +7 -6
@@ -1,5 +1,6 @@
1
1
  import { z } from 'zod';
2
2
 
3
+ import { serverDB } from '@/database/server';
3
4
  import { TopicModel } from '@/database/server/models/topic';
4
5
  import { authedProcedure, publicProcedure, router } from '@/libs/trpc';
5
6
  import { BatchTaskResult } from '@/types/service';
@@ -8,7 +9,7 @@ const topicProcedure = authedProcedure.use(async (opts) => {
8
9
  const { ctx } = opts;
9
10
 
10
11
  return opts.next({
11
- ctx: { topicModel: new TopicModel(ctx.userId) },
12
+ ctx: { topicModel: new TopicModel(serverDB, ctx.userId) },
12
13
  });
13
14
  });
14
15
 
@@ -78,6 +79,7 @@ export const topicRouter = router({
78
79
  return ctx.topicModel.queryAll();
79
80
  }),
80
81
 
82
+ // TODO: this procedure should be used with authedProcedure
81
83
  getTopics: publicProcedure
82
84
  .input(
83
85
  z.object({
@@ -89,7 +91,7 @@ export const topicRouter = router({
89
91
  .query(async ({ input, ctx }) => {
90
92
  if (!ctx.userId) return [];
91
93
 
92
- const topicModel = new TopicModel(ctx.userId);
94
+ const topicModel = new TopicModel(serverDB, ctx.userId);
93
95
 
94
96
  return topicModel.query(input);
95
97
  }),
@@ -3,6 +3,7 @@ import { currentUser } from '@clerk/nextjs/server';
3
3
  import { z } from 'zod';
4
4
 
5
5
  import { enableClerk } from '@/const/auth';
6
+ import { serverDB } from '@/database/server';
6
7
  import { MessageModel } from '@/database/server/models/message';
7
8
  import { SessionModel } from '@/database/server/models/session';
8
9
  import { UserModel, UserNotFoundError } from '@/database/server/models/user';
@@ -12,7 +13,7 @@ import { UserGuideSchema, UserInitializationState, UserPreference } from '@/type
12
13
 
13
14
  const userProcedure = authedProcedure.use(async (opts) => {
14
15
  return opts.next({
15
- ctx: { userModel: new UserModel() },
16
+ ctx: { userModel: new UserModel(serverDB, opts.ctx.userId) },
16
17
  });
17
18
  });
18
19
 
@@ -23,7 +24,7 @@ export const userRouter = router({
23
24
  // get or create first-time user
24
25
  while (!state) {
25
26
  try {
26
- state = await ctx.userModel.getUserState(ctx.userId);
27
+ state = await ctx.userModel.getUserState();
27
28
  } catch (error) {
28
29
  if (enableClerk && error instanceof UserNotFoundError) {
29
30
  const user = await currentUser();
@@ -56,10 +57,10 @@ export const userRouter = router({
56
57
  }
57
58
  }
58
59
 
59
- const messageModel = new MessageModel(ctx.userId);
60
+ const messageModel = new MessageModel(serverDB, ctx.userId);
60
61
  const messageCount = await messageModel.count();
61
62
 
62
- const sessionModel = new SessionModel(ctx.userId);
63
+ const sessionModel = new SessionModel(serverDB, ctx.userId);
63
64
  const sessionCount = await sessionModel.count();
64
65
 
65
66
  return {
@@ -77,25 +78,25 @@ export const userRouter = router({
77
78
  }),
78
79
 
79
80
  makeUserOnboarded: userProcedure.mutation(async ({ ctx }) => {
80
- return ctx.userModel.updateUser(ctx.userId, { isOnboarded: true });
81
+ return ctx.userModel.updateUser({ isOnboarded: true });
81
82
  }),
82
83
 
83
84
  resetSettings: userProcedure.mutation(async ({ ctx }) => {
84
- return ctx.userModel.deleteSetting(ctx.userId);
85
+ return ctx.userModel.deleteSetting();
85
86
  }),
86
87
 
87
88
  updateGuide: userProcedure.input(UserGuideSchema).mutation(async ({ ctx, input }) => {
88
- return ctx.userModel.updateGuide(ctx.userId, input);
89
+ return ctx.userModel.updateGuide(input);
89
90
  }),
90
91
 
91
92
  updatePreference: userProcedure.input(z.any()).mutation(async ({ ctx, input }) => {
92
- return ctx.userModel.updatePreference(ctx.userId, input);
93
+ return ctx.userModel.updatePreference(input);
93
94
  }),
94
95
 
95
96
  updateSettings: userProcedure
96
97
  .input(z.object({}).passthrough())
97
98
  .mutation(async ({ ctx, input }) => {
98
- return ctx.userModel.updateSetting(ctx.userId, input);
99
+ return ctx.userModel.updateSetting(input);
99
100
  }),
100
101
  });
101
102
 
@@ -1,4 +1,5 @@
1
1
  import { JWTPayload } from '@/const/auth';
2
+ import { serverDB } from '@/database/server';
2
3
  import { AsyncTaskModel } from '@/database/server/models/asyncTask';
3
4
  import { FileModel } from '@/database/server/models/file';
4
5
  import { ChunkContentParams, ContentChunk } from '@/server/modules/ContentChunk';
@@ -21,8 +22,8 @@ export class ChunkService {
21
22
 
22
23
  this.chunkClient = new ContentChunk();
23
24
 
24
- this.fileModel = new FileModel(userId);
25
- this.asyncTaskModel = new AsyncTaskModel(userId);
25
+ this.fileModel = new FileModel(serverDB, userId);
26
+ this.asyncTaskModel = new AsyncTaskModel(serverDB, userId);
26
27
  }
27
28
 
28
29
  async chunkContent(params: ChunkContentParams) {
@@ -7,11 +7,9 @@ import { pino } from '@/libs/logger';
7
7
  import { LobeNextAuthDbAdapter } from '@/libs/next-auth/adapter';
8
8
 
9
9
  export class NextAuthUserService {
10
- userModel;
11
10
  adapter;
12
11
 
13
12
  constructor() {
14
- this.userModel = new UserModel();
15
13
  this.adapter = LobeNextAuthDbAdapter(serverDB);
16
14
  }
17
15
 
@@ -29,8 +27,10 @@ export class NextAuthUserService {
29
27
 
30
28
  // 2. If found, Update user data from provider
31
29
  if (user?.id) {
30
+ const userModel = new UserModel(serverDB, user.id);
31
+
32
32
  // Perform update
33
- await this.userModel.updateUser(user.id, {
33
+ await userModel.updateUser({
34
34
  avatar: data?.avatar,
35
35
  email: data?.email,
36
36
  fullName: data?.fullName,
@@ -1,13 +1,14 @@
1
1
  import { UserJSON } from '@clerk/backend';
2
2
  import { NextResponse } from 'next/server';
3
3
 
4
+ import { serverDB } from '@/database/server';
4
5
  import { UserModel } from '@/database/server/models/user';
5
6
  import { pino } from '@/libs/logger';
6
7
 
7
8
  export class UserService {
8
9
  createUser = async (id: string, params: UserJSON) => {
9
10
  // Check if user already exists
10
- const res = await UserModel.findById(id);
11
+ const res = await UserModel.findById(serverDB, id);
11
12
 
12
13
  // If user already exists, skip creating a new user
13
14
  if (res)
@@ -27,7 +28,7 @@ export class UserService {
27
28
  /* ↑ cloud slot ↑ */
28
29
 
29
30
  // 2. create user in database
30
- await UserModel.createUser({
31
+ await UserModel.createUser(serverDB, {
31
32
  avatar: params.image_url,
32
33
  clerkCreatedAt: new Date(params.created_at),
33
34
  email: email?.email_address,
@@ -49,7 +50,7 @@ export class UserService {
49
50
  if (id) {
50
51
  pino.info('delete user due to clerk webhook');
51
52
 
52
- await UserModel.deleteUser(id);
53
+ await UserModel.deleteUser(serverDB, id);
53
54
 
54
55
  return NextResponse.json({ message: 'user deleted' }, { status: 200 });
55
56
  } else {
@@ -61,10 +62,10 @@ export class UserService {
61
62
  updateUser = async (id: string, params: UserJSON) => {
62
63
  pino.info('updating user due to clerk webhook');
63
64
 
64
- const userModel = new UserModel();
65
+ const userModel = new UserModel(serverDB, id);
65
66
 
66
67
  // Check if user already exists
67
- const res = await UserModel.findById(id);
68
+ const res = await UserModel.findById(serverDB, id);
68
69
 
69
70
  // If user not exists, skip update the user
70
71
  if (!res)
@@ -79,7 +80,7 @@ export class UserService {
79
80
  const email = params.email_addresses.find((e) => e.id === params.primary_email_address_id);
80
81
  const phone = params.phone_numbers.find((e) => e.id === params.primary_phone_number_id);
81
82
 
82
- await userModel.updateUser(id, {
83
+ await userModel.updateUser({
83
84
  avatar: params.image_url,
84
85
  email: email?.email_address,
85
86
  firstName: params.first_name,