diff --git a/packages/backend-core/src/db/couch/DatabaseImpl.ts b/packages/backend-core/src/db/couch/DatabaseImpl.ts index 8ca20bf8e1..b807db0ee3 100644 --- a/packages/backend-core/src/db/couch/DatabaseImpl.ts +++ b/packages/backend-core/src/db/couch/DatabaseImpl.ts @@ -10,6 +10,7 @@ import { DatabaseQueryOpts, DBError, Document, + FeatureFlag, isDocument, RowResponse, RowValue, @@ -456,7 +457,7 @@ export class DatabaseImpl implements Database { async destroy() { if ( - (await flags.isEnabled("SQS")) && + (await flags.isEnabled(FeatureFlag.SQS)) && (await this.exists(SQLITE_DESIGN_DOC_ID)) ) { // delete the design document, then run the cleanup operation diff --git a/packages/backend-core/src/features/features.ts b/packages/backend-core/src/features/features.ts index e95472a784..e2f8d9b6a1 100644 --- a/packages/backend-core/src/features/features.ts +++ b/packages/backend-core/src/features/features.ts @@ -267,12 +267,13 @@ export class FlagSet, T extends { [key: string]: V }> { // All of the machinery in this file is to make sure that flags have their // default values set correctly and their types flow through the system. export const flags = new FlagSet({ - DEFAULT_VALUES: Flag.boolean(env.isDev()), - AUTOMATION_BRANCHING: Flag.boolean(env.isDev()), - SQS: Flag.boolean(true), + [FeatureFlag.DEFAULT_VALUES]: Flag.boolean(env.isDev()), + [FeatureFlag.AUTOMATION_BRANCHING]: Flag.boolean(env.isDev()), + [FeatureFlag.SQS]: Flag.boolean(true), [FeatureFlag.AI_CUSTOM_CONFIGS]: Flag.boolean(env.isDev()), [FeatureFlag.ENRICHED_RELATIONSHIPS]: Flag.boolean(env.isDev()), [FeatureFlag.TABLES_DEFAULT_ADMIN]: Flag.boolean(env.isDev()), + [FeatureFlag.BUDIBASE_AI]: Flag.boolean(env.isDev()), }) type UnwrapPromise = T extends Promise ? U : T diff --git a/packages/server/src/api/controllers/table/utils.ts b/packages/server/src/api/controllers/table/utils.ts index 106d0e23a6..96c01a15b8 100644 --- a/packages/server/src/api/controllers/table/utils.ts +++ b/packages/server/src/api/controllers/table/utils.ts @@ -1,34 +1,35 @@ -import { parse, isSchema, isRows } from "../../../utilities/schema" -import { getRowParams, generateRowID, InternalTables } from "../../../db/utils" +import { isRows, isSchema, parse } from "../../../utilities/schema" +import { generateRowID, getRowParams, InternalTables } from "../../../db/utils" import isEqual from "lodash/isEqual" import { - GOOGLE_SHEETS_PRIMARY_KEY, - USERS_TABLE_SCHEMA, - SwitchableTypes, CanSwitchTypes, + GOOGLE_SHEETS_PRIMARY_KEY, + SwitchableTypes, + USERS_TABLE_SCHEMA, } from "../../../constants" import { - inputProcessing, AttachmentCleanup, + inputProcessing, } from "../../../utilities/rowProcessor" import { getViews, saveView } from "../view/utils" import viewTemplate from "../view/viewBuilder" import { cloneDeep } from "lodash/fp" import { quotas } from "@budibase/pro" -import { events, context, features } from "@budibase/backend-core" +import { context, events, features } from "@budibase/backend-core" import { AutoFieldSubType, + Database, Datasource, + FeatureFlag, + FieldSchema, + FieldType, + NumberFieldMetadata, + RelationshipFieldMetadata, + RenameColumn, Row, SourceName, Table, - Database, - RenameColumn, - NumberFieldMetadata, - FieldSchema, View, - RelationshipFieldMetadata, - FieldType, } from "@budibase/types" import sdk from "../../../sdk" import env from "../../../environment" @@ -329,7 +330,7 @@ class TableSaveFunctions { importRows: this.importRows, userId: this.userId, }) - if (await features.flags.isEnabled("SQS")) { + if (await features.flags.isEnabled(FeatureFlag.SQS)) { await sdk.tables.sqs.addTable(table) } return table @@ -523,7 +524,7 @@ export async function internalTableCleanup(table: Table, rows?: Row[]) { if (rows) { await AttachmentCleanup.tableDelete(table, rows) } - if (await features.flags.isEnabled("SQS")) { + if (await features.flags.isEnabled(FeatureFlag.SQS)) { await sdk.tables.sqs.removeTable(table) } } diff --git a/packages/server/src/automations/actions.ts b/packages/server/src/automations/actions.ts index f78174aa7a..e921e569c9 100644 --- a/packages/server/src/automations/actions.ts +++ b/packages/server/src/automations/actions.ts @@ -26,6 +26,7 @@ import { Hosting, ActionImplementation, AutomationStepDefinition, + FeatureFlag, } from "@budibase/types" import sdk from "../sdk" import { getAutomationPlugin } from "../utilities/fileSystem" @@ -100,7 +101,7 @@ if (env.SELF_HOSTED) { } export async function getActionDefinitions() { - if (await features.flags.isEnabled("AUTOMATION_BRANCHING")) { + if (await features.flags.isEnabled(FeatureFlag.AUTOMATION_BRANCHING)) { BUILTIN_ACTION_DEFINITIONS["BRANCH"] = branch.definition } const actionDefinitions = BUILTIN_ACTION_DEFINITIONS diff --git a/packages/server/src/sdk/app/rows/search.ts b/packages/server/src/sdk/app/rows/search.ts index ee16058416..567e7d5cc8 100644 --- a/packages/server/src/sdk/app/rows/search.ts +++ b/packages/server/src/sdk/app/rows/search.ts @@ -1,5 +1,6 @@ import { EmptyFilterOption, + FeatureFlag, LegacyFilter, LogicalOperator, Row, @@ -103,7 +104,7 @@ export async function search( } viewQuery = checkFilters(table, viewQuery) - const sqsEnabled = await features.flags.isEnabled("SQS") + const sqsEnabled = await features.flags.isEnabled(FeatureFlag.SQS) const supportsLogicalOperators = isExternalTableID(view.tableId) || sqsEnabled @@ -169,7 +170,7 @@ export async function search( if (isExternalTable) { span?.addTags({ searchType: "external" }) result = await external.search(options, source) - } else if (await features.flags.isEnabled("SQS")) { + } else if (await features.flags.isEnabled(FeatureFlag.SQS)) { span?.addTags({ searchType: "sqs" }) result = await internal.sqs.search(options, source) } else { diff --git a/packages/server/src/sdk/app/tables/getters.ts b/packages/server/src/sdk/app/tables/getters.ts index fa87d3cfad..270ae7fee0 100644 --- a/packages/server/src/sdk/app/tables/getters.ts +++ b/packages/server/src/sdk/app/tables/getters.ts @@ -14,6 +14,7 @@ import { TableViewsResponse, View, ViewV2, + FeatureFlag, } from "@budibase/types" import datasources from "../datasources" import sdk from "../../../sdk" @@ -59,7 +60,7 @@ export async function processTable(table: Table): Promise { sourceId: table.sourceId || INTERNAL_TABLE_SOURCE_ID, sourceType: TableSourceType.INTERNAL, } - const sqsEnabled = await features.flags.isEnabled("SQS") + const sqsEnabled = await features.flags.isEnabled(FeatureFlag.SQS) if (sqsEnabled) { processed.sql = true } diff --git a/packages/server/src/utilities/rowProcessor/index.ts b/packages/server/src/utilities/rowProcessor/index.ts index dd17bc9ba6..6872924f58 100644 --- a/packages/server/src/utilities/rowProcessor/index.ts +++ b/packages/server/src/utilities/rowProcessor/index.ts @@ -19,6 +19,7 @@ import { Table, User, ViewV2, + FeatureFlag, } from "@budibase/types" import { cloneDeep } from "lodash/fp" import { @@ -417,7 +418,7 @@ export async function coreOutputProcessing( // remove null properties to match internal API const isExternal = isExternalTableID(table._id!) - if (isExternal || (await features.flags.isEnabled("SQS"))) { + if (isExternal || (await features.flags.isEnabled(FeatureFlag.SQS))) { for (const row of rows) { for (const key of Object.keys(row)) { if (row[key] === null) { diff --git a/packages/types/src/sdk/featureFlag.ts b/packages/types/src/sdk/featureFlag.ts index e35929efe9..99ee0f9996 100644 --- a/packages/types/src/sdk/featureFlag.ts +++ b/packages/types/src/sdk/featureFlag.ts @@ -1,9 +1,13 @@ export enum FeatureFlag { PER_CREATOR_PER_USER_PRICE = "PER_CREATOR_PER_USER_PRICE", PER_CREATOR_PER_USER_PRICE_ALERT = "PER_CREATOR_PER_USER_PRICE_ALERT", + AUTOMATION_BRANCHING = "AUTOMATION_BRANCHING", + SQS = "SQS", AI_CUSTOM_CONFIGS = "AI_CUSTOM_CONFIGS", + DEFAULT_VALUES = "DEFAULT_VALUES", ENRICHED_RELATIONSHIPS = "ENRICHED_RELATIONSHIPS", TABLES_DEFAULT_ADMIN = "TABLES_DEFAULT_ADMIN", + BUDIBASE_AI = "BUDIBASE_AI", } export interface TenantFeatureFlags { diff --git a/packages/worker/src/api/controllers/system/environment.ts b/packages/worker/src/api/controllers/system/environment.ts index 90f303d3a8..b6352ea5e7 100644 --- a/packages/worker/src/api/controllers/system/environment.ts +++ b/packages/worker/src/api/controllers/system/environment.ts @@ -1,4 +1,4 @@ -import { Ctx, MaintenanceType } from "@budibase/types" +import { Ctx, MaintenanceType, FeatureFlag } from "@budibase/types" import env from "../../../environment" import { env as coreEnv, db as dbCore, features } from "@budibase/backend-core" import nodeFetch from "node-fetch" @@ -29,7 +29,10 @@ async function isSqsAvailable() { } async function isSqsMissing() { - return (await features.flags.isEnabled("SQS")) && !(await isSqsAvailable()) + return ( + (await features.flags.isEnabled(FeatureFlag.SQS)) && + !(await isSqsAvailable()) + ) } export const fetch = async (ctx: Ctx) => {