| | 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(); |
| |
|