import log from "electron-log"; import { db } from "../../db"; import { eq } from "drizzle-orm"; import { apps } from "../../db/schema"; import { getSupabaseClient, listSupabaseBranches, } from "../../supabase_admin/supabase_management_client"; import { createLoggedHandler, createTestOnlyLoggedHandler, } from "./safe_handle"; import { handleSupabaseOAuthReturn } from "../../supabase_admin/supabase_return_handler"; import { safeSend } from "../utils/safe_sender"; import { SetSupabaseAppProjectParams, SupabaseBranch } from "../ipc_types"; const logger = log.scope("supabase_handlers"); const handle = createLoggedHandler(logger); const testOnlyHandle = createTestOnlyLoggedHandler(logger); export function registerSupabaseHandlers() { handle("supabase:list-projects", async () => { const supabase = await getSupabaseClient(); return supabase.getProjects(); }); // List branches for a Supabase project (database branches) handle( "supabase:list-branches", async ( _, { projectId }: { projectId: string }, ): Promise> => { const branches = await listSupabaseBranches({ supabaseProjectId: projectId, }); return branches.map((branch) => ({ id: branch.id, name: branch.name, isDefault: branch.is_default, projectRef: branch.project_ref, parentProjectRef: branch.parent_project_ref, })); }, ); // Set app project - links a MoreMinimore app to a Supabase project handle( "supabase:set-app-project", async ( _, { projectId, appId, parentProjectId }: SetSupabaseAppProjectParams, ) => { await db .update(apps) .set({ supabaseProjectId: projectId, supabaseParentProjectId: parentProjectId, }) .where(eq(apps.id, appId)); logger.info( `Associated app ${appId} with Supabase project ${projectId} ${parentProjectId ? `and parent project ${parentProjectId}` : ""}`, ); }, ); // Unset app project - removes the link between a MoreMinimore app and a Supabase project handle("supabase:unset-app-project", async (_, { app }: { app: number }) => { await db .update(apps) .set({ supabaseProjectId: null, supabaseParentProjectId: null }) .where(eq(apps.id, app)); logger.info(`Removed Supabase project association for app ${app}`); }); testOnlyHandle( "supabase:fake-connect-and-set-project", async ( event, { appId, fakeProjectId }: { appId: number; fakeProjectId: string }, ) => { // Call handleSupabaseOAuthReturn with fake data handleSupabaseOAuthReturn({ token: "fake-access-token", refreshToken: "fake-refresh-token", expiresIn: 3600, // 1 hour }); logger.info( `Called handleSupabaseOAuthReturn with fake data for app ${appId} during testing.`, ); // Set the supabase project for the currently selected app await db .update(apps) .set({ supabaseProjectId: fakeProjectId, }) .where(eq(apps.id, appId)); logger.info( `Set fake Supabase project ${fakeProjectId} for app ${appId} during testing.`, ); // Simulate the deep link event safeSend(event.sender, "deep-link-received", { type: "supabase-oauth-return", url: "https://supabase-oauth.dyad.sh/api/connect-supabase/login", }); logger.info( `Sent fake deep-link-received event for app ${appId} during testing.`, ); }, ); }