| import Dexie, { type Table, liveQuery } from "dexie"; |
| import { refresh_chats_writable_empty, refresh_chats_writable } from "../routes/LayoutWritable"; |
| import { env } from "$env/dynamic/public"; |
|
|
| export interface Chat { |
| index?: number; |
| title: string; |
| id: string; |
| createdAt: Date; |
| model: string; |
| message?: Array<MessageDb>; |
| } |
|
|
| export interface MessageDb { |
| content: string; |
| from: string; |
| id: string; |
| createdAt: Date; |
| updatedAt: Date; |
| } |
|
|
| export class ChatDatabase extends Dexie { |
| chats!: Table<Chat>; |
|
|
| constructor() { |
| super("blindchat"); |
| this.version(16).stores({ |
| chats: null, |
| }); |
| this.version(17).stores({ |
| chats: null, |
| }); |
| this.version(18).stores({ |
| chats: "++index, title, createdAt, id, message, model", |
| }); |
| } |
| } |
|
|
| export async function createChat( |
| id_chat: string, |
| msg: MessageDb | undefined, |
| model: string, |
| title?: string |
| ) { |
| try { |
| let title_f = ""; |
| if (title === undefined) { |
| let count = (await db.chats.count()) + 1; |
| title_f = "Untitled " + count; |
| } else title_f = title; |
| const chat = { |
| id: id_chat, |
| title: title_f, |
| message: msg === undefined ? undefined : [msg], |
| createdAt: new Date(), |
| model: model, |
| }; |
| const id = await db.chats.add(chat); |
| } catch (error) { |
| console.log(error); |
| } |
| let push = await getChats(); |
| refresh_chats_writable.set(push); |
| } |
|
|
| export async function deleteAllChats() { |
| const chat_ret = await db.chats.clear(); |
| refresh_chats_writable_empty.set(true); |
| } |
|
|
| export async function deleteChat(id_chat: string) { |
| const chat_ret = await db.chats.where("id").equals(id_chat).delete(); |
| let count = await db.chats.count(); |
| if (count > 0) { |
| let push = await getChats(); |
| refresh_chats_writable.set(push); |
| } else { |
| refresh_chats_writable_empty.set(true); |
| } |
| } |
|
|
| export async function modifyTitle(id_chat: string, newTitle: string) { |
| const chat_ret = db.chats.where("id").equals(id_chat); |
| let count = await chat_ret.count(); |
| if (count > 0) { |
| let res = await chat_ret.first(); |
| chat_ret.modify({ title: newTitle }); |
| let push = await getChats(); |
| refresh_chats_writable.set(push); |
| } |
| } |
|
|
| export async function addMessageToChat(id_chat: string, msg: MessageDb, model: string) { |
| const chat_ret = db.chats.where("id").equals(id_chat); |
| let count = await chat_ret.count(); |
| if (count < 1) { |
| createChat(id_chat, msg, model); |
| } else { |
| let msgs: MessageDb[]; |
| chat_ret.first().then((res) => { |
| if (res?.message == undefined) { |
| msgs.push(msg); |
| res.message = msgs; |
| } |
| res.message.push(msg); |
| chat_ret.modify({ id: id_chat, message: res.message }); |
| }); |
| } |
| } |
|
|
| export async function getTitle(id_chat: string) { |
| let title_ret = env.PUBLIC_APP_NAME; |
| try { |
| const chat_ret = await db.chats.where("id").equals(id_chat).first(); |
| title_ret = chat_ret!.title; |
| } catch (err) { |
| console.log(err); |
| } |
| return title_ret; |
| } |
|
|
| export async function getMessages(id_chat: string) { |
| try { |
| const chat_ret = await db.chats.where("id").equals(id_chat).first(); |
| const msg = chat_ret?.message; |
| return [...msg]; |
| } catch (err) { |
| console.log(err); |
| } |
| return undefined; |
| } |
|
|
| export async function getModel(id_chat: string) { |
| try { |
| const chat_ret = await db.chats.where("id").equals(id_chat).first(); |
| let model = chat_ret?.model; |
| if (model === undefined) return ""; |
| return model; |
| } catch (err) { |
| console.log(err); |
| } |
| return ""; |
| } |
|
|
| export async function getChats() { |
| let titles = []; |
| try { |
| const all = (await db.chats.orderBy("createdAt").toArray()).forEach(function (chat) { |
| titles.push({ |
| title: chat.title, |
| model: "", |
| id: chat.id, |
| updatedAt: chat.createdAt, |
| createdAt: chat.createdAt, |
| }); |
| }); |
| } catch (err) { |
| console.log(err); |
| } |
| return titles; |
| } |
|
|
| export async function getChat(id_chat: string) { |
| const chat_ret = db.chats |
| .where("id") |
| .equals(id_chat) |
| .first() |
| .then((res) => { |
| return res; |
| }); |
| } |
|
|
| export const db = new ChatDatabase(); |
|
|