diff --git a/hosting/nginx.dev.conf b/hosting/nginx.dev.conf index e3d6d47287..f0a58a9a98 100644 --- a/hosting/nginx.dev.conf +++ b/hosting/nginx.dev.conf @@ -45,20 +45,6 @@ http { client_max_body_size 50000m; ignore_invalid_headers off; proxy_buffering off; - set $csp_default "default-src 'self'"; - set $csp_script "script-src 'self' 'unsafe-inline' 'unsafe-eval' https://*.budibase.net https://cdn.budi.live https://js.intercomcdn.com https://widget.intercom.io https://d2l5prqdbvm3op.cloudfront.net https://us-assets.i.posthog.com"; - set $csp_style "style-src 'self' 'unsafe-inline' https://cdn.jsdelivr.net https://fonts.googleapis.com https://rsms.me https://maxcdn.bootstrapcdn.com"; - set $csp_object "object-src 'none'"; - set $csp_base_uri "base-uri 'self'"; - set $csp_connect "connect-src 'self' https://*.budibase.app https://*.budibaseqa.app https://*.budibase.net https://api-iam.intercom.io https://api-iam.intercom.io https://api-ping.intercom.io https://app.posthog.com https://us.i.posthog.com wss://nexus-websocket-a.intercom.io wss://nexus-websocket-b.intercom.io https://nexus-websocket-a.intercom.io https://nexus-websocket-b.intercom.io https://uploads.intercomcdn.com https://uploads.intercomusercontent.com https://*.amazonaws.com https://*.s3.amazonaws.com https://*.s3.us-east-2.amazonaws.com https://*.s3.us-east-1.amazonaws.com https://*.s3.us-west-1.amazonaws.com https://*.s3.us-west-2.amazonaws.com https://*.s3.af-south-1.amazonaws.com https://*.s3.ap-east-1.amazonaws.com https://*.s3.ap-southeast-3.amazonaws.com https://*.s3.ap-south-1.amazonaws.com https://*.s3.ap-northeast-3.amazonaws.com https://*.s3.ap-northeast-2.amazonaws.com https://*.s3.ap-southeast-1.amazonaws.com https://*.s3.ap-southeast-2.amazonaws.com https://*.s3.ap-northeast-1.amazonaws.com https://*.s3.ca-central-1.amazonaws.com https://*.s3.cn-north-1.amazonaws.com https://*.s3.cn-northwest-1.amazonaws.com https://*.s3.eu-central-1.amazonaws.com https://*.s3.eu-west-1.amazonaws.com https://*.s3.eu-west-2.amazonaws.com https://*.s3.eu-south-1.amazonaws.com https://*.s3.eu-west-3.amazonaws.com https://*.s3.eu-north-1.amazonaws.com https://*.s3.sa-east-1.amazonaws.com https://*.s3.me-south-1.amazonaws.com https://*.s3.us-gov-east-1.amazonaws.com https://*.s3.us-gov-west-1.amazonaws.com https://api.github.com"; - set $csp_font "font-src 'self' data: https://cdn.jsdelivr.net https://fonts.gstatic.com https://rsms.me https://maxcdn.bootstrapcdn.com https://js.intercomcdn.com https://fonts.intercomcdn.com"; - set $csp_frame "frame-src 'self' https:"; - set $csp_img "img-src http: https: data: blob:"; - set $csp_manifest "manifest-src 'self'"; - set $csp_media "media-src 'self' https://js.intercomcdn.com https://cdn.budi.live"; - set $csp_worker "worker-src blob:"; - - add_header Content-Security-Policy "${csp_default}; ${csp_style}; ${csp_object}; ${csp_base_uri}; ${csp_connect}; ${csp_font}; ${csp_frame}; ${csp_img}; ${csp_manifest}; ${csp_media}; ${csp_worker};" always; error_page 502 503 504 /error.html; location = /error.html { diff --git a/packages/backend-core/src/features/features.ts b/packages/backend-core/src/features/features.ts index cd84cf7653..b3f016e88a 100644 --- a/packages/backend-core/src/features/features.ts +++ b/packages/backend-core/src/features/features.ts @@ -269,7 +269,6 @@ export class FlagSet, T extends { [key: string]: V }> { export const flags = new FlagSet({ [FeatureFlag.DEFAULT_VALUES]: Flag.boolean(true), [FeatureFlag.AUTOMATION_BRANCHING]: Flag.boolean(true), - [FeatureFlag.ENRICHED_RELATIONSHIPS]: Flag.boolean(true), [FeatureFlag.AI_CUSTOM_CONFIGS]: Flag.boolean(true), [FeatureFlag.BUDIBASE_AI]: Flag.boolean(true), }) diff --git a/packages/builder/src/components/backend/DataTable/buttons/grid/ColumnsSettingContent.svelte b/packages/builder/src/components/backend/DataTable/buttons/grid/ColumnsSettingContent.svelte index 85af8596a0..2cda43dda0 100644 --- a/packages/builder/src/components/backend/DataTable/buttons/grid/ColumnsSettingContent.svelte +++ b/packages/builder/src/components/backend/DataTable/buttons/grid/ColumnsSettingContent.svelte @@ -11,7 +11,6 @@ export let disabledPermissions = [] export let columns export let fromRelationshipField - export let canSetRelationshipSchemas const { datasource, dispatch } = getContext("grid") @@ -129,6 +128,8 @@ } }) + $: hasLinkColumns = columns.some(c => c.schema.type === FieldType.LINK) + async function toggleColumn(column, permission) { const visible = permission !== FieldPermissions.HIDDEN const readonly = permission === FieldPermissions.READONLY @@ -184,7 +185,7 @@ value={columnToPermissionOptions(column)} options={column.options} /> - {#if canSetRelationshipSchemas && column.schema.type === FieldType.LINK && columnToPermissionOptions(column) !== FieldPermissions.HIDDEN} + {#if column.schema.type === FieldType.LINK && columnToPermissionOptions(column) !== FieldPermissions.HIDDEN}
{ @@ -203,7 +204,7 @@
-{#if canSetRelationshipSchemas} +{#if hasLinkColumns} (relationshipFieldName = null)} open={relationshipFieldName} diff --git a/packages/builder/src/components/backend/DataTable/buttons/grid/GridColumnsSettingButton.svelte b/packages/builder/src/components/backend/DataTable/buttons/grid/GridColumnsSettingButton.svelte index 7ab84ba039..801abeaf9f 100644 --- a/packages/builder/src/components/backend/DataTable/buttons/grid/GridColumnsSettingButton.svelte +++ b/packages/builder/src/components/backend/DataTable/buttons/grid/GridColumnsSettingButton.svelte @@ -10,8 +10,6 @@ import { getContext } from "svelte" import { ActionButton } from "@budibase/bbui" import ColumnsSettingContent from "./ColumnsSettingContent.svelte" - import { isEnabled } from "helpers/featureFlags" - import { FeatureFlag } from "@budibase/types" import DetailPopover from "components/common/DetailPopover.svelte" const { tableColumns, datasource } = getContext("grid") @@ -46,9 +44,5 @@ {text} - + diff --git a/packages/server/src/api/routes/tests/row.spec.ts b/packages/server/src/api/routes/tests/row.spec.ts index d80559285b..7d65345584 100644 --- a/packages/server/src/api/routes/tests/row.spec.ts +++ b/packages/server/src/api/routes/tests/row.spec.ts @@ -1,3 +1,5 @@ +import * as setup from "./utilities" + import { DatabaseName, datasourceDescribe, @@ -6,13 +8,7 @@ import { import tk from "timekeeper" import emitter from "../../../../src/events" import { outputProcessing } from "../../../utilities/rowProcessor" -import { - context, - InternalTable, - tenancy, - features, - utils, -} from "@budibase/backend-core" +import { context, InternalTable, tenancy, utils } from "@budibase/backend-core" import { quotas } from "@budibase/pro" import { AIOperationEnum, @@ -44,7 +40,6 @@ import { Knex } from "knex" import { InternalTables } from "../../../db/utils" import { withEnv } from "../../../environment" import { JsTimeoutError } from "@budibase/string-templates" -import { structures } from "./utilities" jest.mock("@budibase/pro", () => ({ ...jest.requireActual("@budibase/pro"), @@ -87,9 +82,9 @@ async function waitForEvent( datasourceDescribe( { name: "/rows (%s)", exclude: [DatabaseName.MONGODB] }, ({ config, dsProvider, isInternal, isMSSQL, isOracle }) => { + let table: Table let datasource: Datasource | undefined let client: Knex | undefined - let table: Table beforeAll(async () => { const ds = await dsProvider() @@ -97,6 +92,10 @@ datasourceDescribe( client = ds.client }) + afterAll(async () => { + setup.afterAll() + }) + function saveTableRequest( // We omit the name field here because it's generated in the function with a // high likelihood to be unique. Tests should not have any reason to control @@ -2257,13 +2256,13 @@ datasourceDescribe( let expectedRowData: Row beforeAll(async () => { - const fullSchema = structures.fullSchemaWithoutLinks({ + const fullSchema = setup.structures.fullSchemaWithoutLinks({ allRequired: true, }) const table = await config.api.table.save( saveTableRequest({ - ...structures.basicTable(), + ...setup.structures.basicTable(), schema: fullSchema, primary: ["string"], }) @@ -2278,15 +2277,15 @@ datasourceDescribe( [FieldType.NUMBER]: generator.natural(), [FieldType.BOOLEAN]: generator.bool(), [FieldType.DATETIME]: generator.date().toISOString(), - [FieldType.ATTACHMENTS]: [structures.basicAttachment()], - [FieldType.ATTACHMENT_SINGLE]: structures.basicAttachment(), + [FieldType.ATTACHMENTS]: [setup.structures.basicAttachment()], + [FieldType.ATTACHMENT_SINGLE]: setup.structures.basicAttachment(), [FieldType.FORMULA]: undefined, // generated field [FieldType.AUTO]: undefined, // generated field [FieldType.AI]: "LLM Output", [FieldType.JSON]: { name: generator.guid() }, [FieldType.INTERNAL]: generator.guid(), [FieldType.BARCODEQR]: generator.guid(), - [FieldType.SIGNATURE_SINGLE]: structures.basicAttachment(), + [FieldType.SIGNATURE_SINGLE]: setup.structures.basicAttachment(), [FieldType.BIGINT]: generator.integer().toString(), [FieldType.BB_REFERENCE]: [{ _id: config.getUser()._id }], [FieldType.BB_REFERENCE_SINGLE]: { _id: config.getUser()._id }, @@ -2857,13 +2856,7 @@ datasourceDescribe( let auxData: Row[] = [] - let flagCleanup: (() => void) | undefined - beforeAll(async () => { - flagCleanup = features.testutils.setFeatureFlags("*", { - ENRICHED_RELATIONSHIPS: true, - }) - const aux2Table = await config.api.table.save(saveTableRequest()) const aux2Data = await config.api.row.save(aux2Table._id!, {}) @@ -3010,10 +3003,6 @@ datasourceDescribe( viewId = view.id }) - afterAll(() => { - flagCleanup?.() - }) - const testScenarios: [string, (row: Row) => Promise | Row][] = [ ["get row", (row: Row) => config.api.row.get(viewId, row._id!)], [ @@ -3086,68 +3075,6 @@ datasourceDescribe( } ) - it.each(testScenarios)( - "does not enrich relationships when not enabled (via %s)", - async (__, retrieveDelegate) => { - await features.testutils.withFeatureFlags( - "*", - { - ENRICHED_RELATIONSHIPS: false, - }, - async () => { - const otherRows = _.sampleSize(auxData, 5) - - const row = await config.api.row.save(viewId, { - title: generator.word(), - relWithNoSchema: [otherRows[0]], - relWithEmptySchema: [otherRows[1]], - relWithFullSchema: [otherRows[2]], - relWithHalfSchema: [otherRows[3]], - relWithIllegalSchema: [otherRows[4]], - }) - - const retrieved = await retrieveDelegate(row) - - expect(retrieved).toEqual( - expect.objectContaining({ - title: row.title, - relWithNoSchema: [ - { - _id: otherRows[0]._id, - primaryDisplay: otherRows[0].name, - }, - ], - relWithEmptySchema: [ - { - _id: otherRows[1]._id, - primaryDisplay: otherRows[1].name, - }, - ], - relWithFullSchema: [ - { - _id: otherRows[2]._id, - primaryDisplay: otherRows[2].name, - }, - ], - relWithHalfSchema: [ - { - _id: otherRows[3]._id, - primaryDisplay: otherRows[3].name, - }, - ], - relWithIllegalSchema: [ - { - _id: otherRows[4]._id, - primaryDisplay: otherRows[4].name, - }, - ], - }) - ) - } - ) - } - ) - it.each([ [ "from table fetch", @@ -3469,3 +3396,5 @@ datasourceDescribe( }) } ) + +// todo: remove me diff --git a/packages/server/src/api/routes/tests/viewV2.spec.ts b/packages/server/src/api/routes/tests/viewV2.spec.ts index 2349c2dc3e..63d315cea9 100644 --- a/packages/server/src/api/routes/tests/viewV2.spec.ts +++ b/packages/server/src/api/routes/tests/viewV2.spec.ts @@ -42,7 +42,7 @@ import { } from "../../../integrations/tests/utils" import merge from "lodash/merge" import { quotas } from "@budibase/pro" -import { db, roles, features, context } from "@budibase/backend-core" +import { db, roles, context } from "@budibase/backend-core" datasourceDescribe( { name: "/v2/views (%s)", exclude: [DatabaseName.MONGODB] }, @@ -3269,17 +3269,6 @@ datasourceDescribe( }) describe("foreign relationship columns", () => { - let envCleanup: () => void - beforeAll(() => { - envCleanup = features.testutils.setFeatureFlags("*", { - ENRICHED_RELATIONSHIPS: true, - }) - }) - - afterAll(() => { - envCleanup?.() - }) - const createMainTable = async ( links: { name: string diff --git a/packages/server/src/db/linkedRows/index.ts b/packages/server/src/db/linkedRows/index.ts index 73ac695878..06a4005061 100644 --- a/packages/server/src/db/linkedRows/index.ts +++ b/packages/server/src/db/linkedRows/index.ts @@ -14,11 +14,10 @@ import { coreOutputProcessing, processFormulas, } from "../../utilities/rowProcessor" -import { context, features } from "@budibase/backend-core" +import { context } from "@budibase/backend-core" import { ContextUser, EventType, - FeatureFlag, FieldType, LinkDocumentValue, Row, @@ -251,19 +250,13 @@ export async function squashLinks( source: Table | ViewV2, enriched: T ): Promise { - const allowRelationshipSchemas = await features.flags.isEnabled( - FeatureFlag.ENRICHED_RELATIONSHIPS - ) - let viewSchema: ViewV2Schema = {} if (sdk.views.isView(source)) { if (helpers.views.isCalculationView(source)) { return enriched } - if (allowRelationshipSchemas) { - viewSchema = source.schema || {} - } + viewSchema = source.schema || {} } let table: Table diff --git a/packages/types/src/sdk/featureFlag.ts b/packages/types/src/sdk/featureFlag.ts index 18dfd98319..64a7362e9f 100644 --- a/packages/types/src/sdk/featureFlag.ts +++ b/packages/types/src/sdk/featureFlag.ts @@ -4,7 +4,7 @@ export enum FeatureFlag { AUTOMATION_BRANCHING = "AUTOMATION_BRANCHING", AI_CUSTOM_CONFIGS = "AI_CUSTOM_CONFIGS", DEFAULT_VALUES = "DEFAULT_VALUES", - ENRICHED_RELATIONSHIPS = "ENRICHED_RELATIONSHIPS", + BUDIBASE_AI = "BUDIBASE_AI", }