lobe-chat

Форк
0
102 строки · 3.5 Кб
1
import { UserJSON } from '@clerk/backend';
2
import { currentUser } from '@clerk/nextjs/server';
3
import { z } from 'zod';
4

5
import { enableClerk } from '@/const/auth';
6
import { MessageModel } from '@/database/server/models/message';
7
import { SessionModel } from '@/database/server/models/session';
8
import { UserModel, UserNotFoundError } from '@/database/server/models/user';
9
import { authedProcedure, router } from '@/libs/trpc';
10
import { UserService } from '@/server/services/user';
11
import { UserGuideSchema, UserInitializationState, UserPreference } from '@/types/user';
12

13
const userProcedure = authedProcedure.use(async (opts) => {
14
  return opts.next({
15
    ctx: { userModel: new UserModel() },
16
  });
17
});
18

19
export const userRouter = router({
20
  getUserState: userProcedure.query(async ({ ctx }): Promise<UserInitializationState> => {
21
    let state: Awaited<ReturnType<UserModel['getUserState']>> | undefined;
22

23
    // get or create first-time user
24
    while (!state) {
25
      try {
26
        state = await ctx.userModel.getUserState(ctx.userId);
27
      } catch (error) {
28
        if (enableClerk && error instanceof UserNotFoundError) {
29
          const user = await currentUser();
30
          if (user) {
31
            const userService = new UserService();
32

33
            await userService.createUser(user.id, {
34
              created_at: user.createdAt,
35
              email_addresses: user.emailAddresses.map((e) => ({
36
                email_address: e.emailAddress,
37
                id: e.id,
38
              })),
39
              first_name: user.firstName,
40
              id: user.id,
41
              image_url: user.imageUrl,
42
              last_name: user.lastName,
43
              phone_numbers: user.phoneNumbers.map((e) => ({
44
                id: e.id,
45
                phone_number: e.phoneNumber,
46
              })),
47
              primary_email_address_id: user.primaryEmailAddressId,
48
              primary_phone_number_id: user.primaryPhoneNumberId,
49
              username: user.username,
50
            } as UserJSON);
51

52
            continue;
53
          }
54
        }
55
        throw error;
56
      }
57
    }
58

59
    const messageModel = new MessageModel(ctx.userId);
60
    const messageCount = await messageModel.count();
61

62
    const sessionModel = new SessionModel(ctx.userId);
63
    const sessionCount = await sessionModel.count();
64

65
    return {
66
      canEnablePWAGuide: messageCount >= 4,
67
      canEnableTrace: messageCount >= 4,
68
      // 有消息,或者创建过助手,则认为有 conversation
69
      hasConversation: messageCount > 0 || sessionCount > 1,
70

71
      // always return true for community version
72
      isOnboard: state.isOnboarded || true,
73
      preference: state.preference as UserPreference,
74
      settings: state.settings,
75
      userId: ctx.userId,
76
    };
77
  }),
78

79
  makeUserOnboarded: userProcedure.mutation(async ({ ctx }) => {
80
    return ctx.userModel.updateUser(ctx.userId, { isOnboarded: true });
81
  }),
82

83
  resetSettings: userProcedure.mutation(async ({ ctx }) => {
84
    return ctx.userModel.deleteSetting(ctx.userId);
85
  }),
86

87
  updateGuide: userProcedure.input(UserGuideSchema).mutation(async ({ ctx, input }) => {
88
    return ctx.userModel.updateGuide(ctx.userId, input);
89
  }),
90

91
  updatePreference: userProcedure.input(z.any()).mutation(async ({ ctx, input }) => {
92
    return ctx.userModel.updatePreference(ctx.userId, input);
93
  }),
94

95
  updateSettings: userProcedure
96
    .input(z.object({}).passthrough())
97
    .mutation(async ({ ctx, input }) => {
98
      return ctx.userModel.updateSetting(ctx.userId, input);
99
    }),
100
});
101

102
export type UserRouter = typeof userRouter;
103

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.