Skip to content

Commit dff0ddd

Browse files
committed
Don't return 500 if branch config override is invalid
1 parent 42304d3 commit dff0ddd

1 file changed

Lines changed: 16 additions & 14 deletions

File tree

apps/backend/src/lib/config.tsx

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
import { Prisma } from "@/generated/prisma/client";
22
import { Config, getInvalidConfigReason, normalize, override, removeKeysFromConfig } from "@stackframe/stack-shared/dist/config/format";
3-
import { BranchConfigOverride, BranchConfigOverrideOverride, BranchIncompleteConfig, BranchRenderedConfig, CompleteConfig, EnvironmentConfigOverride, EnvironmentConfigOverrideOverride, EnvironmentIncompleteConfig, EnvironmentRenderedConfig, OrganizationConfigOverride, OrganizationConfigOverrideOverride, OrganizationIncompleteConfig, ProjectConfigOverride, ProjectConfigOverrideOverride, ProjectIncompleteConfig, ProjectRenderedConfig, applyBranchDefaults, applyEnvironmentDefaults, applyOrganizationDefaults, applyProjectDefaults, assertNoConfigOverrideErrors, branchConfigSchema, environmentConfigSchema, getConfigOverrideErrors, getIncompleteConfigWarnings, migrateConfigOverride, organizationConfigSchema, projectConfigSchema, sanitizeBranchConfig, sanitizeEnvironmentConfig, sanitizeOrganizationConfig, sanitizeProjectConfig } from "@stackframe/stack-shared/dist/config/schema";
3+
import { BranchConfigOverride, BranchConfigOverrideOverride, BranchIncompleteConfig, BranchRenderedConfig, CompleteConfig, EnvironmentConfigOverride, EnvironmentConfigOverrideOverride, EnvironmentIncompleteConfig, EnvironmentRenderedConfig, OrganizationConfigOverride, OrganizationConfigOverrideOverride, OrganizationIncompleteConfig, ProjectConfigOverride, ProjectConfigOverrideOverride, ProjectIncompleteConfig, ProjectRenderedConfig, applyBranchDefaults, applyEnvironmentDefaults, applyOrganizationDefaults, applyProjectDefaults, branchConfigSchema, environmentConfigSchema, getConfigOverrideErrors, getIncompleteConfigWarnings, migrateConfigOverride, organizationConfigSchema, projectConfigSchema, sanitizeBranchConfig, sanitizeEnvironmentConfig, sanitizeOrganizationConfig, sanitizeProjectConfig } from "@stackframe/stack-shared/dist/config/schema";
44
import { ProjectsCrud } from "@stackframe/stack-shared/dist/interface/crud/projects";
55
import { branchConfigSourceSchema, yupBoolean, yupMixed, yupObject, yupRecord, yupString, yupUnion } from "@stackframe/stack-shared/dist/schema-fields";
66
import { isTruthy } from "@stackframe/stack-shared/dist/utils/booleans";
7-
import { getNodeEnvironment } from "@stackframe/stack-shared/dist/utils/env";
87
import { StackAssertionError, captureError } from "@stackframe/stack-shared/dist/utils/errors";
98
import { filterUndefined, typedEntries } from "@stackframe/stack-shared/dist/utils/objects";
109
import { Result } from "@stackframe/stack-shared/dist/utils/results";
@@ -221,7 +220,10 @@ export async function setProjectConfigOverride(options: {
221220
throw new StackAssertionError(`Project config override for ${options.projectId} is too large.`);
222221
}
223222

224-
await assertNoConfigOverrideErrors(projectConfigSchema, newConfig);
223+
const overrideErrors = await getConfigOverrideErrors(projectConfigSchema, newConfig);
224+
if (overrideErrors.status === "error") {
225+
captureError("setProjectConfigOverride", new StackAssertionError(`Config override is invalid — at a place where it should have already been validated! ${overrideErrors.error}`, { projectId: options.projectId }));
226+
}
225227
await globalPrismaClient.project.update({
226228
where: {
227229
id: options.projectId,
@@ -248,7 +250,10 @@ export async function setBranchConfigOverride(options: {
248250
throw new StackAssertionError(`Branch config override for ${options.projectId}/${options.branchId} is too large.`);
249251
}
250252

251-
await assertNoConfigOverrideErrors(branchConfigSchema, newConfig);
253+
const overrideErrors = await getConfigOverrideErrors(branchConfigSchema, newConfig);
254+
if (overrideErrors.status === "error") {
255+
captureError("setBranchConfigOverride", new StackAssertionError(`Config override is invalid — at a place where it should have already been validated! ${overrideErrors.error}`, { projectId: options.projectId, branchId: options.branchId }));
256+
}
252257
await globalPrismaClient.branchConfigOverride.upsert({
253258
where: {
254259
projectId_branchId: {
@@ -352,7 +357,10 @@ export async function setEnvironmentConfigOverride(options: {
352357
throw new StackAssertionError(`Environment config override for ${options.projectId}/${options.branchId} is too large.`);
353358
}
354359

355-
await assertNoConfigOverrideErrors(environmentConfigSchema, newConfig);
360+
const overrideErrors = await getConfigOverrideErrors(environmentConfigSchema, newConfig);
361+
if (overrideErrors.status === "error") {
362+
captureError("setEnvironmentConfigOverride", new StackAssertionError(`Config override is invalid — at a place where it should have already been validated! ${overrideErrors.error}`, { projectId: options.projectId, branchId: options.branchId }));
363+
}
356364
await globalPrismaClient.environmentConfigOverride.upsert({
357365
where: {
358366
projectId_branchId: {
@@ -586,15 +594,9 @@ function makeUnsanitizedIncompleteConfigQuery<T, O>(options: { previous?: RawQue
586594
async ([prevPromise, overPromise]) => {
587595
const prev = await prevPromise;
588596
const over = await overPromise;
589-
try {
590-
await assertNoConfigOverrideErrors(options.schema, over, { extraInfo: options.extraInfo });
591-
} catch (error) {
592-
if (getNodeEnvironment().includes("prod")) {
593-
// be a bit more resilient in prod... we don't necessarily have to crash here, but this means that something went awfully wrong so go into panic mode regardless
594-
captureError("config-override-validation-error", error);
595-
} else {
596-
throw error;
597-
}
597+
const overrideErrors = await getConfigOverrideErrors(options.schema, over);
598+
if (overrideErrors.status === "error") {
599+
captureError("config-override-validation-error", new StackAssertionError(`Config override is invalid — at a place where it should have already been validated! ${overrideErrors.error}`, { extraInfo: options.extraInfo }));
598600
}
599601
return override(prev, over);
600602
},

0 commit comments

Comments
 (0)