@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.
81 lines (65 loc) • 2.16 kB
text/typescript
import { and, desc, eq } from 'drizzle-orm/expressions';
import { LobeChatDatabase } from '@/database/type';
import { CreateThreadParams, ThreadStatus } from '@/types/topic';
import { ThreadItem, threads } from '../schemas';
const queryColumns = {
createdAt: threads.createdAt,
id: threads.id,
parentThreadId: threads.parentThreadId,
sourceMessageId: threads.sourceMessageId,
status: threads.status,
title: threads.title,
topicId: threads.topicId,
type: threads.type,
updatedAt: threads.updatedAt,
};
export class ThreadModel {
private userId: string;
private db: LobeChatDatabase;
constructor(db: LobeChatDatabase, userId: string) {
this.userId = userId;
this.db = db;
}
create = async (params: CreateThreadParams) => {
// @ts-ignore
const [result] = await this.db
.insert(threads)
.values({ ...params, status: ThreadStatus.Active, userId: this.userId })
.onConflictDoNothing()
.returning();
return result;
};
delete = async (id: string) => {
return this.db.delete(threads).where(and(eq(threads.id, id), eq(threads.userId, this.userId)));
};
deleteAll = async () => {
return this.db.delete(threads).where(eq(threads.userId, this.userId));
};
query = async () => {
const data = await this.db
.select(queryColumns)
.from(threads)
.where(eq(threads.userId, this.userId))
.orderBy(desc(threads.updatedAt));
return data as ThreadItem[];
};
queryByTopicId = async (topicId: string) => {
const data = await this.db
.select(queryColumns)
.from(threads)
.where(and(eq(threads.topicId, topicId), eq(threads.userId, this.userId)))
.orderBy(desc(threads.updatedAt));
return data as ThreadItem[];
};
findById = async (id: string) => {
return this.db.query.threads.findFirst({
where: and(eq(threads.id, id), eq(threads.userId, this.userId)),
});
};
update = async (id: string, value: Partial<ThreadItem>) => {
return this.db
.update(threads)
.set({ ...value, updatedAt: new Date() })
.where(and(eq(threads.id, id), eq(threads.userId, this.userId)));
};
}