Refactor and standardize isSystem field and object (#17992)

# Introduction

## Centralize system field definitions
- Extract a single `PARTIAL_SYSTEM_FLAT_FIELD_METADATAS` constant as the
source of truth for all 8 system fields (`id`, `createdAt`, `updatedAt`,
`deletedAt`, `createdBy`, `updatedBy`, `position`, `searchVector`),
eliminating duplication across custom object and standard app field
builders
- Refactor `buildDefaultFlatFieldMetadatasForCustomObject` to use the
shared constant via a new `buildObjectSystemFlatFieldMetadatas` helper

## Mark system fields as `isSystem: true`
- Fields `id`, `createdAt`, `updatedAt`, `deletedAt`, `createdBy`,
`updatedBy`, `position`, `searchVector` are now properly flagged as
system fields across all standard objects and custom object creation
- Standard app field builders for all ~30 standard objects updated to
set `isSystem: true` on `createdAt`, `updatedAt`, `deletedAt`,
`createdBy`, `updatedBy`
- System-only standard objects (blocklist, calendar channels, message
threads, etc.) now also include `createdBy`, `updatedBy`, `position`,
`searchVector` field definitions that were previously missing

## Validate system fields on object creation
- New transversal validation (`crossEntityTransversalValidation`) runs
after all atomic entity validations in the build orchestrator, ensuring
all 8 system fields are present with correct `type` and `isSystem: true`
when an object is created
- New `buildUniversalFlatObjectFieldByNameAndJoinColumnMaps` utility to
resolve field names to universal identifiers for a given object
- New exception codes: `MISSING_SYSTEM_FIELD` and `INVALID_SYSTEM_FIELD`
on `ObjectMetadataExceptionCode`

## Protect system fields and objects from mutation
- Field validators now block update/delete of `isSystem` fields by
non-system callers (`FIELD_MUTATION_NOT_ALLOWED`)
- Object validators now block update/delete of `isSystem` objects by
non-system callers
- `POSITION` and `TS_VECTOR` field type validators replaced: instead of
rejecting creation outright, they now validate that the field is named
correctly (`position` / `searchVector`) and has `isSystem: true`

## Distinguish `isSystemBuild` from `isCallerTwentyStandardApp`
- New `isCallerTwentyStandardApp` utility checks whether the caller's
`applicationUniversalIdentifier` matches the twenty standard app
- Name-sync logic (`isFlatFieldMetadataNameSyncedWithLabel`,
`areFlatObjectMetadataNamesSyncedWithLabels`) refactored to use
`isCallerTwentyStandardApp` for custom suffix decisions, keeping
`isSystemBuild` for mutation permission checks
- `WorkspaceMigrationBuilderOptions` type updated to include
`applicationUniversalIdentifier`

## Adapt frontend filtering
- New `HIDDEN_SYSTEM_FIELD_NAMES` constant (`id`, `position`,
`searchVector`) and `isHiddenSystemField` utility to only hide truly
internal fields while keeping user-facing system fields (`createdAt`,
`updatedAt`, `deletedAt`, `createdBy`, `updatedBy`) visible in the UI
- ~20 frontend files updated to replace `!field.isSystem` checks with
`!isHiddenSystemField(field)` across record index, settings, data model,
charts, workflows, spreadsheet import, aggregations, and role
permissions

## Add 1.19 upgrade commands
- **`backfill-system-fields-is-system`**: Raw SQL command to set
`isSystem = true` on existing workspace fields matching system field
names, and fix `position` field type from `NUMBER` to `POSITION` for
`favorite`/`favoriteFolder` objects. Includes proper cache invalidation.
- **`add-missing-system-fields-to-standard-objects`**: Codegen'd
workspace migration to create missing `position`, `searchVector`,
`createdBy`, `updatedBy` fields on standard objects that didn't
previously have them. Runs via `WorkspaceMigrationRunnerService` in a
single transaction with idempotency check. **Known limitation**: assumes
all standard objects exist and are valid in the target workspace.

## Add `universalIdentifier` for system fields in standard object
constants
- `standard-object.constant.ts` updated to include `universalIdentifier`
for `createdBy`, `updatedBy`, `position`, and `searchVector` across all
standard objects
- `fieldManifestType.ts` updated to support the new field manifest shape

## System relation
Completely removed and backfilled all `isSystem` relation to be false
false
As we won't require an object to have any relation system fields

## Add integration tests
- New test suite `failing-sync-application-object-system-fields`
covering: missing system fields, wrong field types (`id` as TEXT,
`createdAt` as TEXT, `position` as TEXT), system field deletion
attempts, and system field update attempts
- New test utilities: `buildDefaultObjectManifest` (builds an object
manifest with all 8 system fields) and `setupApplicationForSync`
(centralizes application setup)
- Existing successful sync test updated to verify system fields are
created with correct properties

## Next step
Make the builder scope the compared entity to be the currently built app
+ nor twenty standard app
This commit is contained in:
Paul Rastoin
2026-02-19 11:13:50 +01:00
committed by GitHub
parent 082400f751
commit 88424611ec
137 changed files with 8850 additions and 2056 deletions
@@ -44,10 +44,12 @@ export class DevSeederPermissionsService {
public async initPermissions({
twentyStandardFlatApplication,
workspaceCustomFlatApplication,
workspaceId,
}: {
workspaceId: string;
twentyStandardFlatApplication: FlatApplication;
workspaceCustomFlatApplication: FlatApplication;
}) {
const adminRole = await this.roleRepository.findOne({
where: {
@@ -88,7 +90,7 @@ export class DevSeederPermissionsService {
const guestRole = await this.roleService.createGuestRole({
workspaceId,
ownerFlatApplication: twentyStandardFlatApplication,
ownerFlatApplication: workspaceCustomFlatApplication,
});
await this.userRoleService.assignRoleToManyUserWorkspace({
@@ -99,7 +101,7 @@ export class DevSeederPermissionsService {
const limitedRole = await this.createLimitedRoleForSeedWorkspace({
workspaceId,
ownerFlatApplication: twentyStandardFlatApplication,
ownerFlatApplication: workspaceCustomFlatApplication,
});
await this.userRoleService.assignRoleToManyUserWorkspace({
@@ -130,7 +132,7 @@ export class DevSeederPermissionsService {
const memberRole = await this.roleService.createMemberRole({
workspaceId,
ownerFlatApplication: twentyStandardFlatApplication,
ownerFlatApplication: workspaceCustomFlatApplication,
});
await this.coreDataSource
@@ -95,6 +95,7 @@ export class DevSeederService {
await this.devSeederPermissionsService.initPermissions({
workspaceId,
twentyStandardFlatApplication,
workspaceCustomFlatApplication,
});
await seedPageLayouts(
@@ -113,14 +113,14 @@ export class TwentyStandardApplicationService {
buildOptions: {
isSystemBuild: true,
inferDeletionFromMissingEntities: true,
applicationUniversalIdentifier:
twentyStandardFlatApplication.universalIdentifier,
},
fromToAllFlatEntityMaps,
workspaceId,
additionalCacheDataMaps: {
featureFlagsMap,
},
applicationUniversalIdentifier:
twentyStandardFlatApplication.universalIdentifier,
idByUniversalIdentifierByMetadataName,
},
);
@@ -13,6 +13,8 @@ import {
createStandardFieldFlatMetadata,
} from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util';
import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util';
import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/utils/get-ts-vector-column-expression.util';
import { SEARCH_FIELDS_FOR_ATTACHMENT } from 'src/modules/attachment/standard-objects/attachment.workspace-entity';
export const buildAttachmentStandardFlatFieldMetadatas = ({
now,
@@ -54,6 +56,7 @@ export const buildAttachmentStandardFlatFieldMetadatas = ({
label: 'Creation date',
description: 'Creation date',
icon: 'IconCalendar',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -75,6 +78,7 @@ export const buildAttachmentStandardFlatFieldMetadatas = ({
label: 'Last update',
description: 'Last time the record was changed',
icon: 'IconCalendarClock',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -96,6 +100,7 @@ export const buildAttachmentStandardFlatFieldMetadatas = ({
label: 'Deleted at',
description: 'Date when the record was deleted',
icon: 'IconCalendarMinus',
isSystem: true,
isNullable: true,
isUIReadOnly: true,
settings: {
@@ -219,6 +224,7 @@ export const buildAttachmentStandardFlatFieldMetadatas = ({
label: 'Created by',
description: 'The creator of the record',
icon: 'IconCreativeCommonsSa',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
@@ -241,6 +247,7 @@ export const buildAttachmentStandardFlatFieldMetadatas = ({
label: 'Updated by',
description: 'The workspace member who last updated the record',
icon: 'IconUserCircle',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
@@ -254,6 +261,47 @@ export const buildAttachmentStandardFlatFieldMetadatas = ({
twentyStandardApplicationId,
now,
}),
position: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'position',
type: FieldMetadataType.POSITION,
label: 'Position',
description: 'Attachment record position',
icon: 'IconHierarchy2',
isSystem: true,
isNullable: false,
defaultValue: 0,
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
searchVector: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'searchVector',
type: FieldMetadataType.TS_VECTOR,
label: 'Search vector',
description: 'Field used for full-text search',
icon: 'IconUser',
isSystem: true,
isNullable: true,
settings: {
generatedType: 'STORED',
asExpression: getTsVectorColumnExpressionFromFields(
SEARCH_FIELDS_FOR_ATTACHMENT,
),
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
// Relation fields
targetTask: createStandardRelationFieldFlatMetadata({
@@ -12,6 +12,8 @@ import {
createStandardFieldFlatMetadata,
} from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util';
import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util';
import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/utils/get-ts-vector-column-expression.util';
import { SEARCH_FIELDS_FOR_BLOCKLIST } from 'src/modules/blocklist/standard-objects/blocklist.workspace-entity';
export const buildBlocklistStandardFlatFieldMetadatas = ({
now,
@@ -53,6 +55,7 @@ export const buildBlocklistStandardFlatFieldMetadatas = ({
label: 'Creation date',
description: 'Creation date',
icon: 'IconCalendar',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -74,6 +77,7 @@ export const buildBlocklistStandardFlatFieldMetadatas = ({
label: 'Last update',
description: 'Last time the record was changed',
icon: 'IconCalendarClock',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -95,6 +99,7 @@ export const buildBlocklistStandardFlatFieldMetadatas = ({
label: 'Deleted at',
description: 'Date when the record was deleted',
icon: 'IconCalendarMinus',
isSystem: true,
isNullable: true,
isUIReadOnly: true,
settings: {
@@ -106,6 +111,93 @@ export const buildBlocklistStandardFlatFieldMetadatas = ({
twentyStandardApplicationId,
now,
}),
createdBy: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'createdBy',
type: FieldMetadataType.ACTOR,
label: 'Created by',
description: 'The creator of the record',
icon: 'IconCreativeCommonsSa',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
source: "'MANUAL'",
name: "'System'",
workspaceMemberId: null,
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
updatedBy: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'updatedBy',
type: FieldMetadataType.ACTOR,
label: 'Updated by',
description: 'The workspace member who last updated the record',
icon: 'IconUserCircle',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
source: "'MANUAL'",
name: "'System'",
workspaceMemberId: null,
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
position: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'position',
type: FieldMetadataType.POSITION,
label: 'Position',
description: 'Blocklist record position',
icon: 'IconHierarchy2',
isSystem: true,
isNullable: false,
defaultValue: 0,
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
searchVector: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'searchVector',
type: FieldMetadataType.TS_VECTOR,
label: 'Search vector',
description: 'Field used for full-text search',
icon: 'IconUser',
isSystem: true,
isNullable: true,
settings: {
generatedType: 'STORED',
asExpression: getTsVectorColumnExpressionFromFields(
SEARCH_FIELDS_FOR_BLOCKLIST,
),
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
// Blocklist-specific fields
handle: createStandardFieldFlatMetadata({
@@ -12,6 +12,8 @@ import {
createStandardFieldFlatMetadata,
} from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util';
import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util';
import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/utils/get-ts-vector-column-expression.util';
import { SEARCH_FIELDS_FOR_CALENDAR_CHANNEL_EVENT_ASSOCIATION } from 'src/modules/calendar/common/standard-objects/calendar-channel-event-association.workspace-entity';
export const buildCalendarChannelEventAssociationStandardFlatFieldMetadatas = ({
now,
@@ -55,6 +57,7 @@ export const buildCalendarChannelEventAssociationStandardFlatFieldMetadatas = ({
label: 'Creation date',
description: 'Creation date',
icon: 'IconCalendar',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -74,6 +77,7 @@ export const buildCalendarChannelEventAssociationStandardFlatFieldMetadatas = ({
label: 'Last update',
description: 'Last time the record was changed',
icon: 'IconCalendarClock',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -93,6 +97,7 @@ export const buildCalendarChannelEventAssociationStandardFlatFieldMetadatas = ({
label: 'Deleted at',
description: 'Date when the record was deleted',
icon: 'IconCalendarMinus',
isSystem: true,
isNullable: true,
isUIReadOnly: true,
settings: { displayFormat: DateDisplayFormat.RELATIVE },
@@ -102,6 +107,93 @@ export const buildCalendarChannelEventAssociationStandardFlatFieldMetadatas = ({
twentyStandardApplicationId,
now,
}),
createdBy: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'createdBy',
type: FieldMetadataType.ACTOR,
label: 'Created by',
description: 'The creator of the record',
icon: 'IconCreativeCommonsSa',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
source: "'MANUAL'",
name: "'System'",
workspaceMemberId: null,
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
updatedBy: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'updatedBy',
type: FieldMetadataType.ACTOR,
label: 'Updated by',
description: 'The workspace member who last updated the record',
icon: 'IconUserCircle',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
source: "'MANUAL'",
name: "'System'",
workspaceMemberId: null,
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
position: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'position',
type: FieldMetadataType.POSITION,
label: 'Position',
description: 'Calendar channel event association record position',
icon: 'IconHierarchy2',
isSystem: true,
isNullable: false,
defaultValue: 0,
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
searchVector: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'searchVector',
type: FieldMetadataType.TS_VECTOR,
label: 'Search vector',
description: 'Field used for full-text search',
icon: 'IconUser',
isSystem: true,
isNullable: true,
settings: {
generatedType: 'STORED',
asExpression: getTsVectorColumnExpressionFromFields(
SEARCH_FIELDS_FOR_CALENDAR_CHANNEL_EVENT_ASSOCIATION,
),
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
eventExternalId: createStandardFieldFlatMetadata({
objectName,
workspaceId,
@@ -12,6 +12,8 @@ import {
createStandardFieldFlatMetadata,
} from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util';
import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util';
import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/utils/get-ts-vector-column-expression.util';
import { SEARCH_FIELDS_FOR_CALENDAR_CHANNEL } from 'src/modules/calendar/common/standard-objects/calendar-channel.workspace-entity';
export const buildCalendarChannelStandardFlatFieldMetadatas = ({
now,
@@ -55,6 +57,7 @@ export const buildCalendarChannelStandardFlatFieldMetadatas = ({
label: 'Creation date',
description: 'Creation date',
icon: 'IconCalendar',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -74,6 +77,7 @@ export const buildCalendarChannelStandardFlatFieldMetadatas = ({
label: 'Last update',
description: 'Last time the record was changed',
icon: 'IconCalendarClock',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -93,6 +97,7 @@ export const buildCalendarChannelStandardFlatFieldMetadatas = ({
label: 'Deleted at',
description: 'Date when the record was deleted',
icon: 'IconCalendarMinus',
isSystem: true,
isNullable: true,
isUIReadOnly: true,
settings: { displayFormat: DateDisplayFormat.RELATIVE },
@@ -102,6 +107,93 @@ export const buildCalendarChannelStandardFlatFieldMetadatas = ({
twentyStandardApplicationId,
now,
}),
createdBy: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'createdBy',
type: FieldMetadataType.ACTOR,
label: 'Created by',
description: 'The creator of the record',
icon: 'IconCreativeCommonsSa',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
source: "'MANUAL'",
name: "'System'",
workspaceMemberId: null,
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
updatedBy: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'updatedBy',
type: FieldMetadataType.ACTOR,
label: 'Updated by',
description: 'The workspace member who last updated the record',
icon: 'IconUserCircle',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
source: "'MANUAL'",
name: "'System'",
workspaceMemberId: null,
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
position: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'position',
type: FieldMetadataType.POSITION,
label: 'Position',
description: 'Calendar channel record position',
icon: 'IconHierarchy2',
isSystem: true,
isNullable: false,
defaultValue: 0,
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
searchVector: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'searchVector',
type: FieldMetadataType.TS_VECTOR,
label: 'Search vector',
description: 'Field used for full-text search',
icon: 'IconUser',
isSystem: true,
isNullable: true,
settings: {
generatedType: 'STORED',
asExpression: getTsVectorColumnExpressionFromFields(
SEARCH_FIELDS_FOR_CALENDAR_CHANNEL,
),
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
handle: createStandardFieldFlatMetadata({
objectName,
workspaceId,
@@ -12,6 +12,8 @@ import {
createStandardFieldFlatMetadata,
} from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util';
import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util';
import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/utils/get-ts-vector-column-expression.util';
import { SEARCH_FIELDS_FOR_CALENDAR_EVENT_PARTICIPANT } from 'src/modules/calendar/common/standard-objects/calendar-event-participant.workspace-entity';
export const buildCalendarEventParticipantStandardFlatFieldMetadatas = ({
now,
@@ -55,6 +57,7 @@ export const buildCalendarEventParticipantStandardFlatFieldMetadatas = ({
label: 'Creation date',
description: 'Creation date',
icon: 'IconCalendar',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -74,6 +77,7 @@ export const buildCalendarEventParticipantStandardFlatFieldMetadatas = ({
label: 'Last update',
description: 'Last time the record was changed',
icon: 'IconCalendarClock',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -93,6 +97,7 @@ export const buildCalendarEventParticipantStandardFlatFieldMetadatas = ({
label: 'Deleted at',
description: 'Date when the record was deleted',
icon: 'IconCalendarMinus',
isSystem: true,
isNullable: true,
isUIReadOnly: true,
settings: { displayFormat: DateDisplayFormat.RELATIVE },
@@ -102,6 +107,93 @@ export const buildCalendarEventParticipantStandardFlatFieldMetadatas = ({
twentyStandardApplicationId,
now,
}),
createdBy: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'createdBy',
type: FieldMetadataType.ACTOR,
label: 'Created by',
description: 'The creator of the record',
icon: 'IconCreativeCommonsSa',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
source: "'MANUAL'",
name: "'System'",
workspaceMemberId: null,
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
updatedBy: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'updatedBy',
type: FieldMetadataType.ACTOR,
label: 'Updated by',
description: 'The workspace member who last updated the record',
icon: 'IconUserCircle',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
source: "'MANUAL'",
name: "'System'",
workspaceMemberId: null,
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
position: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'position',
type: FieldMetadataType.POSITION,
label: 'Position',
description: 'Calendar event participant record position',
icon: 'IconHierarchy2',
isSystem: true,
isNullable: false,
defaultValue: 0,
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
searchVector: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'searchVector',
type: FieldMetadataType.TS_VECTOR,
label: 'Search vector',
description: 'Field used for full-text search',
icon: 'IconUser',
isSystem: true,
isNullable: true,
settings: {
generatedType: 'STORED',
asExpression: getTsVectorColumnExpressionFromFields(
SEARCH_FIELDS_FOR_CALENDAR_EVENT_PARTICIPANT,
),
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
handle: createStandardFieldFlatMetadata({
objectName,
workspaceId,
@@ -11,6 +11,8 @@ import {
createStandardFieldFlatMetadata,
} from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util';
import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util';
import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/utils/get-ts-vector-column-expression.util';
import { SEARCH_FIELDS_FOR_CALENDAR_EVENT } from 'src/modules/calendar/common/standard-objects/calendar-event.workspace-entity';
export const buildCalendarEventStandardFlatFieldMetadatas = ({
now,
@@ -51,6 +53,7 @@ export const buildCalendarEventStandardFlatFieldMetadatas = ({
label: 'Creation date',
description: 'Creation date',
icon: 'IconCalendar',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -70,6 +73,7 @@ export const buildCalendarEventStandardFlatFieldMetadatas = ({
label: 'Last update',
description: 'Last time the record was changed',
icon: 'IconCalendarClock',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -89,6 +93,7 @@ export const buildCalendarEventStandardFlatFieldMetadatas = ({
label: 'Deleted at',
description: 'Date when the record was deleted',
icon: 'IconCalendarMinus',
isSystem: true,
isNullable: true,
isUIReadOnly: true,
settings: { displayFormat: DateDisplayFormat.RELATIVE },
@@ -98,6 +103,93 @@ export const buildCalendarEventStandardFlatFieldMetadatas = ({
twentyStandardApplicationId,
now,
}),
createdBy: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'createdBy',
type: FieldMetadataType.ACTOR,
label: 'Created by',
description: 'The creator of the record',
icon: 'IconCreativeCommonsSa',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
source: "'MANUAL'",
name: "'System'",
workspaceMemberId: null,
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
updatedBy: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'updatedBy',
type: FieldMetadataType.ACTOR,
label: 'Updated by',
description: 'The workspace member who last updated the record',
icon: 'IconUserCircle',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
source: "'MANUAL'",
name: "'System'",
workspaceMemberId: null,
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
position: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'position',
type: FieldMetadataType.POSITION,
label: 'Position',
description: 'Calendar event record position',
icon: 'IconHierarchy2',
isSystem: true,
isNullable: false,
defaultValue: 0,
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
searchVector: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'searchVector',
type: FieldMetadataType.TS_VECTOR,
label: 'Search vector',
description: 'Field used for full-text search',
icon: 'IconUser',
isSystem: true,
isNullable: true,
settings: {
generatedType: 'STORED',
asExpression: getTsVectorColumnExpressionFromFields(
SEARCH_FIELDS_FOR_CALENDAR_EVENT,
),
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
title: createStandardFieldFlatMetadata({
objectName,
workspaceId,
@@ -55,6 +55,7 @@ export const buildCompanyStandardFlatFieldMetadatas = ({
label: 'Creation date',
description: 'Creation date',
icon: 'IconCalendar',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -76,6 +77,7 @@ export const buildCompanyStandardFlatFieldMetadatas = ({
label: 'Last update',
description: 'Last time the record was changed',
icon: 'IconCalendarClock',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -97,6 +99,7 @@ export const buildCompanyStandardFlatFieldMetadatas = ({
label: 'Deleted at',
description: 'Date when the record was deleted',
icon: 'IconCalendarMinus',
isSystem: true,
isNullable: true,
isUIReadOnly: true,
settings: {
@@ -273,6 +276,7 @@ export const buildCompanyStandardFlatFieldMetadatas = ({
label: 'Created by',
description: 'The creator of the record',
icon: 'IconCreativeCommonsSa',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
@@ -295,6 +299,7 @@ export const buildCompanyStandardFlatFieldMetadatas = ({
label: 'Updated by',
description: 'The workspace member who last updated the record',
icon: 'IconUserCircle',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
@@ -458,7 +463,6 @@ export const buildCompanyStandardFlatFieldMetadatas = ({
label: 'Favorites',
description: 'Favorites linked to the company',
icon: 'IconHeart',
isSystem: true,
isNullable: true,
targetObjectName: 'favorite',
targetFieldName: 'company',
@@ -481,7 +485,6 @@ export const buildCompanyStandardFlatFieldMetadatas = ({
label: 'Attachments',
description: 'Attachments linked to the company',
icon: 'IconFileImport',
isSystem: true,
isNullable: true,
targetObjectName: 'attachment',
targetFieldName: 'targetCompany',
@@ -504,7 +507,6 @@ export const buildCompanyStandardFlatFieldMetadatas = ({
label: 'Timeline Activities',
description: 'Timeline Activities linked to the company',
icon: 'IconIconTimelineEvent',
isSystem: true,
isNullable: true,
targetObjectName: 'timelineActivity',
targetFieldName: 'targetCompany',
@@ -12,6 +12,8 @@ import {
createStandardFieldFlatMetadata,
} from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util';
import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util';
import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/utils/get-ts-vector-column-expression.util';
import { SEARCH_FIELDS_FOR_CONNECTED_ACCOUNT } from 'src/modules/connected-account/standard-objects/connected-account.workspace-entity';
export const buildConnectedAccountStandardFlatFieldMetadatas = ({
now,
@@ -55,6 +57,7 @@ export const buildConnectedAccountStandardFlatFieldMetadatas = ({
label: 'Creation date',
description: 'Creation date',
icon: 'IconCalendar',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -74,6 +77,7 @@ export const buildConnectedAccountStandardFlatFieldMetadatas = ({
label: 'Last update',
description: 'Last time the record was changed',
icon: 'IconCalendarClock',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -93,6 +97,7 @@ export const buildConnectedAccountStandardFlatFieldMetadatas = ({
label: 'Deleted at',
description: 'Date when the record was deleted',
icon: 'IconCalendarMinus',
isSystem: true,
isNullable: true,
isUIReadOnly: true,
settings: { displayFormat: DateDisplayFormat.RELATIVE },
@@ -102,6 +107,93 @@ export const buildConnectedAccountStandardFlatFieldMetadatas = ({
twentyStandardApplicationId,
now,
}),
createdBy: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'createdBy',
type: FieldMetadataType.ACTOR,
label: 'Created by',
description: 'The creator of the record',
icon: 'IconCreativeCommonsSa',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
source: "'MANUAL'",
name: "'System'",
workspaceMemberId: null,
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
updatedBy: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'updatedBy',
type: FieldMetadataType.ACTOR,
label: 'Updated by',
description: 'The workspace member who last updated the record',
icon: 'IconUserCircle',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
source: "'MANUAL'",
name: "'System'",
workspaceMemberId: null,
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
position: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'position',
type: FieldMetadataType.POSITION,
label: 'Position',
description: 'Connected account record position',
icon: 'IconHierarchy2',
isSystem: true,
isNullable: false,
defaultValue: 0,
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
searchVector: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'searchVector',
type: FieldMetadataType.TS_VECTOR,
label: 'Search vector',
description: 'Field used for full-text search',
icon: 'IconUser',
isSystem: true,
isNullable: true,
settings: {
generatedType: 'STORED',
asExpression: getTsVectorColumnExpressionFromFields(
SEARCH_FIELDS_FOR_CONNECTED_ACCOUNT,
),
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
handle: createStandardFieldFlatMetadata({
objectName,
workspaceId,
@@ -54,6 +54,7 @@ export const buildDashboardStandardFlatFieldMetadatas = ({
label: 'Creation date',
description: 'Creation date',
icon: 'IconCalendar',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -73,6 +74,7 @@ export const buildDashboardStandardFlatFieldMetadatas = ({
label: 'Last update',
description: 'Last time the record was changed',
icon: 'IconCalendarClock',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -92,6 +94,7 @@ export const buildDashboardStandardFlatFieldMetadatas = ({
label: 'Deleted at',
description: 'Date when the record was deleted',
icon: 'IconCalendarMinus',
isSystem: true,
isNullable: true,
isUIReadOnly: true,
settings: { displayFormat: DateDisplayFormat.RELATIVE },
@@ -163,6 +166,7 @@ export const buildDashboardStandardFlatFieldMetadatas = ({
label: 'Created by',
description: 'The creator of the record',
icon: 'IconCreativeCommonsSa',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
@@ -185,6 +189,7 @@ export const buildDashboardStandardFlatFieldMetadatas = ({
label: 'Updated by',
description: 'The workspace member who last updated the record',
icon: 'IconUserCircle',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
@@ -233,7 +238,6 @@ export const buildDashboardStandardFlatFieldMetadatas = ({
label: 'Timeline Activities',
description: 'Timeline activities linked to the dashboard',
icon: 'IconTimelineEvent',
isSystem: true,
isNullable: true,
targetObjectName: 'timelineActivity',
targetFieldName: 'targetDashboard',
@@ -256,7 +260,6 @@ export const buildDashboardStandardFlatFieldMetadatas = ({
label: 'Favorites',
description: 'Favorites linked to the dashboard',
icon: 'IconHeart',
isSystem: true,
isNullable: false,
targetObjectName: 'favorite',
targetFieldName: 'dashboard',
@@ -279,7 +282,6 @@ export const buildDashboardStandardFlatFieldMetadatas = ({
label: 'Attachments',
description: 'Attachments linked to the dashboard',
icon: 'IconFileImport',
isSystem: true,
isNullable: true,
targetObjectName: 'attachment',
targetFieldName: 'targetDashboard',
@@ -11,6 +11,8 @@ import {
createStandardFieldFlatMetadata,
} from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util';
import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util';
import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/utils/get-ts-vector-column-expression.util';
import { SEARCH_FIELDS_FOR_FAVORITE_FOLDER } from 'src/modules/favorite-folder/standard-objects/favorite-folder.workspace-entity';
export const buildFavoriteFolderStandardFlatFieldMetadatas = ({
now,
@@ -55,6 +57,7 @@ export const buildFavoriteFolderStandardFlatFieldMetadatas = ({
label: 'Creation date',
description: 'Creation date',
icon: 'IconCalendar',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -74,6 +77,7 @@ export const buildFavoriteFolderStandardFlatFieldMetadatas = ({
label: 'Last update',
description: 'Last time the record was changed',
icon: 'IconCalendarClock',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -93,6 +97,7 @@ export const buildFavoriteFolderStandardFlatFieldMetadatas = ({
label: 'Deleted at',
description: 'Date when the record was deleted',
icon: 'IconCalendarMinus',
isSystem: true,
isNullable: true,
isUIReadOnly: true,
settings: { displayFormat: DateDisplayFormat.RELATIVE },
@@ -102,6 +107,52 @@ export const buildFavoriteFolderStandardFlatFieldMetadatas = ({
twentyStandardApplicationId,
now,
}),
createdBy: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'createdBy',
type: FieldMetadataType.ACTOR,
label: 'Created by',
description: 'The creator of the record',
icon: 'IconCreativeCommonsSa',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
source: "'MANUAL'",
name: "'System'",
workspaceMemberId: null,
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
updatedBy: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'updatedBy',
type: FieldMetadataType.ACTOR,
label: 'Updated by',
description: 'The workspace member who last updated the record',
icon: 'IconUserCircle',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
source: "'MANUAL'",
name: "'System'",
workspaceMemberId: null,
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
// FavoriteFolder-specific fields
position: createStandardFieldFlatMetadata({
@@ -109,10 +160,10 @@ export const buildFavoriteFolderStandardFlatFieldMetadatas = ({
workspaceId,
context: {
fieldName: 'position',
type: FieldMetadataType.NUMBER,
type: FieldMetadataType.POSITION,
label: 'Position',
description: 'Favorite folder position',
icon: 'IconList',
icon: 'IconHierarchy2',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
@@ -123,6 +174,29 @@ export const buildFavoriteFolderStandardFlatFieldMetadatas = ({
twentyStandardApplicationId,
now,
}),
searchVector: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'searchVector',
type: FieldMetadataType.TS_VECTOR,
label: 'Search vector',
description: 'Field used for full-text search',
icon: 'IconUser',
isSystem: true,
isNullable: true,
settings: {
generatedType: 'STORED',
asExpression: getTsVectorColumnExpressionFromFields(
SEARCH_FIELDS_FOR_FAVORITE_FOLDER,
),
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
name: createStandardFieldFlatMetadata({
objectName,
workspaceId,
@@ -53,6 +53,7 @@ export const buildFavoriteStandardFlatFieldMetadatas = ({
label: 'Creation date',
description: 'Creation date',
icon: 'IconCalendar',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -72,6 +73,7 @@ export const buildFavoriteStandardFlatFieldMetadatas = ({
label: 'Last update',
description: 'Last time the record was changed',
icon: 'IconCalendarClock',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -91,6 +93,7 @@ export const buildFavoriteStandardFlatFieldMetadatas = ({
label: 'Deleted at',
description: 'Date when the record was deleted',
icon: 'IconCalendarMinus',
isSystem: true,
isNullable: true,
isUIReadOnly: true,
settings: { displayFormat: DateDisplayFormat.RELATIVE },
@@ -100,6 +103,52 @@ export const buildFavoriteStandardFlatFieldMetadatas = ({
twentyStandardApplicationId,
now,
}),
createdBy: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'createdBy',
type: FieldMetadataType.ACTOR,
label: 'Created by',
description: 'The creator of the record',
icon: 'IconCreativeCommonsSa',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
source: "'MANUAL'",
name: "'System'",
workspaceMemberId: null,
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
updatedBy: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'updatedBy',
type: FieldMetadataType.ACTOR,
label: 'Updated by',
description: 'The workspace member who last updated the record',
icon: 'IconUserCircle',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
source: "'MANUAL'",
name: "'System'",
workspaceMemberId: null,
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
// Favorite-specific fields
position: createStandardFieldFlatMetadata({
@@ -107,10 +156,10 @@ export const buildFavoriteStandardFlatFieldMetadatas = ({
workspaceId,
context: {
fieldName: 'position',
type: FieldMetadataType.NUMBER,
type: FieldMetadataType.POSITION,
label: 'Position',
description: 'Favorite position',
icon: 'IconList',
icon: 'IconHierarchy2',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
@@ -121,6 +170,23 @@ export const buildFavoriteStandardFlatFieldMetadatas = ({
twentyStandardApplicationId,
now,
}),
searchVector: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'searchVector',
type: FieldMetadataType.TS_VECTOR,
label: 'Search vector',
description: 'Field used for full-text search',
icon: 'IconUser',
isSystem: true,
isNullable: true,
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
viewId: createStandardFieldFlatMetadata({
objectName,
workspaceId,
@@ -12,6 +12,8 @@ import {
createStandardFieldFlatMetadata,
} from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util';
import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util';
import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/utils/get-ts-vector-column-expression.util';
import { SEARCH_FIELDS_FOR_MESSAGE_CHANNEL_MESSAGE_ASSOCIATION_MESSAGE_FOLDER } from 'src/modules/messaging/common/standard-objects/message-channel-message-association-message-folder.workspace-entity';
export const buildMessageChannelMessageAssociationMessageFolderStandardFlatFieldMetadatas =
({
@@ -59,6 +61,7 @@ export const buildMessageChannelMessageAssociationMessageFolderStandardFlatField
label: 'Creation date',
description: 'Creation date',
icon: 'IconCalendar',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -78,6 +81,7 @@ export const buildMessageChannelMessageAssociationMessageFolderStandardFlatField
label: 'Last update',
description: 'Last time the record was changed',
icon: 'IconCalendarClock',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -97,6 +101,7 @@ export const buildMessageChannelMessageAssociationMessageFolderStandardFlatField
label: 'Deleted at',
description: 'Date when the record was deleted',
icon: 'IconCalendarMinus',
isSystem: true,
isNullable: true,
isUIReadOnly: true,
settings: { displayFormat: DateDisplayFormat.RELATIVE },
@@ -106,6 +111,94 @@ export const buildMessageChannelMessageAssociationMessageFolderStandardFlatField
twentyStandardApplicationId,
now,
}),
createdBy: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'createdBy',
type: FieldMetadataType.ACTOR,
label: 'Created by',
description: 'The creator of the record',
icon: 'IconCreativeCommonsSa',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
source: "'MANUAL'",
name: "'System'",
workspaceMemberId: null,
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
updatedBy: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'updatedBy',
type: FieldMetadataType.ACTOR,
label: 'Updated by',
description: 'The workspace member who last updated the record',
icon: 'IconUserCircle',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
source: "'MANUAL'",
name: "'System'",
workspaceMemberId: null,
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
position: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'position',
type: FieldMetadataType.POSITION,
label: 'Position',
description:
'Message channel message association message folder record position',
icon: 'IconHierarchy2',
isSystem: true,
isNullable: false,
defaultValue: 0,
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
searchVector: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'searchVector',
type: FieldMetadataType.TS_VECTOR,
label: 'Search vector',
description: 'Field used for full-text search',
icon: 'IconUser',
isSystem: true,
isNullable: true,
settings: {
generatedType: 'STORED',
asExpression: getTsVectorColumnExpressionFromFields(
SEARCH_FIELDS_FOR_MESSAGE_CHANNEL_MESSAGE_ASSOCIATION_MESSAGE_FOLDER,
),
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
messageChannelMessageAssociation: createStandardRelationFieldFlatMetadata({
objectName,
workspaceId,
@@ -12,6 +12,8 @@ import {
createStandardFieldFlatMetadata,
} from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util';
import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util';
import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/utils/get-ts-vector-column-expression.util';
import { SEARCH_FIELDS_FOR_MESSAGE_CHANNEL_MESSAGE_ASSOCIATION } from 'src/modules/messaging/common/standard-objects/message-channel-message-association.workspace-entity';
import { MessageDirection } from 'src/modules/messaging/common/enums/message-direction.enum';
export const buildMessageChannelMessageAssociationStandardFlatFieldMetadatas =
@@ -60,6 +62,7 @@ export const buildMessageChannelMessageAssociationStandardFlatFieldMetadatas =
label: 'Creation date',
description: 'Creation date',
icon: 'IconCalendar',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -79,6 +82,7 @@ export const buildMessageChannelMessageAssociationStandardFlatFieldMetadatas =
label: 'Last update',
description: 'Last time the record was changed',
icon: 'IconCalendarClock',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -98,6 +102,7 @@ export const buildMessageChannelMessageAssociationStandardFlatFieldMetadatas =
label: 'Deleted at',
description: 'Date when the record was deleted',
icon: 'IconCalendarMinus',
isSystem: true,
isNullable: true,
isUIReadOnly: true,
settings: { displayFormat: DateDisplayFormat.RELATIVE },
@@ -107,6 +112,93 @@ export const buildMessageChannelMessageAssociationStandardFlatFieldMetadatas =
twentyStandardApplicationId,
now,
}),
createdBy: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'createdBy',
type: FieldMetadataType.ACTOR,
label: 'Created by',
description: 'The creator of the record',
icon: 'IconCreativeCommonsSa',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
source: "'MANUAL'",
name: "'System'",
workspaceMemberId: null,
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
updatedBy: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'updatedBy',
type: FieldMetadataType.ACTOR,
label: 'Updated by',
description: 'The workspace member who last updated the record',
icon: 'IconUserCircle',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
source: "'MANUAL'",
name: "'System'",
workspaceMemberId: null,
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
position: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'position',
type: FieldMetadataType.POSITION,
label: 'Position',
description: 'Message channel message association record position',
icon: 'IconHierarchy2',
isSystem: true,
isNullable: false,
defaultValue: 0,
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
searchVector: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'searchVector',
type: FieldMetadataType.TS_VECTOR,
label: 'Search vector',
description: 'Field used for full-text search',
icon: 'IconUser',
isSystem: true,
isNullable: true,
settings: {
generatedType: 'STORED',
asExpression: getTsVectorColumnExpressionFromFields(
SEARCH_FIELDS_FOR_MESSAGE_CHANNEL_MESSAGE_ASSOCIATION,
),
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
messageExternalId: createStandardFieldFlatMetadata({
objectName,
workspaceId,
@@ -12,7 +12,11 @@ import {
createStandardFieldFlatMetadata,
} from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util';
import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util';
import { MessageChannelType } from 'src/modules/messaging/common/standard-objects/message-channel.workspace-entity';
import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/utils/get-ts-vector-column-expression.util';
import {
MessageChannelType,
SEARCH_FIELDS_FOR_MESSAGE_CHANNEL,
} from 'src/modules/messaging/common/standard-objects/message-channel.workspace-entity';
export const buildMessageChannelStandardFlatFieldMetadatas = ({
now,
@@ -56,6 +60,7 @@ export const buildMessageChannelStandardFlatFieldMetadatas = ({
label: 'Creation date',
description: 'Creation date',
icon: 'IconCalendar',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -75,6 +80,7 @@ export const buildMessageChannelStandardFlatFieldMetadatas = ({
label: 'Last update',
description: 'Last time the record was changed',
icon: 'IconCalendarClock',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -94,6 +100,7 @@ export const buildMessageChannelStandardFlatFieldMetadatas = ({
label: 'Deleted at',
description: 'Date when the record was deleted',
icon: 'IconCalendarMinus',
isSystem: true,
isNullable: true,
isUIReadOnly: true,
settings: { displayFormat: DateDisplayFormat.RELATIVE },
@@ -103,6 +110,93 @@ export const buildMessageChannelStandardFlatFieldMetadatas = ({
twentyStandardApplicationId,
now,
}),
createdBy: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'createdBy',
type: FieldMetadataType.ACTOR,
label: 'Created by',
description: 'The creator of the record',
icon: 'IconCreativeCommonsSa',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
source: "'MANUAL'",
name: "'System'",
workspaceMemberId: null,
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
updatedBy: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'updatedBy',
type: FieldMetadataType.ACTOR,
label: 'Updated by',
description: 'The workspace member who last updated the record',
icon: 'IconUserCircle',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
source: "'MANUAL'",
name: "'System'",
workspaceMemberId: null,
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
position: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'position',
type: FieldMetadataType.POSITION,
label: 'Position',
description: 'Message Channel record position',
icon: 'IconHierarchy2',
isSystem: true,
isNullable: false,
defaultValue: 0,
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
searchVector: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'searchVector',
type: FieldMetadataType.TS_VECTOR,
label: 'Search vector',
description: 'Field used for full-text search',
icon: 'IconUser',
isSystem: true,
isNullable: true,
settings: {
generatedType: 'STORED',
asExpression: getTsVectorColumnExpressionFromFields(
SEARCH_FIELDS_FOR_MESSAGE_CHANNEL,
),
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
visibility: createStandardFieldFlatMetadata({
objectName,
workspaceId,
@@ -12,6 +12,8 @@ import {
createStandardFieldFlatMetadata,
} from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util';
import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util';
import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/utils/get-ts-vector-column-expression.util';
import { SEARCH_FIELDS_FOR_MESSAGE_FOLDER } from 'src/modules/messaging/common/standard-objects/message-folder.workspace-entity';
export const buildMessageFolderStandardFlatFieldMetadatas = ({
now,
@@ -52,6 +54,7 @@ export const buildMessageFolderStandardFlatFieldMetadatas = ({
label: 'Creation date',
description: 'Creation date',
icon: 'IconCalendar',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -71,6 +74,7 @@ export const buildMessageFolderStandardFlatFieldMetadatas = ({
label: 'Last update',
description: 'Last time the record was changed',
icon: 'IconCalendarClock',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -90,6 +94,7 @@ export const buildMessageFolderStandardFlatFieldMetadatas = ({
label: 'Deleted at',
description: 'Date when the record was deleted',
icon: 'IconCalendarMinus',
isSystem: true,
isNullable: true,
isUIReadOnly: true,
settings: { displayFormat: DateDisplayFormat.RELATIVE },
@@ -99,6 +104,93 @@ export const buildMessageFolderStandardFlatFieldMetadatas = ({
twentyStandardApplicationId,
now,
}),
createdBy: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'createdBy',
type: FieldMetadataType.ACTOR,
label: 'Created by',
description: 'The creator of the record',
icon: 'IconCreativeCommonsSa',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
source: "'MANUAL'",
name: "'System'",
workspaceMemberId: null,
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
updatedBy: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'updatedBy',
type: FieldMetadataType.ACTOR,
label: 'Updated by',
description: 'The workspace member who last updated the record',
icon: 'IconUserCircle',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
source: "'MANUAL'",
name: "'System'",
workspaceMemberId: null,
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
position: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'position',
type: FieldMetadataType.POSITION,
label: 'Position',
description: 'Message Folder record position',
icon: 'IconHierarchy2',
isSystem: true,
isNullable: false,
defaultValue: 0,
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
searchVector: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'searchVector',
type: FieldMetadataType.TS_VECTOR,
label: 'Search vector',
description: 'Field used for full-text search',
icon: 'IconUser',
isSystem: true,
isNullable: true,
settings: {
generatedType: 'STORED',
asExpression: getTsVectorColumnExpressionFromFields(
SEARCH_FIELDS_FOR_MESSAGE_FOLDER,
),
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
name: createStandardFieldFlatMetadata({
objectName,
workspaceId,
@@ -13,6 +13,8 @@ import {
createStandardFieldFlatMetadata,
} from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util';
import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util';
import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/utils/get-ts-vector-column-expression.util';
import { SEARCH_FIELDS_FOR_MESSAGE_PARTICIPANT } from 'src/modules/messaging/common/standard-objects/message-participant.workspace-entity';
export const buildMessageParticipantStandardFlatFieldMetadatas = ({
now,
@@ -56,6 +58,7 @@ export const buildMessageParticipantStandardFlatFieldMetadatas = ({
label: 'Creation date',
description: 'Creation date',
icon: 'IconCalendar',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -75,6 +78,7 @@ export const buildMessageParticipantStandardFlatFieldMetadatas = ({
label: 'Last update',
description: 'Last time the record was changed',
icon: 'IconCalendarClock',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -94,6 +98,7 @@ export const buildMessageParticipantStandardFlatFieldMetadatas = ({
label: 'Deleted at',
description: 'Date when the record was deleted',
icon: 'IconCalendarMinus',
isSystem: true,
isNullable: true,
isUIReadOnly: true,
settings: { displayFormat: DateDisplayFormat.RELATIVE },
@@ -103,6 +108,93 @@ export const buildMessageParticipantStandardFlatFieldMetadatas = ({
twentyStandardApplicationId,
now,
}),
createdBy: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'createdBy',
type: FieldMetadataType.ACTOR,
label: 'Created by',
description: 'The creator of the record',
icon: 'IconCreativeCommonsSa',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
source: "'MANUAL'",
name: "'System'",
workspaceMemberId: null,
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
updatedBy: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'updatedBy',
type: FieldMetadataType.ACTOR,
label: 'Updated by',
description: 'The workspace member who last updated the record',
icon: 'IconUserCircle',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
source: "'MANUAL'",
name: "'System'",
workspaceMemberId: null,
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
position: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'position',
type: FieldMetadataType.POSITION,
label: 'Position',
description: 'Message Participant record position',
icon: 'IconHierarchy2',
isSystem: true,
isNullable: false,
defaultValue: 0,
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
searchVector: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'searchVector',
type: FieldMetadataType.TS_VECTOR,
label: 'Search vector',
description: 'Field used for full-text search',
icon: 'IconUser',
isSystem: true,
isNullable: true,
settings: {
generatedType: 'STORED',
asExpression: getTsVectorColumnExpressionFromFields(
SEARCH_FIELDS_FOR_MESSAGE_PARTICIPANT,
),
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
role: createStandardFieldFlatMetadata({
objectName,
workspaceId,
@@ -12,6 +12,8 @@ import {
createStandardFieldFlatMetadata,
} from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util';
import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util';
import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/utils/get-ts-vector-column-expression.util';
import { SEARCH_FIELDS_FOR_MESSAGE } from 'src/modules/messaging/common/standard-objects/message.workspace-entity';
export const buildMessageStandardFlatFieldMetadatas = ({
now,
@@ -52,6 +54,7 @@ export const buildMessageStandardFlatFieldMetadatas = ({
label: 'Creation date',
description: 'Creation date',
icon: 'IconCalendar',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -71,6 +74,7 @@ export const buildMessageStandardFlatFieldMetadatas = ({
label: 'Last update',
description: 'Last time the record was changed',
icon: 'IconCalendarClock',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -90,6 +94,7 @@ export const buildMessageStandardFlatFieldMetadatas = ({
label: 'Deleted at',
description: 'Date when the record was deleted',
icon: 'IconCalendarMinus',
isSystem: true,
isNullable: true,
isUIReadOnly: true,
settings: { displayFormat: DateDisplayFormat.RELATIVE },
@@ -99,6 +104,93 @@ export const buildMessageStandardFlatFieldMetadatas = ({
twentyStandardApplicationId,
now,
}),
createdBy: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'createdBy',
type: FieldMetadataType.ACTOR,
label: 'Created by',
description: 'The creator of the record',
icon: 'IconCreativeCommonsSa',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
source: "'MANUAL'",
name: "'System'",
workspaceMemberId: null,
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
updatedBy: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'updatedBy',
type: FieldMetadataType.ACTOR,
label: 'Updated by',
description: 'The workspace member who last updated the record',
icon: 'IconUserCircle',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
source: "'MANUAL'",
name: "'System'",
workspaceMemberId: null,
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
position: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'position',
type: FieldMetadataType.POSITION,
label: 'Position',
description: 'Message record position',
icon: 'IconHierarchy2',
isSystem: true,
isNullable: false,
defaultValue: 0,
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
searchVector: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'searchVector',
type: FieldMetadataType.TS_VECTOR,
label: 'Search vector',
description: 'Field used for full-text search',
icon: 'IconUser',
isSystem: true,
isNullable: true,
settings: {
generatedType: 'STORED',
asExpression: getTsVectorColumnExpressionFromFields(
SEARCH_FIELDS_FOR_MESSAGE,
),
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
headerMessageId: createStandardFieldFlatMetadata({
objectName,
workspaceId,
@@ -51,6 +51,7 @@ export const buildMessageThreadStandardFlatFieldMetadatas = ({
label: 'Creation date',
description: 'Creation date',
icon: 'IconCalendar',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -70,6 +71,7 @@ export const buildMessageThreadStandardFlatFieldMetadatas = ({
label: 'Last update',
description: 'Last time the record was changed',
icon: 'IconCalendarClock',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -89,6 +91,7 @@ export const buildMessageThreadStandardFlatFieldMetadatas = ({
label: 'Deleted at',
description: 'Date when the record was deleted',
icon: 'IconCalendarMinus',
isSystem: true,
isNullable: true,
isUIReadOnly: true,
settings: { displayFormat: DateDisplayFormat.RELATIVE },
@@ -98,6 +101,87 @@ export const buildMessageThreadStandardFlatFieldMetadatas = ({
twentyStandardApplicationId,
now,
}),
createdBy: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'createdBy',
type: FieldMetadataType.ACTOR,
label: 'Created by',
description: 'The creator of the record',
icon: 'IconCreativeCommonsSa',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
source: "'MANUAL'",
name: "'System'",
workspaceMemberId: null,
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
updatedBy: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'updatedBy',
type: FieldMetadataType.ACTOR,
label: 'Updated by',
description: 'The workspace member who last updated the record',
icon: 'IconUserCircle',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
source: "'MANUAL'",
name: "'System'",
workspaceMemberId: null,
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
position: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'position',
type: FieldMetadataType.POSITION,
label: 'Position',
description: 'Message Thread record position',
icon: 'IconHierarchy2',
isSystem: true,
isNullable: false,
defaultValue: 0,
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
searchVector: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'searchVector',
type: FieldMetadataType.TS_VECTOR,
label: 'Search vector',
description: 'Field used for full-text search',
icon: 'IconUser',
isSystem: true,
isNullable: true,
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
messages: createStandardRelationFieldFlatMetadata({
objectName,
workspaceId,
@@ -54,6 +54,7 @@ export const buildNoteStandardFlatFieldMetadatas = ({
label: 'Creation date',
description: 'Creation date',
icon: 'IconCalendar',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -75,6 +76,7 @@ export const buildNoteStandardFlatFieldMetadatas = ({
label: 'Last update',
description: 'Last time the record was changed',
icon: 'IconCalendarClock',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -96,6 +98,7 @@ export const buildNoteStandardFlatFieldMetadatas = ({
label: 'Deleted at',
description: 'Date when the record was deleted',
icon: 'IconCalendarMinus',
isSystem: true,
isNullable: true,
isUIReadOnly: true,
settings: {
@@ -168,6 +171,7 @@ export const buildNoteStandardFlatFieldMetadatas = ({
label: 'Created by',
description: 'The creator of the record',
icon: 'IconCreativeCommonsSa',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
@@ -190,6 +194,7 @@ export const buildNoteStandardFlatFieldMetadatas = ({
label: 'Updated by',
description: 'The workspace member who last updated the record',
icon: 'IconUserCircle',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
@@ -238,7 +243,6 @@ export const buildNoteStandardFlatFieldMetadatas = ({
label: 'Relations',
description: 'Note targets',
icon: 'IconArrowUpRight',
isSystem: true,
isNullable: true,
targetObjectName: 'noteTarget',
targetFieldName: 'note',
@@ -261,7 +265,6 @@ export const buildNoteStandardFlatFieldMetadatas = ({
label: 'Attachments',
description: 'Note attachments',
icon: 'IconFileImport',
isSystem: true,
isNullable: true,
targetObjectName: 'attachment',
targetFieldName: 'targetNote',
@@ -284,7 +287,6 @@ export const buildNoteStandardFlatFieldMetadatas = ({
label: 'Timeline Activities',
description: 'Timeline Activities linked to the note.',
icon: 'IconTimelineEvent',
isSystem: true,
isNullable: true,
targetObjectName: 'timelineActivity',
targetFieldName: 'targetNote',
@@ -307,7 +309,6 @@ export const buildNoteStandardFlatFieldMetadatas = ({
label: 'Favorites',
description: 'Favorites linked to the note',
icon: 'IconHeart',
isSystem: true,
isNullable: false,
targetObjectName: 'favorite',
targetFieldName: 'note',
@@ -54,6 +54,7 @@ export const buildNoteTargetStandardFlatFieldMetadatas = ({
label: 'Creation date',
description: 'Creation date',
icon: 'IconCalendar',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -75,6 +76,7 @@ export const buildNoteTargetStandardFlatFieldMetadatas = ({
label: 'Last update',
description: 'Last time the record was changed',
icon: 'IconCalendarClock',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -96,6 +98,7 @@ export const buildNoteTargetStandardFlatFieldMetadatas = ({
label: 'Deleted at',
description: 'Date when the record was deleted',
icon: 'IconCalendarMinus',
isSystem: true,
isNullable: true,
isUIReadOnly: true,
settings: {
@@ -107,6 +110,87 @@ export const buildNoteTargetStandardFlatFieldMetadatas = ({
twentyStandardApplicationId,
now,
}),
createdBy: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'createdBy',
type: FieldMetadataType.ACTOR,
label: 'Created by',
description: 'The creator of the record',
icon: 'IconCreativeCommonsSa',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
source: "'MANUAL'",
name: "'System'",
workspaceMemberId: null,
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
updatedBy: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'updatedBy',
type: FieldMetadataType.ACTOR,
label: 'Updated by',
description: 'The workspace member who last updated the record',
icon: 'IconUserCircle',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
source: "'MANUAL'",
name: "'System'",
workspaceMemberId: null,
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
position: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'position',
type: FieldMetadataType.POSITION,
label: 'Position',
description: 'NoteTarget record position',
icon: 'IconHierarchy2',
isSystem: true,
isNullable: false,
defaultValue: 0,
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
searchVector: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'searchVector',
type: FieldMetadataType.TS_VECTOR,
label: 'Search vector',
description: 'Field used for full-text search',
icon: 'IconUser',
isSystem: true,
isNullable: true,
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
// Relation fields
note: createStandardRelationFieldFlatMetadata({
@@ -55,6 +55,7 @@ export const buildOpportunityStandardFlatFieldMetadatas = ({
label: 'Creation date',
description: 'Creation date',
icon: 'IconCalendar',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -76,6 +77,7 @@ export const buildOpportunityStandardFlatFieldMetadatas = ({
label: 'Last update',
description: 'Last time the record was changed',
icon: 'IconCalendarClock',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -97,6 +99,7 @@ export const buildOpportunityStandardFlatFieldMetadatas = ({
label: 'Deleted at',
description: 'Date when the record was deleted',
icon: 'IconCalendarMinus',
isSystem: true,
isNullable: true,
isUIReadOnly: true,
settings: {
@@ -219,6 +222,7 @@ export const buildOpportunityStandardFlatFieldMetadatas = ({
label: 'Created by',
description: 'The creator of the record',
icon: 'IconCreativeCommonsSa',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
@@ -241,6 +245,7 @@ export const buildOpportunityStandardFlatFieldMetadatas = ({
label: 'Updated by',
description: 'The workspace member who last updated the record',
icon: 'IconUserCircle',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
@@ -337,7 +342,6 @@ export const buildOpportunityStandardFlatFieldMetadatas = ({
label: 'Favorites',
description: 'Favorites linked to the opportunity',
icon: 'IconHeart',
isSystem: true,
isNullable: true,
targetObjectName: 'favorite',
targetFieldName: 'opportunity',
@@ -406,7 +410,6 @@ export const buildOpportunityStandardFlatFieldMetadatas = ({
label: 'Attachments',
description: 'Attachments linked to the opportunity',
icon: 'IconFileImport',
isSystem: true,
isNullable: true,
targetObjectName: 'attachment',
targetFieldName: 'targetOpportunity',
@@ -429,7 +432,6 @@ export const buildOpportunityStandardFlatFieldMetadatas = ({
label: 'Timeline Activities',
description: 'Timeline Activities linked to the opportunity.',
icon: 'IconTimelineEvent',
isSystem: true,
isNullable: true,
targetObjectName: 'timelineActivity',
targetFieldName: 'targetOpportunity',
@@ -55,6 +55,7 @@ export const buildPersonStandardFlatFieldMetadatas = ({
label: 'Creation date',
description: 'Creation date',
icon: 'IconCalendar',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -76,6 +77,7 @@ export const buildPersonStandardFlatFieldMetadatas = ({
label: 'Last update',
description: 'Last time the record was changed',
icon: 'IconCalendarClock',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -97,6 +99,7 @@ export const buildPersonStandardFlatFieldMetadatas = ({
label: 'Deleted at',
description: 'Date when the record was deleted',
icon: 'IconCalendarMinus',
isSystem: true,
isNullable: true,
isUIReadOnly: true,
settings: {
@@ -294,6 +297,7 @@ export const buildPersonStandardFlatFieldMetadatas = ({
label: 'Created by',
description: 'The creator of the record',
icon: 'IconCreativeCommonsSa',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
@@ -316,6 +320,7 @@ export const buildPersonStandardFlatFieldMetadatas = ({
label: 'Updated by',
description: 'The workspace member who last updated the record',
icon: 'IconUserCircle',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
@@ -434,7 +439,6 @@ export const buildPersonStandardFlatFieldMetadatas = ({
label: 'Favorites',
description: 'Favorites linked to the contact',
icon: 'IconHeart',
isSystem: true,
isNullable: true,
targetObjectName: 'favorite',
targetFieldName: 'person',
@@ -457,7 +461,6 @@ export const buildPersonStandardFlatFieldMetadatas = ({
label: 'Attachments',
description: 'Attachments linked to the contact.',
icon: 'IconFileImport',
isSystem: true,
isNullable: true,
targetObjectName: 'attachment',
targetFieldName: 'targetPerson',
@@ -480,7 +483,6 @@ export const buildPersonStandardFlatFieldMetadatas = ({
label: 'Message Participants',
description: 'Message Participants',
icon: 'IconUserCircle',
isSystem: true,
isNullable: true,
targetObjectName: 'messageParticipant',
targetFieldName: 'person',
@@ -503,7 +505,6 @@ export const buildPersonStandardFlatFieldMetadatas = ({
label: 'Calendar Event Participants',
description: 'Calendar Event Participants',
icon: 'IconCalendar',
isSystem: true,
isNullable: true,
targetObjectName: 'calendarEventParticipant',
targetFieldName: 'person',
@@ -526,7 +527,6 @@ export const buildPersonStandardFlatFieldMetadatas = ({
label: 'Events',
description: 'Events linked to the person',
icon: 'IconTimelineEvent',
isSystem: true,
isNullable: true,
targetObjectName: 'timelineActivity',
targetFieldName: 'targetPerson',
@@ -55,6 +55,7 @@ export const buildTaskStandardFlatFieldMetadatas = ({
label: 'Creation date',
description: 'Creation date',
icon: 'IconCalendar',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -76,6 +77,7 @@ export const buildTaskStandardFlatFieldMetadatas = ({
label: 'Last update',
description: 'Last time the record was changed',
icon: 'IconCalendarClock',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -97,6 +99,7 @@ export const buildTaskStandardFlatFieldMetadatas = ({
label: 'Deleted at',
description: 'Date when the record was deleted',
icon: 'IconCalendarMinus',
isSystem: true,
isNullable: true,
isUIReadOnly: true,
settings: {
@@ -212,6 +215,7 @@ export const buildTaskStandardFlatFieldMetadatas = ({
label: 'Created by',
description: 'The creator of the record',
icon: 'IconCreativeCommonsSa',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
@@ -234,6 +238,7 @@ export const buildTaskStandardFlatFieldMetadatas = ({
label: 'Updated by',
description: 'The workspace member who last updated the record',
icon: 'IconUserCircle',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
@@ -282,7 +287,6 @@ export const buildTaskStandardFlatFieldMetadatas = ({
label: 'Relations',
description: 'Task targets',
icon: 'IconArrowUpRight',
isSystem: true,
isNullable: true,
targetObjectName: 'taskTarget',
targetFieldName: 'task',
@@ -305,7 +309,6 @@ export const buildTaskStandardFlatFieldMetadatas = ({
label: 'Attachments',
description: 'Task attachments',
icon: 'IconFileImport',
isSystem: true,
isNullable: true,
targetObjectName: 'attachment',
targetFieldName: 'targetTask',
@@ -352,7 +355,6 @@ export const buildTaskStandardFlatFieldMetadatas = ({
label: 'Timeline Activities',
description: 'Timeline Activities linked to the task.',
icon: 'IconTimelineEvent',
isSystem: true,
isNullable: true,
targetObjectName: 'timelineActivity',
targetFieldName: 'targetTask',
@@ -375,7 +377,6 @@ export const buildTaskStandardFlatFieldMetadatas = ({
label: 'Favorites',
description: 'Favorites linked to the task',
icon: 'IconHeart',
isSystem: true,
isNullable: false,
targetObjectName: 'favorite',
targetFieldName: 'task',
@@ -54,6 +54,7 @@ export const buildTaskTargetStandardFlatFieldMetadatas = ({
label: 'Creation date',
description: 'Creation date',
icon: 'IconCalendar',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -75,6 +76,7 @@ export const buildTaskTargetStandardFlatFieldMetadatas = ({
label: 'Last update',
description: 'Last time the record was changed',
icon: 'IconCalendarClock',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -96,6 +98,7 @@ export const buildTaskTargetStandardFlatFieldMetadatas = ({
label: 'Deleted at',
description: 'Date when the record was deleted',
icon: 'IconCalendarMinus',
isSystem: true,
isNullable: true,
isUIReadOnly: true,
settings: {
@@ -107,6 +110,87 @@ export const buildTaskTargetStandardFlatFieldMetadatas = ({
twentyStandardApplicationId,
now,
}),
createdBy: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'createdBy',
type: FieldMetadataType.ACTOR,
label: 'Created by',
description: 'The creator of the record',
icon: 'IconCreativeCommonsSa',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
source: "'MANUAL'",
name: "'System'",
workspaceMemberId: null,
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
updatedBy: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'updatedBy',
type: FieldMetadataType.ACTOR,
label: 'Updated by',
description: 'The workspace member who last updated the record',
icon: 'IconUserCircle',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
source: "'MANUAL'",
name: "'System'",
workspaceMemberId: null,
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
position: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'position',
type: FieldMetadataType.POSITION,
label: 'Position',
description: 'TaskTarget record position',
icon: 'IconHierarchy2',
isSystem: true,
isNullable: false,
defaultValue: 0,
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
searchVector: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'searchVector',
type: FieldMetadataType.TS_VECTOR,
label: 'Search vector',
description: 'Field used for full-text search',
icon: 'IconUser',
isSystem: true,
isNullable: true,
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
// Relation fields
task: createStandardRelationFieldFlatMetadata({
@@ -1,10 +1,10 @@
import { STANDARD_OBJECTS } from 'twenty-shared/metadata';
import {
DateDisplayFormat,
FieldMetadataType,
RelationOnDeleteAction,
RelationType,
} from 'twenty-shared/types';
import { STANDARD_OBJECTS } from 'twenty-shared/metadata';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { type AllStandardObjectFieldName } from 'src/engine/workspace-manager/twenty-standard-application/types/all-standard-object-field-name.type';
@@ -13,6 +13,8 @@ import {
type CreateStandardFieldArgs,
} from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util';
import { createStandardRelationFieldFlatMetadata } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-relation-field-flat-metadata.util';
import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/utils/get-ts-vector-column-expression.util';
import { SEARCH_FIELDS_FOR_TIMELINE_ACTIVITY } from 'src/modules/timeline/standard-objects/timeline-activity.workspace-entity';
export const buildTimelineActivityStandardFlatFieldMetadatas = ({
now,
@@ -57,6 +59,7 @@ export const buildTimelineActivityStandardFlatFieldMetadatas = ({
label: 'Creation date',
description: 'Creation date',
icon: 'IconCalendar',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -76,6 +79,7 @@ export const buildTimelineActivityStandardFlatFieldMetadatas = ({
label: 'Last update',
description: 'Last time the record was changed',
icon: 'IconCalendarClock',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -95,6 +99,7 @@ export const buildTimelineActivityStandardFlatFieldMetadatas = ({
label: 'Deleted at',
description: 'Date when the record was deleted',
icon: 'IconCalendarMinus',
isSystem: true,
isNullable: true,
isUIReadOnly: true,
settings: { displayFormat: DateDisplayFormat.RELATIVE },
@@ -104,7 +109,70 @@ export const buildTimelineActivityStandardFlatFieldMetadatas = ({
twentyStandardApplicationId,
now,
}),
createdBy: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'createdBy',
type: FieldMetadataType.ACTOR,
label: 'Created by',
description: 'The creator of the record',
icon: 'IconCreativeCommonsSa',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
source: "'MANUAL'",
name: "'System'",
workspaceMemberId: null,
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
updatedBy: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'updatedBy',
type: FieldMetadataType.ACTOR,
label: 'Updated by',
description: 'The workspace member who last updated the record',
icon: 'IconUserCircle',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
source: "'MANUAL'",
name: "'System'",
workspaceMemberId: null,
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
position: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'position',
type: FieldMetadataType.POSITION,
label: 'Position',
description: 'Timeline activity record position',
icon: 'IconHierarchy2',
isSystem: true,
isNullable: false,
defaultValue: 0,
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
// TimelineActivity-specific fields
happensAt: createStandardFieldFlatMetadata({
objectName,
@@ -464,4 +532,27 @@ export const buildTimelineActivityStandardFlatFieldMetadatas = ({
twentyStandardApplicationId,
now,
}),
searchVector: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'searchVector',
type: FieldMetadataType.TS_VECTOR,
label: 'Search vector',
description: 'Field used for full-text search',
icon: 'IconUser',
isSystem: true,
isNullable: true,
settings: {
generatedType: 'STORED',
asExpression: getTsVectorColumnExpressionFromFields(
SEARCH_FIELDS_FOR_TIMELINE_ACTIVITY,
),
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
});
@@ -55,6 +55,7 @@ export const buildWorkflowAutomatedTriggerStandardFlatFieldMetadatas = ({
label: 'Creation date',
description: 'Creation date',
icon: 'IconCalendar',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -74,6 +75,7 @@ export const buildWorkflowAutomatedTriggerStandardFlatFieldMetadatas = ({
label: 'Last update',
description: 'Last time the record was changed',
icon: 'IconCalendarClock',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -93,6 +95,7 @@ export const buildWorkflowAutomatedTriggerStandardFlatFieldMetadatas = ({
label: 'Deleted at',
description: 'Date when the record was deleted',
icon: 'IconCalendarMinus',
isSystem: true,
isNullable: true,
isUIReadOnly: true,
settings: { displayFormat: DateDisplayFormat.RELATIVE },
@@ -102,6 +105,87 @@ export const buildWorkflowAutomatedTriggerStandardFlatFieldMetadatas = ({
twentyStandardApplicationId,
now,
}),
createdBy: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'createdBy',
type: FieldMetadataType.ACTOR,
label: 'Created by',
description: 'The creator of the record',
icon: 'IconCreativeCommonsSa',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
source: "'MANUAL'",
name: "'System'",
workspaceMemberId: null,
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
updatedBy: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'updatedBy',
type: FieldMetadataType.ACTOR,
label: 'Updated by',
description: 'The workspace member who last updated the record',
icon: 'IconUserCircle',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
source: "'MANUAL'",
name: "'System'",
workspaceMemberId: null,
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
position: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'position',
type: FieldMetadataType.POSITION,
label: 'Position',
description: 'WorkflowAutomatedTrigger record position',
icon: 'IconHierarchy2',
isSystem: true,
isNullable: false,
defaultValue: 0,
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
searchVector: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'searchVector',
type: FieldMetadataType.TS_VECTOR,
label: 'Search vector',
description: 'Field used for full-text search',
icon: 'IconUser',
isSystem: true,
isNullable: true,
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
type: createStandardFieldFlatMetadata({
objectName,
workspaceId,
@@ -113,6 +197,7 @@ export const buildWorkflowAutomatedTriggerStandardFlatFieldMetadatas = ({
icon: 'IconSettingsAutomation',
isNullable: false,
isUIReadOnly: true,
defaultValue: "'DATABASE_EVENT'",
options: [
{
value: 'DATABASE_EVENT',
@@ -54,6 +54,7 @@ export const buildWorkflowRunStandardFlatFieldMetadatas = ({
label: 'Creation date',
description: 'Creation date',
icon: 'IconCalendar',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -73,6 +74,7 @@ export const buildWorkflowRunStandardFlatFieldMetadatas = ({
label: 'Last update',
description: 'Last time the record was changed',
icon: 'IconCalendarClock',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -92,6 +94,7 @@ export const buildWorkflowRunStandardFlatFieldMetadatas = ({
label: 'Deleted at',
description: 'Date when the record was deleted',
icon: 'IconCalendarMinus',
isSystem: true,
isNullable: true,
isUIReadOnly: true,
settings: { displayFormat: DateDisplayFormat.RELATIVE },
@@ -210,6 +213,7 @@ export const buildWorkflowRunStandardFlatFieldMetadatas = ({
label: 'Executed by',
description: 'The executor of the workflow',
icon: 'IconCreativeCommonsSa',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: {
@@ -232,6 +236,7 @@ export const buildWorkflowRunStandardFlatFieldMetadatas = ({
label: 'Updated by',
description: 'The workspace member who last updated the record',
icon: 'IconUserCircle',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
@@ -399,7 +404,6 @@ export const buildWorkflowRunStandardFlatFieldMetadatas = ({
label: 'Favorites',
description: 'Favorites linked to the workflow run',
icon: 'IconHeart',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
targetObjectName: 'favorite',
@@ -423,7 +427,6 @@ export const buildWorkflowRunStandardFlatFieldMetadatas = ({
label: 'Timeline Activities',
description: 'Timeline activities linked to the run',
icon: 'IconTimelineEvent',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
targetObjectName: 'timelineActivity',
@@ -53,6 +53,7 @@ export const buildWorkflowStandardFlatFieldMetadatas = ({
label: 'Creation date',
description: 'Creation date',
icon: 'IconCalendar',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -72,6 +73,7 @@ export const buildWorkflowStandardFlatFieldMetadatas = ({
label: 'Last update',
description: 'Last time the record was changed',
icon: 'IconCalendarClock',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -91,6 +93,7 @@ export const buildWorkflowStandardFlatFieldMetadatas = ({
label: 'Deleted at',
description: 'Date when the record was deleted',
icon: 'IconCalendarMinus',
isSystem: true,
isNullable: true,
isUIReadOnly: true,
settings: { displayFormat: DateDisplayFormat.RELATIVE },
@@ -187,6 +190,7 @@ export const buildWorkflowStandardFlatFieldMetadatas = ({
label: 'Created by',
description: 'The creator of the record',
icon: 'IconCreativeCommonsSa',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
@@ -209,6 +213,7 @@ export const buildWorkflowStandardFlatFieldMetadatas = ({
label: 'Updated by',
description: 'The workspace member who last updated the record',
icon: 'IconUserCircle',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
@@ -301,7 +306,6 @@ export const buildWorkflowStandardFlatFieldMetadatas = ({
label: 'Automated Triggers',
description: 'Workflow automated triggers linked to the workflow.',
icon: 'IconSettingsAutomation',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
targetObjectName: 'workflowAutomatedTrigger',
@@ -325,7 +329,6 @@ export const buildWorkflowStandardFlatFieldMetadatas = ({
label: 'Favorites',
description: 'Favorites linked to the workflow',
icon: 'IconHeart',
isSystem: true,
isNullable: false,
targetObjectName: 'favorite',
targetFieldName: 'workflow',
@@ -348,7 +351,6 @@ export const buildWorkflowStandardFlatFieldMetadatas = ({
label: 'Timeline Activities',
description: 'Timeline activities linked to the workflow',
icon: 'IconTimelineEvent',
isSystem: true,
isNullable: false,
targetObjectName: 'timelineActivity',
targetFieldName: 'targetWorkflow',
@@ -371,7 +373,6 @@ export const buildWorkflowStandardFlatFieldMetadatas = ({
label: 'Attachments',
description: 'Attachments linked to the workflow',
icon: 'IconFileUpload',
isSystem: true,
isNullable: false,
targetObjectName: 'attachment',
targetFieldName: 'targetWorkflow',
@@ -57,6 +57,7 @@ export const buildWorkflowVersionStandardFlatFieldMetadatas = ({
label: 'Creation date',
description: 'Creation date',
icon: 'IconCalendar',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -76,6 +77,7 @@ export const buildWorkflowVersionStandardFlatFieldMetadatas = ({
label: 'Last update',
description: 'Last time the record was changed',
icon: 'IconCalendarClock',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -95,6 +97,7 @@ export const buildWorkflowVersionStandardFlatFieldMetadatas = ({
label: 'Deleted at',
description: 'Date when the record was deleted',
icon: 'IconCalendarMinus',
isSystem: true,
isNullable: true,
isUIReadOnly: true,
settings: { displayFormat: DateDisplayFormat.RELATIVE },
@@ -104,6 +107,52 @@ export const buildWorkflowVersionStandardFlatFieldMetadatas = ({
twentyStandardApplicationId,
now,
}),
createdBy: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'createdBy',
type: FieldMetadataType.ACTOR,
label: 'Created by',
description: 'The creator of the record',
icon: 'IconCreativeCommonsSa',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
source: "'MANUAL'",
name: "'System'",
workspaceMemberId: null,
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
updatedBy: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'updatedBy',
type: FieldMetadataType.ACTOR,
label: 'Updated by',
description: 'The workspace member who last updated the record',
icon: 'IconUserCircle',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
source: "'MANUAL'",
name: "'System'",
workspaceMemberId: null,
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
name: createStandardFieldFlatMetadata({
objectName,
workspaceId,
@@ -285,7 +334,6 @@ export const buildWorkflowVersionStandardFlatFieldMetadatas = ({
label: 'Favorites',
description: 'Favorites linked to the workflow version',
icon: 'IconHeart',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
targetObjectName: 'favorite',
@@ -309,7 +357,6 @@ export const buildWorkflowVersionStandardFlatFieldMetadatas = ({
label: 'Timeline Activities',
description: 'Timeline activities linked to the version',
icon: 'IconTimelineEvent',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
targetObjectName: 'timelineActivity',
@@ -60,6 +60,7 @@ export const buildWorkspaceMemberStandardFlatFieldMetadatas = ({
label: 'Creation date',
description: 'Creation date',
icon: 'IconCalendar',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -79,6 +80,7 @@ export const buildWorkspaceMemberStandardFlatFieldMetadatas = ({
label: 'Last update',
description: 'Last time the record was changed',
icon: 'IconCalendarClock',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
defaultValue: 'now',
@@ -98,6 +100,7 @@ export const buildWorkspaceMemberStandardFlatFieldMetadatas = ({
label: 'Deleted at',
description: 'Date when the record was deleted',
icon: 'IconCalendarMinus',
isSystem: true,
isNullable: true,
isUIReadOnly: true,
settings: { displayFormat: DateDisplayFormat.RELATIVE },
@@ -444,7 +447,6 @@ export const buildWorkspaceMemberStandardFlatFieldMetadatas = ({
label: 'Favorites',
description: 'Favorites linked to the workspace member',
icon: 'IconHeart',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
targetObjectName: 'favorite',
@@ -468,7 +470,6 @@ export const buildWorkspaceMemberStandardFlatFieldMetadatas = ({
label: 'Account Owner For Companies',
description: 'Account owner for companies',
icon: 'IconBriefcase',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
targetObjectName: 'company',
@@ -492,7 +493,6 @@ export const buildWorkspaceMemberStandardFlatFieldMetadatas = ({
label: 'Connected accounts',
description: 'Connected accounts',
icon: 'IconAt',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
targetObjectName: 'connectedAccount',
@@ -516,7 +516,6 @@ export const buildWorkspaceMemberStandardFlatFieldMetadatas = ({
label: 'Message Participants',
description: 'Message Participants',
icon: 'IconUserCircle',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
targetObjectName: 'messageParticipant',
@@ -540,7 +539,6 @@ export const buildWorkspaceMemberStandardFlatFieldMetadatas = ({
label: 'Blocklist',
description: 'Blocklisted handles',
icon: 'IconForbid2',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
targetObjectName: 'blocklist',
@@ -564,7 +562,6 @@ export const buildWorkspaceMemberStandardFlatFieldMetadatas = ({
label: 'Calendar Event Participants',
description: 'Calendar Event Participants',
icon: 'IconCalendar',
isSystem: true,
isNullable: false,
isUIReadOnly: true,
targetObjectName: 'calendarEventParticipant',
@@ -588,7 +585,6 @@ export const buildWorkspaceMemberStandardFlatFieldMetadatas = ({
label: 'Events',
description: 'Events linked to the workspace member',
icon: 'IconTimelineEvent',
isSystem: true,
isNullable: true,
isUIReadOnly: true,
targetObjectName: 'timelineActivity',
@@ -625,4 +621,50 @@ export const buildWorkspaceMemberStandardFlatFieldMetadatas = ({
twentyStandardApplicationId,
now,
}),
createdBy: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'createdBy',
type: FieldMetadataType.ACTOR,
label: 'Created by',
description: 'The creator of the record',
icon: 'IconCreativeCommonsSa',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
source: "'MANUAL'",
name: "'System'",
workspaceMemberId: null,
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
updatedBy: createStandardFieldFlatMetadata({
objectName,
workspaceId,
context: {
fieldName: 'updatedBy',
type: FieldMetadataType.ACTOR,
label: 'Updated by',
description: 'The workspace member who last updated the record',
icon: 'IconUserCircle',
isSystem: true,
isUIReadOnly: true,
isNullable: false,
defaultValue: {
source: "'MANUAL'",
name: "'System'",
workspaceMemberId: null,
},
},
standardObjectMetadataRelatedEntityIds,
dependencyFlatEntityMaps,
twentyStandardApplicationId,
now,
}),
});
@@ -33,7 +33,6 @@ export type CreateStandardMorphOrRelationFieldContext<
icon: string;
targetObjectName: T;
targetFieldName: AllStandardObjectFieldName<T>;
isSystem?: boolean;
isNullable?: boolean;
isUIReadOnly?: boolean;
defaultValue?: FieldMetadataDefaultValueForAnyType;
@@ -63,7 +62,6 @@ export const createStandardRelationFieldFlatMetadata = <
icon,
targetObjectName,
targetFieldName,
isSystem = false,
isNullable = true,
isUIReadOnly = false,
defaultValue = null,
@@ -100,7 +98,7 @@ export const createStandardRelationFieldFlatMetadata = <
icon,
isCustom: false,
isActive: true,
isSystem,
isSystem: false,
isNullable,
isUnique: false,
isUIReadOnly,
@@ -14,6 +14,7 @@ import {
} from 'src/engine/workspace-manager/workspace-migration/types/workspace-migration-orchestrator.type';
import { AllUniversalFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/all-universal-flat-entity-maps.type';
import { aggregateOrchestratorActionsReport } from 'src/engine/workspace-manager/workspace-migration/utils/aggregate-orchestrator-actions-report.util';
import { crossEntityTransversalValidation } from 'src/engine/workspace-manager/workspace-migration/utils/cross-entity-transversal-validation.util';
import { WorkspaceMigrationAgentActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/agent/workspace-migration-agent-actions-builder.service';
import { WorkspaceMigrationCommandMenuItemActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/command-menu-item/workspace-migration-command-menu-item-actions-builder.service';
import { WorkspaceMigrationFieldActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/field/workspace-migration-field-actions-builder.service';
@@ -126,7 +127,6 @@ export class WorkspaceMigrationBuildOrchestratorService {
fromToAllFlatEntityMaps,
dependencyAllFlatEntityMaps,
additionalCacheDataMaps,
applicationUniversalIdentifier,
}: WorkspaceMigrationOrchestratorBuildArgs): Promise<
| WorkspaceMigrationOrchestratorFailedResult
| WorkspaceMigrationOrchestratorSuccessfulResult
@@ -994,6 +994,13 @@ export class WorkspaceMigrationBuildOrchestratorService {
}
}
const { objectMetadata } = crossEntityTransversalValidation({
optimisticUniversalFlatMaps: optimisticAllFlatEntityMaps,
orchestratorActionsReport,
});
orchestratorFailureReport.objectMetadata.push(...objectMetadata);
const allErrors = Object.values(orchestratorFailureReport);
if (allErrors.some((report) => report.length > 0)) {
@@ -1013,7 +1020,8 @@ export class WorkspaceMigrationBuildOrchestratorService {
return {
status: 'success',
workspaceMigration: {
applicationUniversalIdentifier,
applicationUniversalIdentifier:
buildOptions.applicationUniversalIdentifier,
actions: [
// Object and fields and indexes
...aggregatedOrchestratorActionsReport.index.delete,
@@ -292,10 +292,10 @@ export class WorkspaceMigrationValidateBuildAndRunService {
});
return await this.validateBuildAndRunWorkspaceMigrationFromTo({
applicationUniversalIdentifier,
buildOptions: {
isSystemBuild,
inferDeletionFromMissingEntities,
applicationUniversalIdentifier,
},
fromToAllFlatEntityMaps,
workspaceId,
@@ -23,7 +23,6 @@ export type WorkspaceMigrationOrchestratorBuildArgs = {
fromToAllFlatEntityMaps: FromToAllUniversalFlatEntityMaps;
dependencyAllFlatEntityMaps?: Partial<AllUniversalFlatEntityMaps>;
additionalCacheDataMaps: WorkspaceMigrationBuilderAdditionalCacheDataMaps;
applicationUniversalIdentifier: string;
};
export type OrchestratorFailureReport = {
@@ -40,6 +40,7 @@ describe('flatEntityDeletedCreatedUpdatedMatrixDispatcher', () => {
buildOptions: {
inferDeletionFromMissingEntities: { fieldMetadata: false },
isSystemBuild: false,
applicationUniversalIdentifier: 'application-universal-identifier-1',
},
},
},
@@ -67,6 +68,7 @@ describe('flatEntityDeletedCreatedUpdatedMatrixDispatcher', () => {
buildOptions: {
inferDeletionFromMissingEntities: { fieldMetadata: true },
isSystemBuild: false,
applicationUniversalIdentifier: 'application-universal-identifier-1',
},
},
},
@@ -111,6 +113,7 @@ describe('flatEntityDeletedCreatedUpdatedMatrixDispatcher', () => {
buildOptions: {
inferDeletionFromMissingEntities: { fieldMetadata: false },
isSystemBuild: false,
applicationUniversalIdentifier: 'application-universal-identifier-1',
},
},
},
@@ -183,6 +186,7 @@ describe('flatEntityDeletedCreatedUpdatedMatrixDispatcher', () => {
buildOptions: {
inferDeletionFromMissingEntities: { fieldMetadata: true },
isSystemBuild: false,
applicationUniversalIdentifier: 'application-universal-identifier-1',
},
},
},
@@ -211,6 +215,7 @@ describe('flatEntityDeletedCreatedUpdatedMatrixDispatcher', () => {
buildOptions: {
inferDeletionFromMissingEntities: { fieldMetadata: false },
isSystemBuild: false,
applicationUniversalIdentifier: 'application-universal-identifier-1',
},
},
},
@@ -28,6 +28,7 @@ export const compareTwoFlatEntity = <T extends AllMetadataName>({
[fromUniversalFlatEntity, toUniversalFlatEntity].map(
(universalFlatEntity) =>
transformUniversalFlatEntityForComparison({
metadataName,
universalFlatEntity,
propertiesToCompare,
propertiesToStringify,
@@ -8,10 +8,12 @@ import { type MetadataUniversalFlatEntityPropertiesToStringify } from 'src/engin
export function transformUniversalFlatEntityForComparison<
T extends AllMetadataName,
>({
metadataName,
universalFlatEntity,
propertiesToCompare,
propertiesToStringify,
}: {
metadataName: T;
universalFlatEntity: MetadataUniversalFlatEntity<T>;
propertiesToCompare: MetadataUniversalFlatEntityPropertiesToCompare<T>[];
propertiesToStringify: MetadataUniversalFlatEntityPropertiesToStringify<T>[];
@@ -20,6 +22,18 @@ export function transformUniversalFlatEntityForComparison<
(flatEntityAccumulator, propertyToCompare) => {
const currentValue = universalFlatEntity[propertyToCompare];
// TODO remove once https://github.com/twentyhq/core-team-issues/issues/2227 has been resolved
if (
metadataName === 'index' &&
propertyToCompare === 'universalFlatIndexFieldMetadatas' &&
Array.isArray(currentValue)
) {
for (const item of currentValue) {
delete item['createdAt'];
delete item['updatedAt'];
}
}
if (
propertiesToStringify.includes(
propertyToCompare as string as MetadataUniversalFlatEntityPropertiesToStringify<T>,
@@ -0,0 +1,21 @@
import { validateObjectMetadataSystemFieldsIntegrity } from 'src/engine/metadata-modules/flat-object-metadata/validators/utils/validate-object-metadata-system-fields-integrity';
import {
type OrchestratorActionsReport,
type OrchestratorFailureReport,
} from 'src/engine/workspace-manager/workspace-migration/types/workspace-migration-orchestrator.type';
import { type AllUniversalFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/all-universal-flat-entity-maps.type';
export const crossEntityTransversalValidation = ({
optimisticUniversalFlatMaps,
orchestratorActionsReport,
}: {
optimisticUniversalFlatMaps: AllUniversalFlatEntityMaps;
orchestratorActionsReport: OrchestratorActionsReport;
}): Pick<OrchestratorFailureReport, 'objectMetadata'> => {
const { objectMetadata } = validateObjectMetadataSystemFieldsIntegrity({
optimisticUniversalFlatMaps,
orchestratorActionsReport,
});
return { objectMetadata };
};
@@ -3,4 +3,5 @@ import { type InferDeletionFromMissingEntities } from 'src/engine/workspace-mana
export type WorkspaceMigrationBuilderOptions = {
inferDeletionFromMissingEntities?: InferDeletionFromMissingEntities;
isSystemBuild: boolean;
applicationUniversalIdentifier: string;
};
@@ -0,0 +1,40 @@
import { isDefined } from 'twenty-shared/utils';
import { findManyFlatEntityByUniversalIdentifierInUniversalFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-universal-identifier-in-universal-flat-entity-maps-or-throw.util';
import { isMorphOrRelationUniversalFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util';
import { type AllUniversalFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/all-universal-flat-entity-maps.type';
import { type UniversalFlatObjectMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-object-metadata.type';
export const buildUniversalFlatObjectFieldByNameAndJoinColumnMaps = ({
flatFieldMetadataMaps,
flatObjectMetadata,
}: {
flatFieldMetadataMaps: AllUniversalFlatEntityMaps['flatFieldMetadataMaps'];
flatObjectMetadata: UniversalFlatObjectMetadata;
}) => {
const fieldUniversalIdentifierByName: Record<string, string> = {};
const fieldUniversalIdentifierByJoinColumnName: Record<string, string> = {};
const objectFields =
findManyFlatEntityByUniversalIdentifierInUniversalFlatEntityMapsOrThrow({
universalIdentifiers: flatObjectMetadata.fieldUniversalIdentifiers,
flatEntityMaps: flatFieldMetadataMaps,
});
for (const field of objectFields) {
fieldUniversalIdentifierByName[field.name] = field.universalIdentifier;
if (isMorphOrRelationUniversalFlatFieldMetadata(field)) {
if (isDefined(field.universalSettings.joinColumnName)) {
fieldUniversalIdentifierByJoinColumnName[
field.universalSettings.joinColumnName
] = field.universalIdentifier;
}
}
}
return {
fieldUniversalIdentifierByName,
fieldUniversalIdentifierByJoinColumnName,
};
};
@@ -8,6 +8,7 @@ import { AgentExceptionCode } from 'src/engine/metadata-modules/ai/ai-agent/agen
import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util';
import { type UniversalFlatAgent } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-agent.type';
import { belongsToTwentyStandardApp } from 'src/engine/metadata-modules/utils/belongs-to-twenty-standard-app.util';
import { isCallerTwentyStandardApp } from 'src/engine/metadata-modules/utils/is-caller-twenty-standard-app.util';
import { type FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/types/failed-flat-entity-validation.type';
import { getEmptyFlatEntityValidationError } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/utils/get-flat-entity-validation-error.util';
import { type FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type';
@@ -97,7 +98,7 @@ export class FlatAgentValidatorService {
}
if (
!buildOptions.isSystemBuild &&
!isCallerTwentyStandardApp(buildOptions) &&
belongsToTwentyStandardApp({
universalIdentifier: existingAgent.universalIdentifier,
applicationUniversalIdentifier:
@@ -148,7 +149,7 @@ export class FlatAgentValidatorService {
}
if (
!buildOptions.isSystemBuild &&
!isCallerTwentyStandardApp(buildOptions) &&
belongsToTwentyStandardApp({
universalIdentifier: fromFlatAgent.universalIdentifier,
applicationUniversalIdentifier:
@@ -14,7 +14,7 @@ import { isFlatFieldMetadataNameSyncedWithLabel } from 'src/engine/metadata-modu
import { isMorphOrRelationUniversalFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util';
import { validateFlatFieldMetadataNameAvailability } from 'src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-flat-field-metadata-name-availability.util';
import { validateFlatFieldMetadataName } from 'src/engine/metadata-modules/flat-field-metadata/validators/utils/validate-flat-field-metadata-name.util';
import { belongsToTwentyStandardApp } from 'src/engine/metadata-modules/utils/belongs-to-twenty-standard-app.util';
import { UniversalFlatFieldMetadata } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-field-metadata.type';
import { FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/types/failed-flat-entity-validation.type';
import { getEmptyFlatEntityValidationError } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/utils/get-flat-entity-validation-error.util';
import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type';
@@ -75,6 +75,31 @@ export class FlatFieldMetadataValidatorService {
flatFieldMetadataToValidate.objectMetadataUniversalIdentifier,
};
const SYSTEM_FIELD_ALLOWED_UPDATE_PROPERTIES = [
'universalSettings',
'isActive',
] as const satisfies (keyof UniversalFlatFieldMetadata)[];
if (
!buildOptions.isSystemBuild &&
existingFlatFieldMetadataToUpdate.isSystem
) {
const disallowedProperties = Object.keys(flatEntityUpdate).filter(
(property) =>
!SYSTEM_FIELD_ALLOWED_UPDATE_PROPERTIES.includes(
property as (typeof SYSTEM_FIELD_ALLOWED_UPDATE_PROPERTIES)[number],
),
);
if (disallowedProperties.length > 0) {
validationResult.errors.push({
code: FieldMetadataExceptionCode.FIELD_MUTATION_NOT_ALLOWED,
message: `System fields only allow updating: ${SYSTEM_FIELD_ALLOWED_UPDATE_PROPERTIES.join(', ')}. Forbidden properties: ${disallowedProperties.join(', ')}`,
userFriendlyMessage: msg`System fields cannot be updated`,
});
}
}
const flatObjectMetadata = findFlatEntityByUniversalIdentifier({
universalIdentifier:
flatFieldMetadataToValidate.objectMetadataUniversalIdentifier,
@@ -155,7 +180,7 @@ export class FlatFieldMetadataValidatorService {
flatFieldMetadataToValidate.isLabelSyncedWithName &&
!isFlatFieldMetadataNameSyncedWithLabel({
flatFieldMetadata: flatFieldMetadataToValidate,
isSystemBuild: buildOptions.isSystemBuild,
buildOptions,
})
) {
validationResult.errors.push({
@@ -205,6 +230,7 @@ export class FlatFieldMetadataValidatorService {
flatFieldMetadataMaps: optimisticFlatFieldMetadataMaps,
flatObjectMetadataMaps,
},
buildOptions,
}: UniversalFlatEntityValidationArgs<
typeof ALL_METADATA_NAME.fieldMetadata
>): FailedFlatEntityValidation<'fieldMetadata', 'delete'> {
@@ -244,6 +270,22 @@ export class FlatFieldMetadataValidatorService {
flatEntityMaps: flatObjectMetadataMaps,
});
const parentObjectMetadataHasBeenDeleted = !isDefined(
relatedFlatObjectMetadata,
);
if (
!buildOptions.isSystemBuild &&
flatFieldMetadataToDelete.isSystem &&
!parentObjectMetadataHasBeenDeleted
) {
validationResult.errors.push({
code: FieldMetadataExceptionCode.FIELD_MUTATION_NOT_ALLOWED,
message: 'System fields cannot be deleted',
userFriendlyMessage: msg`System fields cannot be deleted`,
});
}
if (
isDefined(relatedFlatObjectMetadata) &&
relatedFlatObjectMetadata.labelIdentifierFieldMetadataUniversalIdentifier ===
@@ -257,35 +299,6 @@ export class FlatFieldMetadataValidatorService {
});
}
const relationTargetObjectMetadataHasBeenDeleted =
isMorphOrRelationUniversalFlatFieldMetadata(flatFieldMetadataToDelete) &&
!isDefined(
findFlatEntityByUniversalIdentifier({
universalIdentifier:
flatFieldMetadataToDelete.relationTargetObjectMetadataUniversalIdentifier,
flatEntityMaps: flatObjectMetadataMaps,
}),
);
const parentObjectMetadataHasBeenDeleted = !isDefined(
findFlatEntityByUniversalIdentifier({
universalIdentifier:
flatFieldMetadataToDelete.objectMetadataUniversalIdentifier,
flatEntityMaps: flatObjectMetadataMaps,
}),
);
if (
belongsToTwentyStandardApp(flatFieldMetadataToDelete) &&
!relationTargetObjectMetadataHasBeenDeleted &&
!parentObjectMetadataHasBeenDeleted
) {
validationResult.errors.push({
code: FieldMetadataExceptionCode.INVALID_FIELD_INPUT,
message: "Standard Fields can't be deleted",
userFriendlyMessage: msg`Standard fields cannot be deleted`,
});
}
return validationResult;
}
@@ -365,7 +378,7 @@ export class FlatFieldMetadataValidatorService {
flatFieldMetadataToValidate.isLabelSyncedWithName &&
!isFlatFieldMetadataNameSyncedWithLabel({
flatFieldMetadata: flatFieldMetadataToValidate,
isSystemBuild: buildOptions.isSystemBuild,
buildOptions,
})
) {
validationResult.errors.push({
@@ -9,6 +9,7 @@ import { validateFlatObjectMetadataIdentifiers } from 'src/engine/metadata-modul
import { validateFlatObjectMetadataNameAndLabels } from 'src/engine/metadata-modules/flat-object-metadata/validators/utils/validate-flat-object-metadata-name-and-labels.util';
import { ObjectMetadataExceptionCode } from 'src/engine/metadata-modules/object-metadata/object-metadata.exception';
import { belongsToTwentyStandardApp } from 'src/engine/metadata-modules/utils/belongs-to-twenty-standard-app.util';
import { isCallerTwentyStandardApp } from 'src/engine/metadata-modules/utils/is-caller-twenty-standard-app.util';
import { FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/types/failed-flat-entity-validation.type';
import { getEmptyFlatEntityValidationError } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/utils/get-flat-entity-validation-error.util';
import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type';
@@ -61,6 +62,14 @@ export class FlatObjectMetadataValidatorService {
nameSingular: existingFlatObjectMetadata.nameSingular,
};
if (!buildOptions.isSystemBuild && existingFlatObjectMetadata.isSystem) {
validationResult.errors.push({
code: ObjectMetadataExceptionCode.INVALID_OBJECT_INPUT,
message: t`System objects cannot be updated`,
userFriendlyMessage: msg`System objects cannot be updated`,
});
}
validationResult.errors.push(
...validateFlatObjectMetadataNameAndLabels({
optimisticUniversalFlatObjectMetadataMaps:
@@ -139,8 +148,16 @@ export class FlatObjectMetadataValidatorService {
});
}
if (!buildOptions.isSystemBuild && flatObjectMetadataToDelete.isSystem) {
validationResult.errors.push({
code: ObjectMetadataExceptionCode.INVALID_OBJECT_INPUT,
message: t`System objects cannot be deleted`,
userFriendlyMessage: msg`System objects cannot be deleted`,
});
}
if (
!buildOptions.isSystemBuild &&
!isCallerTwentyStandardApp(buildOptions) &&
belongsToTwentyStandardApp(flatObjectMetadataToDelete)
) {
validationResult.errors.push({
@@ -8,6 +8,7 @@ import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules
import { SkillExceptionCode } from 'src/engine/metadata-modules/skill/skill.exception';
import { type UniversalFlatSkill } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-skill.type';
import { belongsToTwentyStandardApp } from 'src/engine/metadata-modules/utils/belongs-to-twenty-standard-app.util';
import { isCallerTwentyStandardApp } from 'src/engine/metadata-modules/utils/is-caller-twenty-standard-app.util';
import { type FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/types/failed-flat-entity-validation.type';
import { getEmptyFlatEntityValidationError } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/utils/get-flat-entity-validation-error.util';
import { type FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/universal-flat-entity-update-validation-args.type';
@@ -90,7 +91,7 @@ export class FlatSkillValidatorService {
}
if (
!buildOptions.isSystemBuild &&
!isCallerTwentyStandardApp(buildOptions) &&
belongsToTwentyStandardApp({
universalIdentifier: existingSkill.universalIdentifier,
applicationUniversalIdentifier:
@@ -153,7 +154,7 @@ export class FlatSkillValidatorService {
});
if (
!buildOptions.isSystemBuild &&
!isCallerTwentyStandardApp(buildOptions) &&
isTwentyStandardSkill &&
hasNonIsActiveUpdates
) {