bug: mergeOrgFeatureFlags drops all valid org feature flags when one stored flag is invalid

Offen
#5,058 1 Kommentar 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Maintainer antworten meist innerhalb von 1 Tag

Dieses Issue hat noch niemand übernommen.

  • #5059 von @shafiktanbir — ohne Merge geschlossen
  • #5070 von @MilindChatrabhuji — ohne Merge geschlossen
  • #5086 von @ghazy2001 — ohne Merge geschlossen

Bewertung

Schwierigkeit
3/5
Geschätzter Aufwand
1-2 Tage
Anfängerfreundlichkeit
39/100
Issue-Typ
Bug
Klarheit
Klar beschrieben
Aktivitätsstatus
Veraltet
Tech-Stack
nextjs, typescript
Bereich
backend, frontend

Rechercherichtung

Start in apps/webapp/app/v3/featureFlags.server.ts at mergeOrgFeatureFlags and inspect how stored organization flags are parsed; the reproduction shows a valid override being lost when another stored value is invalid. Then review FeatureFlagsDialog.tsx for unsetFlag and the derived grace-stamp rows. Done means valid overrides survive invalid stored values, unsetting clears related derived values, and derived rows stay read-only when unlocked; an open linked pull request indicates this work may already be underway.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Beschreibung

Provide environment information

System:
OS: Linux 6.8 Ubuntu
Binaries:
Node: 22.14.0
pnpm: 9.15.0

Describe the bug

In a7f0f90e ("show stored org values for locked flags in the admin flags dialog"), the v1 and v2 admin org feature-flag routes were updated to read stored flags key-by-key via parseStoredOrgFlags(organization.featureFlags).valid, and saves now intentionally keep untouched invalid values and unknown keys from newer releases in Organization.featureFlags.

However, mergeOrgFeatureFlags in apps/webapp/app/v3/featureFlags.server.ts (used by resolveOrganizationFeatureFlags) still validates the entire orgFeatureFlags object at once with validatePartialFeatureFlags(orgFeatureFlags):

export function mergeOrgFeatureFlags(
  globalFlags: Partial<FeatureFlagCatalog>,
  orgFeatureFlags: unknown
) {
  const parsed = orgFeatureFlags
    ? validatePartialFeatureFlags(orgFeatureFlags as Record<string, unknown>)
    : ({ success: false } as const);
  return { ...globalFlags, ...(parsed.success ? parsed.data : {}) };
}

If an org has one invalid stored flag value in Organization.featureFlags (which admin saves now keep), validatePartialFeatureFlags fails for the whole blob and mergeOrgFeatureFlags drops all of the org's valid overrides (hasWebhooksAccess, hasQueryAccess, hasLogsPageAccess, hasAiAccess, etc.), even though the admin flags dialog and /admin/api/v1/orgs/:orgId/feature-flags show them as active.

Two small related issues in FeatureFlagsDialog.tsx:

  • unsetFlag(key) only deletes next[key] without clearing derivedFlagsClearedWith(key), so unsetting runOpsMintKind leaves runOpsMintKindPrev and runOpsMintKindFlippedAt shown as set in the dialog list and JSON preview.
  • Checking "Unlock read-only flags" unlocks effect === "derived" grace-stamp rows (runOpsMintKindPrev, runOpsMintKindFlippedAt, runOpsMintShardSetPrev, runOpsMintShardSetFlippedAt) into editable controls, even though the server strips and recomputes them on save.
Reproduction repo

https://github.com/triggerdotdev/trigger.dev/blob/main/apps/webapp/app/v3/featureFlags.server.ts#L307-L314

To reproduce
  1. Call mergeOrgFeatureFlags({ hasLogsPageAccess: false }, { hasLogsPageAccess: true, realtimeBackend: "not-a-backend" }) (or save a valid flag via /admin/api/v2/orgs/:organizationId/feature-flags on an org that has an existing invalid flag).
  2. mergeOrgFeatureFlags returns { hasLogsPageAccess: false } instead of { hasLogsPageAccess: true } because validatePartialFeatureFlags fails on realtimeBackend.
Suggested fix

Use parseStoredOrgFlags(orgFeatureFlags).valid in mergeOrgFeatureFlags, and in FeatureFlagsDialog.tsx clear derivedFlagsClearedWith(key) in unsetFlag and keep effect === "derived" flags read-only when unlocked.

Additional information

No response

Image
Vorherrschende Sprache
TypeScript
Sterne
16.5k
Forks
1.5k
Ø Merge
1 T. 15 Std.
Gemergte PRs (30 T.)
17

Entwicklungsumgebung

Dieses Projekt bietet weder Dev-Container noch Dockerfile noch Beitragsleitfaden – die Einrichtung liegt bei Ihnen. Beginnen Sie mit der README; die allgemeinen Schritte stehen in unserem Leitfaden für den ersten Beitrag.

Erste Schritte

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus triggerdotdev/trigger.dev

Alle Issues in triggerdotdev/trigger.dev

Ähnliche Issues

Weitere Issues zu TypeScript

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.