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