diff options
Diffstat (limited to 'packages/web/src/server/api')
| -rw-r--r-- | packages/web/src/server/api/root.ts | 2 | ||||
| -rw-r--r-- | packages/web/src/server/api/routers/memory.ts | 80 |
2 files changed, 82 insertions, 0 deletions
diff --git a/packages/web/src/server/api/root.ts b/packages/web/src/server/api/root.ts index 374285c..b0fd7ba 100644 --- a/packages/web/src/server/api/root.ts +++ b/packages/web/src/server/api/root.ts @@ -1,3 +1,4 @@ +import { memoryRouter } from "~/server/api/routers/memory"; import { postRouter } from "~/server/api/routers/post"; import { createCallerFactory, createTRPCRouter } from "~/server/api/trpc"; @@ -7,6 +8,7 @@ import { createCallerFactory, createTRPCRouter } from "~/server/api/trpc"; * All routers added in /api/routers should be manually added here. */ export const appRouter = createTRPCRouter({ + memory: memoryRouter, post: postRouter, }); 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 }; + }), +}); |