blind_chat / src /routes /LocalDB.ts
lauro1's picture
updates
d54ea4b
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: "", // Hardcoded for now
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();