refactor trpc procedures into domains
parent
25523559aa
commit
3b84e01057
@ -0,0 +1,76 @@
|
||||
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,
|
||||
);
|
||||
db.data.facts = db.data.facts.filter(
|
||||
(fact) => !deletedMessageIds.includes(fact.sourceMessageId),
|
||||
);
|
||||
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);
|
@ -0,0 +1,39 @@
|
||||
import {
|
||||
router,
|
||||
publicProcedure,
|
||||
createCallerFactory,
|
||||
} from "../../trpc/server.js";
|
||||
import { db, type Fact } from "../../database/lowdb.js";
|
||||
|
||||
export const facts = router({
|
||||
fetchByConversationId: publicProcedure
|
||||
.input((x) => x as { conversationId: string })
|
||||
.query(async ({ input: { conversationId } }) => {
|
||||
const conversationMessageIds = db.data.messages
|
||||
.filter((m) => m.conversationId === conversationId)
|
||||
.map((m) => m.id);
|
||||
const rows = await db.data.facts.filter((f) =>
|
||||
conversationMessageIds.includes(f.sourceMessageId),
|
||||
);
|
||||
return rows as Array<Fact>;
|
||||
}),
|
||||
deleteOne: publicProcedure
|
||||
.input(
|
||||
(x) =>
|
||||
x as {
|
||||
factId: string;
|
||||
},
|
||||
)
|
||||
.mutation(async ({ input: { factId } }) => {
|
||||
const deletedFact = db.data.facts.find((fact) => fact.id === factId);
|
||||
if (!deletedFact) throw new Error("Fact not found");
|
||||
db.data.facts.splice(
|
||||
db.data.facts.findIndex((fact) => fact.id === factId),
|
||||
1,
|
||||
);
|
||||
db.write();
|
||||
return { ok: true };
|
||||
}),
|
||||
});
|
||||
|
||||
export const createCaller = createCallerFactory(facts);
|
@ -0,0 +1,19 @@
|
||||
import {
|
||||
router,
|
||||
publicProcedure,
|
||||
createCallerFactory,
|
||||
} from "../../trpc/server";
|
||||
import { createCaller as createConversationsCaller } from "./conversations.js";
|
||||
|
||||
export const messages = router({
|
||||
fetchByConversationId: publicProcedure
|
||||
.input((x) => x as { conversationId: string })
|
||||
.query(async ({ input: { conversationId } }) => {
|
||||
const caller = createConversationsCaller({});
|
||||
return await caller.fetchMessages({
|
||||
conversationId,
|
||||
});
|
||||
}),
|
||||
});
|
||||
|
||||
export const createCaller = createCallerFactory(messages);
|
Loading…
Reference in New Issue