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.

93 lines
2.8 KiB
TypeScript

import type { CommittedMessage } from "../../types";
import { router, publicProcedure, createCallerFactory } from "./server";
export const conversations = router({
fetchAll: publicProcedure.query(async ({ ctx: { dbClient, jwt } }) => {
const userId = jwt?.id as string | null;
if (!userId) return [];
const rows = await dbClient
.selectFrom("conversations")
.where("userId", "=", userId)
.selectAll()
.execute();
return rows;
}),
fetchOne: publicProcedure
.input((x) => x as { id: string })
.query(async ({ input: { id }, ctx: { dbClient, jwt } }) => {
const userId = jwt?.id as string | null;
if (!userId) return null;
const row = await dbClient
.selectFrom("conversations")
.selectAll()
.where("id", "=", id)
.where("userId", "=", userId)
.execute();
return row[0];
}),
start: publicProcedure.mutation(async ({ ctx: { dbClient, jwt } }) => {
const userId = jwt?.id as string | null;
if (!userId) return null;
const insertedRows = await dbClient
.insertInto("conversations")
.values({
title: "New Conversation",
userId: jwt?.id as string,
})
.returningAll()
.execute();
return insertedRows[0];
}),
deleteOne: publicProcedure
.input((x) => x as { id: string })
.mutation(async ({ input: { id }, ctx: { dbClient, jwt } }) => {
const userId = jwt?.id as string | null;
if (!userId) return { ok: false };
await dbClient
.deleteFrom("conversations")
.where("id", "=", id)
.where("userId", "=", userId)
.execute();
return { ok: true };
}),
updateTitle: publicProcedure
.input(
(x) =>
x as {
id: string;
title: string;
}
)
.mutation(async ({ input: { id, title }, ctx: { dbClient, jwt } }) => {
const userId = jwt?.id as string | null;
if (!userId) return { ok: false };
await dbClient
.updateTable("conversations")
.set({ title })
.where("id", "=", id)
.where("userId", "=", userId)
.execute();
return { ok: true };
}),
fetchMessages: publicProcedure
.input((x) => x as { conversationId: string })
.query(async ({ input: { conversationId }, ctx: { dbClient, jwt } }) => {
const userId = jwt?.id as string | null;
if (!userId) return [];
const rows = await dbClient
.selectFrom("messages")
.innerJoin(
"conversations",
"conversations.id",
"messages.conversationId"
)
.selectAll("messages")
.where("conversationId", "=", conversationId)
.where("conversations.userId", "=", userId)
.execute();
return rows as Array<CommittedMessage>;
}),
});
export const createCaller = createCallerFactory(conversations);