From ec4dcea6294ffcd1c7c6cb838507ff73d45949d8 Mon Sep 17 00:00:00 2001 From: Bilal Godil Date: Mon, 13 Apr 2026 20:48:56 -0700 Subject: [PATCH] fix feedback forward to prod --- .../api/latest/internal/feedback/route.tsx | 3 +- .../api/v1/internal/feedback.test.ts | 31 ------------------- 2 files changed, 2 insertions(+), 32 deletions(-) diff --git a/apps/backend/src/app/api/latest/internal/feedback/route.tsx b/apps/backend/src/app/api/latest/internal/feedback/route.tsx index 99274039b..ef240622a 100644 --- a/apps/backend/src/app/api/latest/internal/feedback/route.tsx +++ b/apps/backend/src/app/api/latest/internal/feedback/route.tsx @@ -1,4 +1,5 @@ import { sendSupportFeedbackEmail } from "@/lib/internal-feedback-emails"; +import { isLocalEmulatorEnabled } from "@/lib/local-emulator"; import { createSmartRouteHandler } from "@/route-handlers/smart-route-handler"; import { DEFAULT_BRANCH_ID, getSoleTenancyFromProjectBranch } from "@/lib/tenancies"; import { adaptSchema, emailSchema, yupBoolean, yupNumber, yupObject, yupString } from "@stackframe/stack-shared/dist/schema-fields"; @@ -45,7 +46,7 @@ export const POST = createSmartRouteHandler({ async handler({ auth, body }) { // Forward to production in local emulator (same pattern as AI query endpoint) const feedbackMode = getEnvVariable("STACK_FEEDBACK_MODE", "email"); - if (feedbackMode === "FORWARD_TO_PRODUCTION") { + if (feedbackMode === "FORWARD_TO_PRODUCTION" && isLocalEmulatorEnabled()) { const prodResponse = await fetch("https://api.stack-auth.com/api/latest/internal/feedback", { method: "POST", headers: { "content-type": "application/json", "accept-encoding": "identity" }, diff --git a/apps/e2e/tests/backend/endpoints/api/v1/internal/feedback.test.ts b/apps/e2e/tests/backend/endpoints/api/v1/internal/feedback.test.ts index 38b8ad090..b75e9b767 100644 --- a/apps/e2e/tests/backend/endpoints/api/v1/internal/feedback.test.ts +++ b/apps/e2e/tests/backend/endpoints/api/v1/internal/feedback.test.ts @@ -2,31 +2,8 @@ import { describe } from "vitest"; import { it } from "../../../../../helpers"; import { Auth, backendContext, createMailbox, niceBackendFetch, waitForOutboxEmailWithStatus } from "../../../../backend-helpers"; -/** - * Probe the backend to detect whether it's forwarding feedback to production. - * Cached so we only make one probe request per test run. - */ -let cachedIsForwarding: boolean | null = null; -async function isForwardingToProduction(): Promise { - if (cachedIsForwarding !== null) return cachedIsForwarding; - const probe = await niceBackendFetch("/api/v1/internal/feedback", { - method: "POST", - body: { - email: "probe@test.stack-auth.com", - message: "mode detection probe", - }, - }); - // When forwarding, production rejects and we get a non-200 with "forward" in the body - cachedIsForwarding = probe.status !== 200; - return cachedIsForwarding; -} - describe("POST /api/v1/internal/feedback", () => { it("should send feedback from an authenticated user", async ({ expect }) => { - if (await isForwardingToProduction()) { - return; // forwarding mode — probe already verified endpoint is reachable - } - const senderEmail = backendContext.value.mailbox.emailAddress; const signInResult = await Auth.Otp.signIn(); const recipientMailbox = createMailbox("team@stack-auth.com"); @@ -67,10 +44,6 @@ describe("POST /api/v1/internal/feedback", () => { }); it("should send feedback without authentication (dev tool)", async ({ expect }) => { - if (await isForwardingToProduction()) { - return; - } - const recipientMailbox = createMailbox("team@stack-auth.com"); const subject = "[Support] devtool-user@example.com"; @@ -107,10 +80,6 @@ describe("POST /api/v1/internal/feedback", () => { }); it("should send bug reports with correct label", async ({ expect }) => { - if (await isForwardingToProduction()) { - return; - } - const recipientMailbox = createMailbox("team@stack-auth.com"); const subject = "[Bug Report] bug@example.com";