fix(engine): default to paid placement on billing errors (#2604)

* chore(billing): improve logs to distinguish between failure modes

* fix(engine): default to paid placement on billing errors

* chore(engine): set plan type according to paying field when missing
This commit is contained in:
nicktrn
2025-10-15 10:32:27 +01:00
committed by GitHub
parent cca10c22d3
commit 5781783c74
2 changed files with 32 additions and 17 deletions
+14 -14
View File
@@ -205,7 +205,7 @@ export async function getCurrentPlan(orgId: string) {
firstDayOfNextMonth.setUTCHours(0, 0, 0, 0);
if (!result.success) {
logger.error("Error getting current plan", { orgId, error: result.error });
logger.error("Error getting current plan - no success", { orgId, error: result.error });
return undefined;
}
@@ -221,7 +221,7 @@ export async function getCurrentPlan(orgId: string) {
return { ...result, usage };
} catch (e) {
logger.error("Error getting current plan", { orgId, error: e });
logger.error("Error getting current plan - caught error", { orgId, error: e });
return undefined;
}
}
@@ -232,13 +232,13 @@ export async function getLimits(orgId: string) {
try {
const result = await client.currentPlan(orgId);
if (!result.success) {
logger.error("Error getting limits", { orgId, error: result.error });
logger.error("Error getting limits - no success", { orgId, error: result.error });
return undefined;
}
return result.v3Subscription?.plan?.limits;
} catch (e) {
logger.error("Error getting limits", { orgId, error: e });
logger.error("Error getting limits - caught error", { orgId, error: e });
return undefined;
}
}
@@ -279,12 +279,12 @@ export async function getPlans() {
try {
const result = await client.plans();
if (!result.success) {
logger.error("Error getting plans", { error: result.error });
logger.error("Error getting plans - no success", { error: result.error });
return undefined;
}
return result;
} catch (e) {
logger.error("Error getting plans", { error: e });
logger.error("Error getting plans - caught error", { error: e });
return undefined;
}
}
@@ -362,12 +362,12 @@ export async function getUsage(organizationId: string, { from, to }: { from: Dat
try {
const result = await client.usage(organizationId, { from, to });
if (!result.success) {
logger.error("Error getting usage", { error: result.error });
logger.error("Error getting usage - no success", { error: result.error });
return undefined;
}
return result;
} catch (e) {
logger.error("Error getting usage", { error: e });
logger.error("Error getting usage - caught error", { error: e });
return undefined;
}
}
@@ -396,12 +396,12 @@ export async function getUsageSeries(organizationId: string, params: UsageSeries
try {
const result = await client.usageSeries(organizationId, params);
if (!result.success) {
logger.error("Error getting usage series", { error: result.error });
logger.error("Error getting usage series - no success", { error: result.error });
return undefined;
}
return result;
} catch (e) {
logger.error("Error getting usage series", { error: e });
logger.error("Error getting usage series - caught error", { error: e });
return undefined;
}
}
@@ -420,12 +420,12 @@ export async function reportInvocationUsage(
additionalData,
});
if (!result.success) {
logger.error("Error reporting invocation", { error: result.error });
logger.error("Error reporting invocation - no success", { error: result.error });
return undefined;
}
return result;
} catch (e) {
logger.error("Error reporting invocation", { error: e });
logger.error("Error reporting invocation - caught error", { error: e });
return undefined;
}
}
@@ -448,14 +448,14 @@ export async function getEntitlement(
try {
const result = await client.getEntitlement(organizationId);
if (!result.success) {
logger.error("Error getting entitlement", { error: result.error });
logger.error("Error getting entitlement - no success", { error: result.error });
return {
hasAccess: true as const,
};
}
return result;
} catch (e) {
logger.error("Error getting entitlement", { error: e });
logger.error("Error getting entitlement - caught error", { error: e });
return {
hasAccess: true as const,
};
+18 -3
View File
@@ -5,6 +5,7 @@ import { defaultMachine, getCurrentPlan } from "~/services/platform.v3.server";
import { singleton } from "~/utils/singleton";
import { allMachines } from "./machinePresets.server";
import { meter, tracer } from "./tracer.server";
import { logger } from "~/services/logger.server";
export const engine = singleton("RunEngine", createRunEngine);
@@ -120,23 +121,37 @@ function createRunEngine() {
getCurrentPlan: async (orgId: string) => {
const plan = await getCurrentPlan(orgId);
// This only happens when there's no billing service running or on errors
if (!plan) {
logger.warn("engine.getCurrentPlan: no plan", { orgId });
return {
isPaying: false,
type: "free",
isPaying: true,
type: "paid", // default to paid
};
}
// This shouldn't happen
if (!plan.v3Subscription) {
logger.warn("engine.getCurrentPlan: no v3 subscription", { orgId });
return {
isPaying: false,
type: "free",
};
}
// Neither should this
if (!plan.v3Subscription.plan) {
logger.warn("engine.getCurrentPlan: no v3 subscription plan", { orgId });
return {
isPaying: plan.v3Subscription.isPaying,
type: plan.v3Subscription.isPaying ? "paid" : "free",
};
}
// This is the normal case when the billing service is running
return {
isPaying: plan.v3Subscription.isPaying,
type: plan.v3Subscription.plan?.type ?? "free",
type: plan.v3Subscription.plan.type,
};
},
},