You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

83 lines
2.5 KiB
TypeScript

import {
router,
publicProcedure,
createCallerFactory,
} from "../../trpc/server";
import type { CommittedMessage } from "../../types.js";
import { db } from "../../database/lowdb";
import { nanoid } from "nanoid";
export const conversations = router({
fetchAll: publicProcedure.query(async () => {
const rows = await db.data.conversations;
return rows;
}),
fetchOne: publicProcedure
.input((x) => x as { id: string })
.query(async ({ input: { id } }) => {
const row = await db.data.conversations.find((c) => c.id === id);
return row;
}),
start: publicProcedure.mutation(async () => {
const title = "New Conversation";
const row = {
id: nanoid(),
title,
userId: "1",
};
await db.data.conversations.push(row);
db.write();
return row;
}),
deleteOne: publicProcedure
.input((x) => x as { id: string })
.mutation(async ({ input: { id } }) => {
db.data.conversations.splice(
db.data.conversations.findIndex((c) => c.id === id),
1
);
const deletedMessageIds = db.data.messages
.filter((m) => m.conversationId === id)
.map((m) => m.id);
db.data.messages = db.data.messages.filter(
(m) => m.conversationId !== id
);
const deletedFactIds = db.data.facts
.filter((fact) => deletedMessageIds.includes(fact.sourceMessageId))
.map((fact) => fact.id);
db.data.facts = db.data.facts.filter(
(fact) => !deletedFactIds.includes(fact.id)
);
db.data.factTriggers = db.data.factTriggers.filter(
(factTrigger) => !deletedFactIds.includes(factTrigger.sourceFactId)
);
db.write();
return { ok: true };
}),
updateTitle: publicProcedure
.input(
(x) =>
x as {
id: string;
title: string;
}
)
.mutation(async ({ input: { id, title } }) => {
const conversation = await db.data.conversations.find((c) => c.id === id);
if (!conversation) throw new Error("Conversation not found");
conversation.title = title;
db.write();
return { ok: true };
}),
fetchMessages: publicProcedure
.input((x) => x as { conversationId: string })
.query(async ({ input: { conversationId } }) => {
const rows = await db.data.messages.filter(
(m) => m.conversationId === conversationId
);
return rows as Array<CommittedMessage>;
}),
});
export const createCaller = createCallerFactory(conversations);