diff options
Diffstat (limited to 'packages/web/src/server/api/routers/memory.ts')
| -rw-r--r-- | packages/web/src/server/api/routers/memory.ts | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/packages/web/src/server/api/routers/memory.ts b/packages/web/src/server/api/routers/memory.ts new file mode 100644 index 0000000..d1bb849 --- /dev/null +++ b/packages/web/src/server/api/routers/memory.ts @@ -0,0 +1,80 @@ +import { SupabaseProjectStore, SupabaseStore } from "@imemio/sdk"; +import type { SupabaseClient } from "@supabase/supabase-js"; +import { z } from "zod"; +import { createClient } from "~/lib/supabase/server"; +import { createTRPCRouter, protectedProcedure } from "~/server/api/trpc"; + +const defaultProjectName = "default"; + +async function getOrCreateDefaultProject( + supabaseClient: SupabaseClient, + userId: string, +): Promise<string> { + const projectStore = new SupabaseProjectStore(supabaseClient, userId); + const projectsResult = await projectStore.list(); + + if (projectsResult.success && projectsResult.value.length > 0) { + const existingDefaultProject = projectsResult.value.find( + (project) => project.name === defaultProjectName, + ); + + if (existingDefaultProject) { + return existingDefaultProject.id; + } + + const firstProject = projectsResult.value[0]; + + if (firstProject) { + return firstProject.id; + } + } + + const createResult = await projectStore.create({ name: defaultProjectName }); + + if (!createResult.success) { + throw new Error("Failed to create default project"); + } + + return createResult.value.id; +} + +export const memoryRouter = createTRPCRouter({ + list: protectedProcedure.query(async ({ ctx }) => { + const supabaseClient = await createClient(); + const memoryStore = new SupabaseStore(supabaseClient, ctx.user.id); + const memories = await memoryStore.list(); + + return memories; + }), + + create: protectedProcedure + .input(z.object({ content: z.string().min(1) })) + .mutation(async ({ ctx, input }) => { + const supabaseClient = await createClient(); + const projectId = await getOrCreateDefaultProject( + supabaseClient, + ctx.user.id, + ); + const memoryStore = new SupabaseStore(supabaseClient, ctx.user.id); + const memory = await memoryStore.create({ + content: input.content, + projectId, + }); + + return memory; + }), + + delete: protectedProcedure + .input(z.object({ id: z.string() })) + .mutation(async ({ ctx, input }) => { + const supabaseClient = await createClient(); + const memoryStore = new SupabaseStore(supabaseClient, ctx.user.id); + const deleteResult = await memoryStore.delete(input.id); + + if (!deleteResult.success) { + throw new Error(`Memory not found: ${input.id}`); + } + + return { success: true }; + }), +}); |