|
import { zip } from 'lodash-es' |
|
import { ChatMessageModel, BotId } from '@/lib/bots/bing/types' |
|
import { Storage } from '../storage' |
|
|
|
|
|
|
|
|
|
|
|
|
|
interface Conversation { |
|
id: string |
|
createdAt: number |
|
} |
|
|
|
type ConversationWithMessages = Conversation & { messages: ChatMessageModel[] } |
|
|
|
async function loadHistoryConversations(botId: BotId): Promise<Conversation[]> { |
|
const key = `conversations:${botId}` |
|
const { [key]: value } = await Storage.get(key) |
|
return value || [] |
|
} |
|
|
|
async function deleteHistoryConversation(botId: BotId, cid: string) { |
|
const conversations = await loadHistoryConversations(botId) |
|
const newConversations = conversations.filter((c) => c.id !== cid) |
|
await Storage.set({ [`conversations:${botId}`]: newConversations }) |
|
} |
|
|
|
async function loadConversationMessages(botId: BotId, cid: string): Promise<ChatMessageModel[]> { |
|
const key = `conversation:${botId}:${cid}:messages` |
|
const { [key]: value } = await Storage.get(key) |
|
return value || [] |
|
} |
|
|
|
export async function setConversationMessages(botId: BotId, cid: string, messages: ChatMessageModel[]) { |
|
const conversations = await loadHistoryConversations(botId) |
|
if (!conversations.some((c) => c.id === cid)) { |
|
conversations.unshift({ id: cid, createdAt: Date.now() }) |
|
await Storage.set({ [`conversations:${botId}`]: conversations }) |
|
} |
|
const key = `conversation:${botId}:${cid}:messages` |
|
await Storage.set({ [key]: messages }) |
|
} |
|
|
|
export async function loadHistoryMessages(botId: BotId): Promise<ConversationWithMessages[]> { |
|
const conversations = await loadHistoryConversations(botId) |
|
const messagesList = await Promise.all(conversations.map((c) => loadConversationMessages(botId, c.id))) |
|
return zip(conversations, messagesList).map(([c, messages]) => ({ |
|
id: c!.id, |
|
createdAt: c!.createdAt, |
|
messages: messages!, |
|
})) |
|
} |
|
|
|
export async function deleteHistoryMessage(botId: BotId, conversationId: string, messageId: string) { |
|
const messages = await loadConversationMessages(botId, conversationId) |
|
const newMessages = messages.filter((m) => m.id !== messageId) |
|
await setConversationMessages(botId, conversationId, newMessages) |
|
if (!newMessages.length) { |
|
await deleteHistoryConversation(botId, conversationId) |
|
} |
|
} |
|
|