UNPKG

@lobehub/chat

Version:

Lobe Chat - an open-source, high-performance chatbot framework that supports speech synthesis, multimodal, and extensible Function Call plugin system. Supports one-click free deployment of your private ChatGPT/LLM web application.

160 lines (136 loc) 4.62 kB
import { z } from 'zod'; import { TopicModel } from '@/database/models/topic'; import { getServerDB } from '@/database/server'; import { authedProcedure, publicProcedure, router } from '@/libs/trpc/lambda'; import { serverDatabase } from '@/libs/trpc/lambda/middleware'; import { BatchTaskResult } from '@/types/service'; const topicProcedure = authedProcedure.use(serverDatabase).use(async (opts) => { const { ctx } = opts; return opts.next({ ctx: { topicModel: new TopicModel(ctx.serverDB, ctx.userId) }, }); }); export const topicRouter = router({ batchCreateTopics: topicProcedure .input( z.array( z.object({ favorite: z.boolean().optional(), id: z.string().optional(), messages: z.array(z.string()).optional(), sessionId: z.string().optional(), title: z.string(), }), ), ) .mutation(async ({ input, ctx }): Promise<BatchTaskResult> => { const data = await ctx.topicModel.batchCreate( input.map((item) => ({ ...item, })) as any, ); return { added: data.length, ids: [], skips: [], success: true }; }), batchDelete: topicProcedure .input(z.object({ ids: z.array(z.string()) })) .mutation(async ({ input, ctx }) => { return ctx.topicModel.batchDelete(input.ids); }), batchDeleteBySessionId: topicProcedure .input(z.object({ id: z.string().nullable().optional() })) .mutation(async ({ input, ctx }) => { return ctx.topicModel.batchDeleteBySessionId(input.id); }), cloneTopic: topicProcedure .input(z.object({ id: z.string(), newTitle: z.string().optional() })) .mutation(async ({ input, ctx }) => { const data = await ctx.topicModel.duplicate(input.id, input.newTitle); return data.topic.id; }), countTopics: topicProcedure .input( z .object({ endDate: z.string().optional(), range: z.tuple([z.string(), z.string()]).optional(), startDate: z.string().optional(), }) .optional(), ) .query(async ({ ctx, input }) => { return ctx.topicModel.count(input); }), createTopic: topicProcedure .input( z.object({ favorite: z.boolean().optional(), messages: z.array(z.string()).optional(), sessionId: z.string().nullable().optional(), title: z.string(), }), ) .mutation(async ({ input, ctx }) => { const data = await ctx.topicModel.create(input); return data.id; }), getAllTopics: topicProcedure.query(async ({ ctx }) => { return ctx.topicModel.queryAll(); }), // TODO: this procedure should be used with authedProcedure getTopics: publicProcedure .input( z.object({ current: z.number().optional(), pageSize: z.number().optional(), sessionId: z.string().nullable().optional(), }), ) .query(async ({ input, ctx }) => { if (!ctx.userId) return []; const serverDB = await getServerDB(); const topicModel = new TopicModel(serverDB, ctx.userId); return topicModel.query(input); }), hasTopics: topicProcedure.query(async ({ ctx }) => { return (await ctx.topicModel.count()) === 0; }), rankTopics: topicProcedure.input(z.number().optional()).query(async ({ ctx, input }) => { return ctx.topicModel.rank(input); }), removeAllTopics: topicProcedure.mutation(async ({ ctx }) => { return ctx.topicModel.deleteAll(); }), removeTopic: topicProcedure .input(z.object({ id: z.string() })) .mutation(async ({ input, ctx }) => { return ctx.topicModel.delete(input.id); }), searchTopics: topicProcedure .input(z.object({ keywords: z.string(), sessionId: z.string().nullable().optional() })) .query(async ({ input, ctx }) => { return ctx.topicModel.queryByKeyword(input.keywords, input.sessionId); }), updateTopic: topicProcedure .input( z.object({ id: z.string(), value: z.object({ favorite: z.boolean().optional(), historySummary: z.string().optional(), messages: z.array(z.string()).optional(), metadata: z .object({ model: z.string().optional(), provider: z.string().optional(), }) .optional(), sessionId: z.string().optional(), title: z.string().optional(), }), }), ) .mutation(async ({ input, ctx }) => { return ctx.topicModel.update(input.id, input.value); }), }); export type TopicRouter = typeof topicRouter;