aboutsummaryrefslogtreecommitdiff
path: root/packages/web/src/server/api
diff options
context:
space:
mode:
Diffstat (limited to 'packages/web/src/server/api')
-rw-r--r--packages/web/src/server/api/root.ts2
-rw-r--r--packages/web/src/server/api/routers/memory.ts80
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 };
+ }),
+});