mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-08-12 10:12:11 +03:00
* fix(api): make model catalog refresh response-safe * fix(api): invalidate model catalog mutation paths * fix(db): preserve aliases backup import after catalog rebase --------- Co-authored-by: Erick Kinnee <erick@ekinnee.dev>
104 lines
3.1 KiB
TypeScript
104 lines
3.1 KiB
TypeScript
/**
|
|
* db/featureFlags.ts — Feature flag DB overrides.
|
|
*
|
|
* Stores per-flag override values in the key_value table under the
|
|
* "feature_flags" namespace. When an override is present it takes precedence
|
|
* over the process environment variable of the same name.
|
|
*/
|
|
|
|
import { FEATURE_FLAG_DEFINITIONS } from "@/shared/constants/featureFlagDefinitions";
|
|
import { getDbInstance } from "./core";
|
|
import { finishModelCatalogWriteWithoutBackup } from "./models/modelCatalogWriteSignals";
|
|
|
|
const NAMESPACE = "feature_flags";
|
|
|
|
const CATALOG_RELEVANT_FEATURE_FLAGS = new Set([
|
|
"MODEL_CATALOG_INCLUDE_NAMES",
|
|
"MODELS_CATALOG_PREFIX_MODE",
|
|
"EXPOSE_CC_DISCOVERY_ALIASES",
|
|
]);
|
|
|
|
/**
|
|
* Returns all feature flag overrides as a key→value map.
|
|
*/
|
|
export function getFeatureFlagOverrides(): Record<string, string> {
|
|
const db = getDbInstance();
|
|
const rows = db
|
|
.prepare("SELECT key, value FROM key_value WHERE namespace = ?")
|
|
.all(NAMESPACE) as Array<{ key: string; value: string }>;
|
|
|
|
const result: Record<string, string> = {};
|
|
for (const row of rows) {
|
|
result[row.key] = row.value;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Returns the override value for a single flag, or undefined if no override
|
|
* is stored.
|
|
*/
|
|
export function getFeatureFlagOverride(key: string): string | undefined {
|
|
const db = getDbInstance();
|
|
const row = db
|
|
.prepare("SELECT value FROM key_value WHERE namespace = ? AND key = ?")
|
|
.get(NAMESPACE, key) as { value: string } | undefined;
|
|
return row?.value;
|
|
}
|
|
|
|
/**
|
|
* Persists (or replaces) an override for a single flag.
|
|
*/
|
|
export function setFeatureFlagOverride(key: string, value: string): void {
|
|
const definition = FEATURE_FLAG_DEFINITIONS.find((d) => d.key === key);
|
|
if (!definition) {
|
|
throw new Error(`Unknown feature flag key: ${key}`);
|
|
}
|
|
if (
|
|
definition.type === "enum" &&
|
|
definition.enumValues &&
|
|
!definition.enumValues.includes(value)
|
|
) {
|
|
throw new Error(
|
|
`Invalid value "${value}" for enum flag ${key}. Allowed: ${definition.enumValues.join(", ")}`,
|
|
);
|
|
}
|
|
const db = getDbInstance();
|
|
db.prepare("INSERT OR REPLACE INTO key_value (namespace, key, value) VALUES (?, ?, ?)").run(
|
|
NAMESPACE,
|
|
key,
|
|
value,
|
|
);
|
|
if (CATALOG_RELEVANT_FEATURE_FLAGS.has(key)) {
|
|
finishModelCatalogWriteWithoutBackup();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Removes the override for a single flag, restoring env-var / default
|
|
* behaviour.
|
|
*/
|
|
export function removeFeatureFlagOverride(key: string): void {
|
|
const db = getDbInstance();
|
|
db.prepare("DELETE FROM key_value WHERE namespace = ? AND key = ?").run(NAMESPACE, key);
|
|
if (CATALOG_RELEVANT_FEATURE_FLAGS.has(key)) {
|
|
finishModelCatalogWriteWithoutBackup();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Removes all stored feature flag overrides.
|
|
*/
|
|
export function clearAllFeatureFlagOverrides(): void {
|
|
const db = getDbInstance();
|
|
const hadRelevantOverride = Boolean(
|
|
db
|
|
.prepare("SELECT 1 FROM key_value WHERE namespace = ? AND key IN (?, ?, ?) LIMIT 1")
|
|
.get(NAMESPACE, ...Array.from(CATALOG_RELEVANT_FEATURE_FLAGS)),
|
|
);
|
|
db.prepare("DELETE FROM key_value WHERE namespace = ?").run(NAMESPACE);
|
|
if (hadRelevantOverride) {
|
|
finishModelCatalogWriteWithoutBackup();
|
|
}
|
|
}
|