From a7265fa3b474c853f35bb801c51ba592efb3fa9a Mon Sep 17 00:00:00 2001 From: Charles Bochet Date: Tue, 23 Jan 2024 09:59:00 +0100 Subject: [PATCH] Remove flag relation select (#3588) * Remove feature flag on relation and select * Move packages back to twenty-server to enable smaller build without using nx * Fix package.json --- nx.json | 11 +-- .../prod/twenty-server/Dockerfile | 6 +- .../components/RecordShowPage.tsx | 76 ++++++++----------- .../modules/workspace/types/FeatureFlagKey.ts | 5 +- .../SettingsObjectNewFieldStep2.tsx | 16 ---- .../src/testing/mock-data/users.ts | 10 +-- packages/twenty-server/package.json | 68 ++++++++++++++++- .../core/feature-flag/feature-flag.entity.ts | 2 - .../typeorm-seeds/core/demo/feature-flags.ts | 15 ---- .../typeorm-seeds/core/feature-flags.ts | 15 ---- packages/twenty-server/test/utils/reset-db.ts | 17 ----- .../twenty-server/test/utils/setup-tests.ts | 2 - yarn.lock | 64 ++++++++++++++++ 13 files changed, 172 insertions(+), 135 deletions(-) delete mode 100644 packages/twenty-server/test/utils/reset-db.ts diff --git a/nx.json b/nx.json index b6395f9a88..1347363db7 100644 --- a/nx.json +++ b/nx.json @@ -2,9 +2,7 @@ "targetDefaults": { "build": { "cache": true, - "dependsOn": [ - "^build" - ] + "dependsOn": ["^build"] }, "lint": { "cache": true @@ -17,11 +15,7 @@ }, "@nx/jest:jest": { "cache": true, - "inputs": [ - "default", - "^default", - "{workspaceRoot}/jest.preset.js" - ], + "inputs": ["default", "^default", "{workspaceRoot}/jest.preset.js"], "options": { "passWithNoTests": true }, @@ -40,4 +34,3 @@ "defaultBase": "main" } } - diff --git a/packages/twenty-docker/prod/twenty-server/Dockerfile b/packages/twenty-docker/prod/twenty-server/Dockerfile index c4390878d9..d7b0efd7b4 100644 --- a/packages/twenty-docker/prod/twenty-server/Dockerfile +++ b/packages/twenty-docker/prod/twenty-server/Dockerfile @@ -8,9 +8,11 @@ COPY ./.yarnrc.yml . COPY ./.yarn/releases /app/.yarn/releases COPY ./tools/eslint-rules /app/tools/eslint-rules COPY ./packages/twenty-server /app/packages/twenty-server -RUN yarn -RUN yarn nx build twenty-server +WORKDIR /app/packages/twenty-server +RUN yarn workspaces focus + +RUN yarn build WORKDIR /app/packages/twenty-server diff --git a/packages/twenty-front/src/modules/object-record/components/RecordShowPage.tsx b/packages/twenty-front/src/modules/object-record/components/RecordShowPage.tsx index 688bf399ff..c4f8150269 100644 --- a/packages/twenty-front/src/modules/object-record/components/RecordShowPage.tsx +++ b/packages/twenty-front/src/modules/object-record/components/RecordShowPage.tsx @@ -6,7 +6,6 @@ import { useFavorites } from '@/favorites/hooks/useFavorites'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem'; import { formatFieldMetadataItemAsColumnDefinition } from '@/object-metadata/utils/formatFieldMetadataItemAsColumnDefinition'; import { isObjectMetadataAvailableForRelation } from '@/object-metadata/utils/isObjectMetadataAvailableForRelation'; -import { parseFieldRelationType } from '@/object-metadata/utils/parseFieldRelationType'; import { parseFieldType } from '@/object-metadata/utils/parseFieldType'; import { FieldContext, @@ -33,7 +32,6 @@ import { ShowPageSummaryCard } from '@/ui/layout/show-page/components/ShowPageSu import { ShowPageRecoilScopeContext } from '@/ui/layout/states/ShowPageRecoilScopeContext'; import { PageTitle } from '@/ui/utilities/page-title/PageTitle'; import { RecoilScope } from '@/ui/utilities/recoil-scope/components/RecoilScope'; -import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled'; import { FieldMetadataType, FileFolder, @@ -145,10 +143,6 @@ export const RecordShowPage = () => { }); }; - const isRelationFieldCardEnabled = useIsFeatureEnabled( - 'IS_RELATION_FIELD_CARD_ENABLED', - ); - const availableFieldMetadataItems = objectMetadataItem.fields .filter( (fieldMetadataItem) => @@ -161,9 +155,7 @@ export const RecordShowPage = () => { const inlineFieldMetadataItems = availableFieldMetadataItems.filter( (fieldMetadataItem) => - fieldMetadataItem.type !== FieldMetadataType.Relation || - (!isRelationFieldCardEnabled && - parseFieldRelationType(fieldMetadataItem) === 'TO_ONE_OBJECT'), + fieldMetadataItem.type !== FieldMetadataType.Relation, ); const relationFieldMetadataItems = availableFieldMetadataItems.filter( @@ -280,42 +272,40 @@ export const RecordShowPage = () => { ), )} - {isRelationFieldCardEnabled && - relationFieldMetadataItems - .filter((item) => { - const relationObjectMetadataItem = - item.toRelationMetadata - ? item.toRelationMetadata.fromObjectMetadata - : item.fromRelationMetadata?.toObjectMetadata; + {relationFieldMetadataItems + .filter((item) => { + const relationObjectMetadataItem = item.toRelationMetadata + ? item.toRelationMetadata.fromObjectMetadata + : item.fromRelationMetadata?.toObjectMetadata; - if (!relationObjectMetadataItem) { - return false; - } + if (!relationObjectMetadataItem) { + return false; + } - return isObjectMetadataAvailableForRelation( - relationObjectMetadataItem, - ); - }) - .map((fieldMetadataItem, index) => ( - - - - ))} + return isObjectMetadataAvailableForRelation( + relationObjectMetadataItem, + ); + }) + .map((fieldMetadataItem, index) => ( + + + + ))} )} diff --git a/packages/twenty-front/src/modules/workspace/types/FeatureFlagKey.ts b/packages/twenty-front/src/modules/workspace/types/FeatureFlagKey.ts index ada8400ee1..194df33de5 100644 --- a/packages/twenty-front/src/modules/workspace/types/FeatureFlagKey.ts +++ b/packages/twenty-front/src/modules/workspace/types/FeatureFlagKey.ts @@ -1,7 +1,4 @@ export type FeatureFlagKey = | 'IS_MESSAGING_ENABLED' | 'IS_QUICK_ACTIONS_ENABLED' - | 'IS_RATING_FIELD_TYPE_ENABLED' - | 'IS_RELATION_FIELD_CARD_ENABLED' - | 'IS_RELATION_FIELD_TYPE_ENABLED' - | 'IS_SELECT_FIELD_TYPE_ENABLED'; + | 'IS_RATING_FIELD_TYPE_ENABLED'; diff --git a/packages/twenty-front/src/pages/settings/data-model/SettingsObjectNewField/SettingsObjectNewFieldStep2.tsx b/packages/twenty-front/src/pages/settings/data-model/SettingsObjectNewField/SettingsObjectNewFieldStep2.tsx index ac787e795e..7c87f1f955 100644 --- a/packages/twenty-front/src/pages/settings/data-model/SettingsObjectNewField/SettingsObjectNewFieldStep2.tsx +++ b/packages/twenty-front/src/pages/settings/data-model/SettingsObjectNewField/SettingsObjectNewFieldStep2.tsx @@ -40,14 +40,6 @@ export const SettingsObjectNewFieldStep2 = () => { findActiveObjectMetadataItemBySlug(objectSlug); const { createMetadataField } = useFieldMetadataItem(); - const isRelationFieldTypeEnabled = useIsFeatureEnabled( - 'IS_RELATION_FIELD_TYPE_ENABLED', - ); - - const isSelectFieldTypeEnabled = useIsFeatureEnabled( - 'IS_SELECT_FIELD_TYPE_ENABLED', - ); - const isRatingFieldTypeEnabled = useIsFeatureEnabled( 'IS_RATING_FIELD_TYPE_ENABLED', ); @@ -272,14 +264,6 @@ export const SettingsObjectNewFieldStep2 = () => { FieldMetadataType.Uuid, ]; - if (!isRelationFieldTypeEnabled) { - excludedFieldTypes.push(FieldMetadataType.Relation); - } - - if (!isSelectFieldTypeEnabled) { - excludedFieldTypes.push(FieldMetadataType.Select); - } - if (!isRatingFieldTypeEnabled) { excludedFieldTypes.push(FieldMetadataType.Rating); } diff --git a/packages/twenty-front/src/testing/mock-data/users.ts b/packages/twenty-front/src/testing/mock-data/users.ts index 677ed0dc29..42833e29df 100644 --- a/packages/twenty-front/src/testing/mock-data/users.ts +++ b/packages/twenty-front/src/testing/mock-data/users.ts @@ -29,15 +29,7 @@ export const mockDefaultWorkspace: Workspace = { logo: workspaceLogoUrl, allowImpersonation: true, subscriptionStatus: 'active', - featureFlags: [ - { - id: '0eada9a3-ccf4-4fcc-b25c-0c5d746e0fac', - key: 'IS_RELATION_FIELD_TYPE_ENABLED', - value: true, - workspaceId: '7dfbc3f7-6e5e-4128-957e-8d86808cdf6b', - __typename: 'FeatureFlag', - }, - ], + featureFlags: [], createdAt: '2023-04-26T10:23:42.33625+00:00', updatedAt: '2023-04-26T10:23:42.33625+00:00', }; diff --git a/packages/twenty-server/package.json b/packages/twenty-server/package.json index fb9ec7eacf..ea2f146806 100644 --- a/packages/twenty-server/package.json +++ b/packages/twenty-server/package.json @@ -34,11 +34,77 @@ "queue:work": "node dist/src/queue-worker" }, "dependencies": { + "@aws-sdk/client-s3": "^3.363.0", + "@aws-sdk/credential-providers": "^3.363.0", "@graphql-yoga/nestjs": "patch:@graphql-yoga/nestjs@2.1.0#./patches/@graphql-yoga+nestjs+2.1.0.patch", + "@nestjs/apollo": "^11.0.5", + "@nestjs/axios": "^3.0.1", + "@nestjs/cli": "^9.0.0", + "@nestjs/common": "^9.0.0", + "@nestjs/config": "^2.3.2", + "@nestjs/core": "^9.0.0", "@nestjs/graphql": "patch:@nestjs/graphql@12.0.8#./patches/@nestjs+graphql+12.0.8.patch", + "@nestjs/jwt": "^10.0.3", + "@nestjs/passport": "^9.0.3", + "@nestjs/platform-express": "^9.0.0", + "@nestjs/schematics": "^9.0.0", + "@nestjs/serve-static": "^3.0.0", + "@nestjs/terminus": "^9.2.2", + "@nestjs/testing": "^9.0.0", + "@nestjs/typeorm": "^10.0.0", + "@ptc-org/nestjs-query-core": "^4.2.0", "@ptc-org/nestjs-query-graphql": "patch:@ptc-org/nestjs-query-graphql@4.2.0#./patches/@ptc-org+nestjs-query-graphql+4.2.0.patch", + "@ptc-org/nestjs-query-typeorm": "4.2.1-alpha.2", + "@react-email/components": "0.0.12", + "@react-email/render": "0.0.10", + "@sentry/node": "^7.66.0", + "@sentry/profiling-node": "^1.3.4", + "axios": "^1.6.2", + "bcrypt": "^5.1.1", + "bullmq": "^4.14.0", + "class-transformer": "^0.5.1", "class-validator": "patch:class-validator@^0.14.0#./patches/class-validator+0.14.0.patch", - "twenty-emails": "workspace:*" + "date-fns": "^2.30.0", + "file-type": "16.5.4", + "googleapis": "105", + "graphql": "^16.8.1", + "graphql-fields": "^2.0.3", + "graphql-subscriptions": "2.0.0", + "graphql-tag": "^2.12.6", + "graphql-type-json": "^0.3.2", + "graphql-upload": "^13.0.0", + "graphql-yoga": "^4.0.4", + "lodash.camelcase": "^4.3.0", + "lodash.isempty": "^4.4.0", + "lodash.isobject": "^3.0.2", + "lodash.kebabcase": "^4.1.1", + "lodash.snakecase": "^4.1.1", + "lodash.upperfirst": "^4.3.1", + "mailparser": "^3.6.5", + "microdiff": "^1.3.2", + "nest-commander": "^3.12.0", + "nodemailer": "^6.9.8", + "openapi-types": "^12.1.3", + "passport": "^0.6.0", + "passport-google-oauth20": "^2.0.0", + "passport-jwt": "^4.0.1", + "passport-local": "^1.0.0", + "pg": "^8.11.3", + "pg-boss": "^9.0.3", + "react": "^18.2.0", + "rimraf": "^3.0.2", + "sharp": "^0.32.1", + "twenty-emails": "workspace:*", + "type-fest": "^4.1.0", + "typeorm": "^0.3.17" + }, + "devDependencies": { + "@types/lodash.isempty": "^4.4.7", + "@types/lodash.isobject": "^3.0.7", + "@types/lodash.snakecase": "^4.1.7", + "@types/lodash.upperfirst": "^4.3.7", + "@types/react": "^18.2.39", + "jest": "29.7.0" }, "engines": { "node": "^18.17.1", diff --git a/packages/twenty-server/src/core/feature-flag/feature-flag.entity.ts b/packages/twenty-server/src/core/feature-flag/feature-flag.entity.ts index f442c1d722..b77ee15162 100644 --- a/packages/twenty-server/src/core/feature-flag/feature-flag.entity.ts +++ b/packages/twenty-server/src/core/feature-flag/feature-flag.entity.ts @@ -14,9 +14,7 @@ import { IDField } from '@ptc-org/nestjs-query-graphql'; import { Workspace } from 'src/core/workspace/workspace.entity'; export enum FeatureFlagKeys { - IsRelationFieldTypeEnabled = 'IS_RELATION_FIELD_TYPE_ENABLED', IsMessagingEnabled = 'IS_MESSAGING_ENABLED', - IsSelectFieldTypeEnabled = 'IS_SELECT_FIELD_TYPE_ENABLED', IsRatingFieldTypeEnabled = 'IS_RATING_FIELD_TYPE_ENABLED', IsWorkspaceCleanable = 'IS_WORKSPACE_CLEANABLE', } diff --git a/packages/twenty-server/src/database/typeorm-seeds/core/demo/feature-flags.ts b/packages/twenty-server/src/database/typeorm-seeds/core/demo/feature-flags.ts index b9f51f5b49..26cda44195 100644 --- a/packages/twenty-server/src/database/typeorm-seeds/core/demo/feature-flags.ts +++ b/packages/twenty-server/src/database/typeorm-seeds/core/demo/feature-flags.ts @@ -15,26 +15,11 @@ export const seedFeatureFlags = async ( .into(`${schemaName}.${tableName}`, ['key', 'workspaceId', 'value']) .orIgnore() .values([ - { - key: FeatureFlagKeys.IsRelationFieldTypeEnabled, - workspaceId: workspaceId, - value: true, - }, - { - key: FeatureFlagKeys.IsSelectFieldTypeEnabled, - workspaceId: workspaceId, - value: true, - }, { key: FeatureFlagKeys.IsRatingFieldTypeEnabled, workspaceId: workspaceId, value: false, }, - { - key: 'IS_RELATION_FIELD_CARD_ENABLED', - workspaceId: workspaceId, - value: false, - }, ]) .execute(); }; diff --git a/packages/twenty-server/src/database/typeorm-seeds/core/feature-flags.ts b/packages/twenty-server/src/database/typeorm-seeds/core/feature-flags.ts index b3e3bc3ba6..c496562a67 100644 --- a/packages/twenty-server/src/database/typeorm-seeds/core/feature-flags.ts +++ b/packages/twenty-server/src/database/typeorm-seeds/core/feature-flags.ts @@ -15,21 +15,11 @@ export const seedFeatureFlags = async ( .into(`${schemaName}.${tableName}`, ['key', 'workspaceId', 'value']) .orIgnore() .values([ - { - key: FeatureFlagKeys.IsRelationFieldTypeEnabled, - workspaceId: workspaceId, - value: true, - }, { key: FeatureFlagKeys.IsMessagingEnabled, workspaceId: workspaceId, value: true, }, - { - key: FeatureFlagKeys.IsSelectFieldTypeEnabled, - workspaceId: workspaceId, - value: true, - }, { key: FeatureFlagKeys.IsRatingFieldTypeEnabled, workspaceId: workspaceId, @@ -40,11 +30,6 @@ export const seedFeatureFlags = async ( workspaceId: workspaceId, value: true, }, - { - key: 'IS_RELATION_FIELD_CARD_ENABLED', - workspaceId: workspaceId, - value: true, - }, ]) .execute(); }; diff --git a/packages/twenty-server/test/utils/reset-db.ts b/packages/twenty-server/test/utils/reset-db.ts deleted file mode 100644 index f39b118ce4..0000000000 --- a/packages/twenty-server/test/utils/reset-db.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { PrismaClient, Prisma } from '@prisma/client'; - -import { camelCase } from 'src/utils/camel-case'; - -const prisma = new PrismaClient(); - -export default async () => { - const models = Prisma.dmmf.datamodel.models; - const modelNames = models.map((model) => model.name); - const entities = modelNames.map((modelName) => camelCase(modelName)); - - await prisma.$transaction( - entities.map((entity) => { - return prisma[entity].deleteMany(); - }), - ); -}; diff --git a/packages/twenty-server/test/utils/setup-tests.ts b/packages/twenty-server/test/utils/setup-tests.ts index bfd4116a6f..9e48ba513f 100644 --- a/packages/twenty-server/test/utils/setup-tests.ts +++ b/packages/twenty-server/test/utils/setup-tests.ts @@ -1,5 +1,3 @@ -import resetDb from './reset-db'; - global.beforeEach(() => { // resetDb(); }); diff --git a/yarn.lock b/yarn.lock index 92903d064c..4a3e85421c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -42383,11 +42383,75 @@ __metadata: version: 0.0.0-use.local resolution: "twenty-server@workspace:packages/twenty-server" dependencies: + "@aws-sdk/client-s3": "npm:^3.363.0" + "@aws-sdk/credential-providers": "npm:^3.363.0" "@graphql-yoga/nestjs": "patch:@graphql-yoga/nestjs@2.1.0#./patches/@graphql-yoga+nestjs+2.1.0.patch" + "@nestjs/apollo": "npm:^11.0.5" + "@nestjs/axios": "npm:^3.0.1" + "@nestjs/cli": "npm:^9.0.0" + "@nestjs/common": "npm:^9.0.0" + "@nestjs/config": "npm:^2.3.2" + "@nestjs/core": "npm:^9.0.0" "@nestjs/graphql": "patch:@nestjs/graphql@12.0.8#./patches/@nestjs+graphql+12.0.8.patch" + "@nestjs/jwt": "npm:^10.0.3" + "@nestjs/passport": "npm:^9.0.3" + "@nestjs/platform-express": "npm:^9.0.0" + "@nestjs/schematics": "npm:^9.0.0" + "@nestjs/serve-static": "npm:^3.0.0" + "@nestjs/terminus": "npm:^9.2.2" + "@nestjs/testing": "npm:^9.0.0" + "@nestjs/typeorm": "npm:^10.0.0" + "@ptc-org/nestjs-query-core": "npm:^4.2.0" "@ptc-org/nestjs-query-graphql": "patch:@ptc-org/nestjs-query-graphql@4.2.0#./patches/@ptc-org+nestjs-query-graphql+4.2.0.patch" + "@ptc-org/nestjs-query-typeorm": "npm:4.2.1-alpha.2" + "@react-email/components": "npm:0.0.12" + "@react-email/render": "npm:0.0.10" + "@sentry/node": "npm:^7.66.0" + "@sentry/profiling-node": "npm:^1.3.4" + "@types/lodash.isempty": "npm:^4.4.7" + "@types/lodash.isobject": "npm:^3.0.7" + "@types/lodash.snakecase": "npm:^4.1.7" + "@types/lodash.upperfirst": "npm:^4.3.7" + "@types/react": "npm:^18.2.39" + axios: "npm:^1.6.2" + bcrypt: "npm:^5.1.1" + bullmq: "npm:^4.14.0" + class-transformer: "npm:^0.5.1" class-validator: "patch:class-validator@^0.14.0#./patches/class-validator+0.14.0.patch" + date-fns: "npm:^2.30.0" + file-type: "npm:16.5.4" + googleapis: "npm:105" + graphql: "npm:^16.8.1" + graphql-fields: "npm:^2.0.3" + graphql-subscriptions: "npm:2.0.0" + graphql-tag: "npm:^2.12.6" + graphql-type-json: "npm:^0.3.2" + graphql-upload: "npm:^13.0.0" + graphql-yoga: "npm:^4.0.4" + jest: "npm:29.7.0" + lodash.camelcase: "npm:^4.3.0" + lodash.isempty: "npm:^4.4.0" + lodash.isobject: "npm:^3.0.2" + lodash.kebabcase: "npm:^4.1.1" + lodash.snakecase: "npm:^4.1.1" + lodash.upperfirst: "npm:^4.3.1" + mailparser: "npm:^3.6.5" + microdiff: "npm:^1.3.2" + nest-commander: "npm:^3.12.0" + nodemailer: "npm:^6.9.8" + openapi-types: "npm:^12.1.3" + passport: "npm:^0.6.0" + passport-google-oauth20: "npm:^2.0.0" + passport-jwt: "npm:^4.0.1" + passport-local: "npm:^1.0.0" + pg: "npm:^8.11.3" + pg-boss: "npm:^9.0.3" + react: "npm:^18.2.0" + rimraf: "npm:^3.0.2" + sharp: "npm:^0.32.1" twenty-emails: "workspace:*" + type-fest: "npm:^4.1.0" + typeorm: "npm:^0.3.17" languageName: unknown linkType: soft