From 73664e6268842af1793a089698ec6306cab7683a Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Mon, 22 Sep 2025 20:34:52 +0530 Subject: [PATCH 1/2] fix: redirect user to /workflow page if they have workflow --- ui/src/app/after-sign-in/page.tsx | 40 ++++++++++++++++++++++++++++--- ui/src/app/page.tsx | 40 +++++++++++++++++++++++++++---- ui/src/lib/utils.ts | 33 +++++++++++++++++++++++-- 3 files changed, 104 insertions(+), 9 deletions(-) diff --git a/ui/src/app/after-sign-in/page.tsx b/ui/src/app/after-sign-in/page.tsx index eabad50..cbc16d6 100644 --- a/ui/src/app/after-sign-in/page.tsx +++ b/ui/src/app/after-sign-in/page.tsx @@ -1,6 +1,7 @@ import { redirect } from "next/navigation"; -import { getServerAuthProvider, getServerUser } from "@/lib/auth/server"; +import { getWorkflowsApiV1WorkflowFetchGet } from "@/client/sdk.gen"; +import { getServerAccessToken,getServerAuthProvider, getServerUser } from "@/lib/auth/server"; import logger from '@/lib/logger'; import { getRedirectUrl } from "@/lib/utils"; @@ -26,7 +27,40 @@ export default async function AfterSignInPage() { logger.debug('[AfterSignInPage] Redirecting to:', redirectUrl); redirect(redirectUrl); } - // For local provider or if user is not available, redirect to create-workflow - logger.debug('[AfterSignInPage] Fallback redirect to /create-workflow'); + + // For local provider or if user is not available, check for existing workflows + logger.debug('[AfterSignInPage] Checking for existing workflows before fallback'); + + try { + const accessToken = await getServerAccessToken(); + if (accessToken) { + const workflowsResponse = await getWorkflowsApiV1WorkflowFetchGet({ + headers: { + Authorization: `Bearer ${accessToken}`, + }, + }); + + const workflows = workflowsResponse.data ? (Array.isArray(workflowsResponse.data) ? workflowsResponse.data : [workflowsResponse.data]) : []; + const activeWorkflows = workflows.filter(w => w.status === 'active'); + + logger.debug('[AfterSignInPage] Found workflows:', { + total: workflows.length, + active: activeWorkflows.length + }); + + if (activeWorkflows.length > 0) { + logger.debug('[AfterSignInPage] Redirecting to /workflow - user has workflows'); + redirect('/workflow'); + } else { + logger.debug('[AfterSignInPage] Redirecting to /create-workflow - no workflows found'); + redirect('/create-workflow'); + } + } + } catch (error) { + logger.error('[AfterSignInPage] Error checking workflows:', error); + } + + // Default fallback + logger.debug('[AfterSignInPage] Final fallback redirect to /create-workflow'); redirect('/create-workflow'); } diff --git a/ui/src/app/page.tsx b/ui/src/app/page.tsx index c7338f9..fff4bc6 100644 --- a/ui/src/app/page.tsx +++ b/ui/src/app/page.tsx @@ -1,7 +1,8 @@ import { redirect } from "next/navigation"; +import { getWorkflowsApiV1WorkflowFetchGet } from "@/client/sdk.gen"; import SignInClient from "@/components/SignInClient"; -import { getServerAuthProvider,getServerUser } from "@/lib/auth/server"; +import { getServerAccessToken,getServerAuthProvider,getServerUser } from "@/lib/auth/server"; import logger from '@/lib/logger'; import { getRedirectUrl } from "@/lib/utils"; @@ -12,10 +13,41 @@ export default async function Home() { const authProvider = getServerAuthProvider(); logger.debug('[HomePage] Auth provider:', authProvider); - // For local/OSS provider, always redirect to workflow page + // For local/OSS provider, check if user has workflows if (authProvider === 'local') { - logger.debug('[HomePage] Redirecting to workflow page for local provider'); - redirect('/create-workflow'); + logger.debug('[HomePage] Local provider detected, checking for workflows'); + + try { + const accessToken = await getServerAccessToken(); + if (accessToken) { + const workflowsResponse = await getWorkflowsApiV1WorkflowFetchGet({ + headers: { + Authorization: `Bearer ${accessToken}`, + }, + }); + + const workflows = workflowsResponse.data ? (Array.isArray(workflowsResponse.data) ? workflowsResponse.data : [workflowsResponse.data]) : []; + const activeWorkflows = workflows.filter(w => w.status === 'active'); + + logger.debug('[HomePage] Found workflows for local provider:', { + total: workflows.length, + active: activeWorkflows.length + }); + + if (activeWorkflows.length > 0) { + logger.debug('[HomePage] Redirecting to /workflow - user has workflows'); + redirect('/workflow'); + } else { + logger.debug('[HomePage] Redirecting to /create-workflow - no workflows found'); + redirect('/create-workflow'); + } + } + } catch (error) { + logger.error('[HomePage] Error checking workflows for local provider:', error); + // Default to create-workflow on error + logger.debug('[HomePage] Defaulting to /create-workflow due to error'); + redirect('/create-workflow'); + } } logger.debug('[HomePage] Getting server user...'); diff --git a/ui/src/lib/utils.ts b/ui/src/lib/utils.ts index 0bb755e..5670141 100644 --- a/ui/src/lib/utils.ts +++ b/ui/src/lib/utils.ts @@ -2,6 +2,7 @@ import { type ClassValue, clsx } from "clsx" import { twMerge } from "tailwind-merge" import { getAuthUserApiV1UserAuthUserGet } from "@/client/sdk.gen"; +import { getWorkflowsApiV1WorkflowFetchGet } from "@/client/sdk.gen"; import { impersonateApiV1SuperuserImpersonatePost } from "@/client/sdk.gen"; export function cn(...inputs: ClassValue[]) { @@ -60,8 +61,36 @@ export async function getRedirectUrl(token: string, permissions: { id: string }[ return "/usage"; } - console.log('[getRedirectUrl] Has admin permission, redirecting to /create-workflow'); - return "/create-workflow"; + // Check if user has any workflows + try { + console.log('[getRedirectUrl] Checking for existing workflows...'); + const workflowsResponse = await getWorkflowsApiV1WorkflowFetchGet({ + headers: { + Authorization: `Bearer ${token}`, + }, + }); + + const workflows = workflowsResponse.data ? (Array.isArray(workflowsResponse.data) ? workflowsResponse.data : [workflowsResponse.data]) : []; + const activeWorkflows = workflows.filter(w => w.status === 'active'); + + console.log('[getRedirectUrl] Found workflows:', { + total: workflows.length, + active: activeWorkflows.length + }); + + if (activeWorkflows.length > 0) { + console.log('[getRedirectUrl] User has workflows, redirecting to /workflow'); + return "/workflow"; + } else { + console.log('[getRedirectUrl] No workflows found, redirecting to /create-workflow'); + return "/create-workflow"; + } + } catch (error) { + console.error('[getRedirectUrl] Error checking workflows:', error); + // If we can't check workflows, default to create-workflow + console.log('[getRedirectUrl] Defaulting to /create-workflow due to error'); + return "/create-workflow"; + } } catch (error) { console.error("[getRedirectUrl] Failed to fetch auth user:", error); // Re-throw the error so the caller can handle it From 490639309bb93ee9fce081adae753cb9ec8abc0b Mon Sep 17 00:00:00 2001 From: Sabiha Khan Date: Wed, 24 Sep 2025 11:53:48 +0530 Subject: [PATCH 2/2] fix: rethrow NEXT_REDIRECT error --- ui/src/app/page.tsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/ui/src/app/page.tsx b/ui/src/app/page.tsx index fff4bc6..a235ec8 100644 --- a/ui/src/app/page.tsx +++ b/ui/src/app/page.tsx @@ -1,4 +1,5 @@ import { redirect } from "next/navigation"; +import { isNextRouterError } from "next/dist/client/components/is-next-router-error"; import { getWorkflowsApiV1WorkflowFetchGet } from "@/client/sdk.gen"; import SignInClient from "@/components/SignInClient"; @@ -43,8 +44,13 @@ export default async function Home() { } } } catch (error) { + // Re-throw navigation errors (redirects, not found, etc.) - they're intentional + if (isNextRouterError(error)) { + throw error; + } + logger.error('[HomePage] Error checking workflows for local provider:', error); - // Default to create-workflow on error + // Default to create-workflow on actual errors logger.debug('[HomePage] Defaulting to /create-workflow due to error'); redirect('/create-workflow'); }