mirror of
https://github.com/twentyhq/twenty.git
synced 2026-04-19 14:33:21 -04:00
Refactor seed to use twenty-standard application (#16598)
# Introduction In this pull-request we introduce a service dedicated to the twenty-standard app installation, we will later be able to re-use existing logic to be more generic and allow any app installation. For the moment sticking to this usage https://github.com/twentyhq/core-team-issues/issues/1995 ## Encountered issues - We decided not to migrate deprecated fields ( also they will become custom field for any existing workspace having them in the future ) - duplicate criteria - wrong search index declaration - forgotten isSearchable - Attachement seed - Restored standardId ## Note For the moment we're still searching through standardId for code that run on both existing and new workspaces. For code running on new workspace exclusively we're searching using universalIdentifier We will standardize universalIdentifier usage later when we've migratred all the existing workspaces ## Workspace creation Will handle workspace creation the same way in another PR Related https://github.com/twentyhq/twenty/pull/15065 ## TODO - [ ] Double all frontend hardcoded queries to not refer to deprecated fields especially attachments
This commit is contained in:
@@ -9,8 +9,6 @@ export type Attachment = {
|
||||
fileCategory: AttachmentFileCategory;
|
||||
companyId: string;
|
||||
personId: string;
|
||||
// Deprecated: Use createdBy instead
|
||||
authorId?: string;
|
||||
createdBy?: {
|
||||
source: string;
|
||||
workspaceMemberId: string | null;
|
||||
|
||||
@@ -125,8 +125,6 @@ export const query = gql`
|
||||
personId
|
||||
companyId
|
||||
id
|
||||
authorId
|
||||
type
|
||||
fullPath
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,8 +2,6 @@ import { Injectable, Logger } from '@nestjs/common';
|
||||
|
||||
import { parse } from 'path';
|
||||
|
||||
import { isDefined } from 'twenty-shared/utils';
|
||||
import { HTTPMethod, Sources } from 'twenty-shared/types';
|
||||
import {
|
||||
ApplicationManifest,
|
||||
FieldManifest,
|
||||
@@ -12,6 +10,8 @@ import {
|
||||
ServerlessFunctionManifest,
|
||||
ServerlessFunctionTriggerManifest,
|
||||
} from 'twenty-shared/application';
|
||||
import { HTTPMethod, Sources } from 'twenty-shared/types';
|
||||
import { isDefined } from 'twenty-shared/utils';
|
||||
|
||||
import { ApplicationEntity } from 'src/engine/core-modules/application/application.entity';
|
||||
import {
|
||||
@@ -29,9 +29,14 @@ import { FlatDatabaseEventTrigger } from 'src/engine/metadata-modules/database-e
|
||||
import { CreateFieldInput } from 'src/engine/metadata-modules/field-metadata/dtos/create-field.input';
|
||||
import { FieldMetadataService } from 'src/engine/metadata-modules/field-metadata/services/field-metadata.service';
|
||||
import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service';
|
||||
import { getFlatEntitiesByApplicationId } from 'src/engine/metadata-modules/flat-entity/utils/get-flat-entities-by-application-id.util';
|
||||
import { findFlatEntitiesByApplicationId } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entities-by-application-id.util';
|
||||
import { FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
|
||||
import { buildObjectIdByNameMaps } from 'src/engine/metadata-modules/flat-object-metadata/utils/build-object-id-by-name-maps.util';
|
||||
import { ObjectMetadataService } from 'src/engine/metadata-modules/object-metadata/object-metadata.service';
|
||||
import { FieldPermissionService } from 'src/engine/metadata-modules/object-permission/field-permission/field-permission.service';
|
||||
import { ObjectPermissionService } from 'src/engine/metadata-modules/object-permission/object-permission.service';
|
||||
import { PermissionFlagService } from 'src/engine/metadata-modules/permission-flag/permission-flag.service';
|
||||
import { RoleService } from 'src/engine/metadata-modules/role/role.service';
|
||||
import { RouteTriggerV2Service } from 'src/engine/metadata-modules/route-trigger/services/route-trigger-v2.service';
|
||||
import { FlatRouteTrigger } from 'src/engine/metadata-modules/route-trigger/types/flat-route-trigger.type';
|
||||
import { ServerlessFunctionLayerService } from 'src/engine/metadata-modules/serverless-function-layer/serverless-function-layer.service';
|
||||
@@ -39,11 +44,6 @@ import { ServerlessFunctionV2Service } from 'src/engine/metadata-modules/serverl
|
||||
import { FlatServerlessFunction } from 'src/engine/metadata-modules/serverless-function/types/flat-serverless-function.type';
|
||||
import { computeMetadataNameFromLabelOrThrow } from 'src/engine/metadata-modules/utils/compute-metadata-name-from-label-or-throw.util';
|
||||
import { WorkspaceMigrationValidateBuildAndRunService } from 'src/engine/workspace-manager/workspace-migration-v2/services/workspace-migration-validate-build-and-run-service';
|
||||
import { RoleService } from 'src/engine/metadata-modules/role/role.service';
|
||||
import { ObjectPermissionService } from 'src/engine/metadata-modules/object-permission/object-permission.service';
|
||||
import { PermissionFlagService } from 'src/engine/metadata-modules/permission-flag/permission-flag.service';
|
||||
import { buildObjectIdByNameMaps } from 'src/engine/metadata-modules/flat-object-metadata/utils/build-object-id-by-name-maps.util';
|
||||
import { FieldPermissionService } from 'src/engine/metadata-modules/object-permission/field-permission/field-permission.service';
|
||||
|
||||
@Injectable()
|
||||
export class ApplicationSyncService {
|
||||
@@ -1172,20 +1172,22 @@ export class ApplicationSyncService {
|
||||
}
|
||||
|
||||
const flatObjectMetadataMapsByApplicationId =
|
||||
getFlatEntitiesByApplicationId(
|
||||
existingFlatObjectMetadataMaps,
|
||||
application.id,
|
||||
);
|
||||
findFlatEntitiesByApplicationId({
|
||||
flatEntityMaps: existingFlatObjectMetadataMaps,
|
||||
applicationId: application.id,
|
||||
});
|
||||
|
||||
const flatIndexMetadataMapsByApplicationId = getFlatEntitiesByApplicationId(
|
||||
existingFlatIndexMetadataMaps,
|
||||
application.id,
|
||||
);
|
||||
const flatIndexMetadataMapsByApplicationId =
|
||||
findFlatEntitiesByApplicationId({
|
||||
flatEntityMaps: existingFlatIndexMetadataMaps,
|
||||
applicationId: application.id,
|
||||
});
|
||||
|
||||
const flatFieldMetadataMapsByApplicationId = getFlatEntitiesByApplicationId(
|
||||
existingFlatFieldMetadataMaps,
|
||||
application.id,
|
||||
);
|
||||
const flatFieldMetadataMapsByApplicationId =
|
||||
findFlatEntitiesByApplicationId({
|
||||
flatEntityMaps: existingFlatFieldMetadataMaps,
|
||||
applicationId: application.id,
|
||||
});
|
||||
|
||||
await this.workspaceMigrationValidateBuildAndRunService.validateBuildAndRunWorkspaceMigration(
|
||||
{
|
||||
|
||||
@@ -54,33 +54,6 @@ export class AiAgentRoleService {
|
||||
});
|
||||
}
|
||||
|
||||
public async assignStandardRoleToAgent({
|
||||
workspaceId,
|
||||
agentId,
|
||||
standardRoleId,
|
||||
}: {
|
||||
workspaceId: string;
|
||||
agentId: string;
|
||||
standardRoleId: string;
|
||||
}) {
|
||||
const role = await this.roleRepository.findOne({
|
||||
where: { standardId: standardRoleId, workspaceId },
|
||||
});
|
||||
|
||||
if (!isDefined(role)) {
|
||||
throw new AgentException(
|
||||
`Standard role with standard ID ${standardRoleId} not found in workspace`,
|
||||
AgentExceptionCode.ROLE_NOT_FOUND,
|
||||
);
|
||||
}
|
||||
|
||||
await this.assignRoleToAgent({
|
||||
workspaceId,
|
||||
agentId,
|
||||
roleId: role.id,
|
||||
});
|
||||
}
|
||||
|
||||
public async removeRoleFromAgent({
|
||||
workspaceId,
|
||||
agentId,
|
||||
|
||||
@@ -3,12 +3,15 @@ import { isDefined } from 'twenty-shared/utils';
|
||||
import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type';
|
||||
import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type';
|
||||
|
||||
export const getFlatEntitiesByApplicationId = <T extends SyncableFlatEntity>(
|
||||
maps: FlatEntityMaps<T>,
|
||||
applicationId: string,
|
||||
): T[] => {
|
||||
export const findFlatEntitiesByApplicationId = <T extends SyncableFlatEntity>({
|
||||
applicationId,
|
||||
flatEntityMaps,
|
||||
}: {
|
||||
flatEntityMaps: FlatEntityMaps<T>;
|
||||
applicationId: string;
|
||||
}): T[] => {
|
||||
const universalIdentifiers =
|
||||
maps.universalIdentifiersByApplicationId[applicationId];
|
||||
flatEntityMaps.universalIdentifiersByApplicationId[applicationId];
|
||||
|
||||
if (!isDefined(universalIdentifiers)) {
|
||||
return [];
|
||||
@@ -16,13 +19,13 @@ export const getFlatEntitiesByApplicationId = <T extends SyncableFlatEntity>(
|
||||
|
||||
return universalIdentifiers
|
||||
.map((universalId) => {
|
||||
const id = maps.idByUniversalIdentifier[universalId];
|
||||
const id = flatEntityMaps.idByUniversalIdentifier[universalId];
|
||||
|
||||
if (!isDefined(id)) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
const entity = maps.byId[id];
|
||||
const entity = flatEntityMaps.byId[id];
|
||||
|
||||
if (!isDefined(entity)) {
|
||||
return undefined;
|
||||
@@ -3,17 +3,21 @@ import { isDefined } from 'twenty-shared/utils';
|
||||
import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type';
|
||||
import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type';
|
||||
|
||||
export const getFlatEntityByUniversalIdentifier = <
|
||||
export const findFlatEntityByUniversalIdentifier = <
|
||||
T extends SyncableFlatEntity,
|
||||
>(
|
||||
maps: FlatEntityMaps<T>,
|
||||
universalIdentifier: string,
|
||||
): T | undefined => {
|
||||
const flatEntityId = maps.idByUniversalIdentifier[universalIdentifier];
|
||||
>({
|
||||
flatEntityMaps,
|
||||
universalIdentifier,
|
||||
}: {
|
||||
flatEntityMaps: FlatEntityMaps<T>;
|
||||
universalIdentifier: string;
|
||||
}): T | undefined => {
|
||||
const flatEntityId =
|
||||
flatEntityMaps.idByUniversalIdentifier[universalIdentifier];
|
||||
|
||||
if (!isDefined(flatEntityId)) {
|
||||
return;
|
||||
}
|
||||
|
||||
return maps.byId[flatEntityId];
|
||||
return flatEntityMaps.byId[flatEntityId];
|
||||
};
|
||||
@@ -0,0 +1,24 @@
|
||||
import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type';
|
||||
import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity.type';
|
||||
import { findFlatEntitiesByApplicationId } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entities-by-application-id.util';
|
||||
import { getSubFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/get-sub-flat-entity-maps-or-throw.util';
|
||||
|
||||
export const getSubFlatEntityMapsByApplicationIdOrThrow = <
|
||||
T extends SyncableFlatEntity,
|
||||
>({
|
||||
applicationId,
|
||||
flatEntityMaps,
|
||||
}: {
|
||||
applicationId: string;
|
||||
flatEntityMaps: FlatEntityMaps<T>;
|
||||
}) => {
|
||||
const allApplicationFlatEntity = findFlatEntitiesByApplicationId({
|
||||
applicationId,
|
||||
flatEntityMaps,
|
||||
});
|
||||
|
||||
return getSubFlatEntityMapsOrThrow({
|
||||
flatEntityIds: allApplicationFlatEntity.map((flatEntity) => flatEntity.id),
|
||||
flatEntityMaps,
|
||||
});
|
||||
};
|
||||
@@ -8,7 +8,7 @@ import { Repository } from 'typeorm';
|
||||
import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity';
|
||||
import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service';
|
||||
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
|
||||
import { getFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/get-flat-entities-by-universal-identifier.util';
|
||||
import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util';
|
||||
import { fromCreateRoleInputToFlatRoleToCreate } from 'src/engine/metadata-modules/flat-role/utils/from-create-role-input-to-flat-role-to-create.util';
|
||||
import { fromDeleteRoleInputToFlatRoleOrThrow } from 'src/engine/metadata-modules/flat-role/utils/from-delete-role-input-to-flat-role-or-throw.util';
|
||||
import { fromUpdateRoleInputToFlatRoleToUpdateOrThrow } from 'src/engine/metadata-modules/flat-role/utils/from-update-role-input-to-flat-role-to-update-or-throw.util';
|
||||
@@ -86,10 +86,10 @@ export class RoleService {
|
||||
},
|
||||
);
|
||||
|
||||
const flatRoleEntity = getFlatEntityByUniversalIdentifier(
|
||||
flatRoleMaps,
|
||||
const flatRoleEntity = findFlatEntityByUniversalIdentifier({
|
||||
flatEntityMaps: flatRoleMaps,
|
||||
universalIdentifier,
|
||||
);
|
||||
});
|
||||
|
||||
return isDefined(flatRoleEntity)
|
||||
? fromFlatRoleToRoleDto(flatRoleEntity)
|
||||
|
||||
@@ -4,7 +4,7 @@ import { InjectDataSource, InjectRepository } from '@nestjs/typeorm';
|
||||
import { WorkspaceActivationStatus } from 'twenty-shared/workspace';
|
||||
import { DataSource, Repository } from 'typeorm';
|
||||
|
||||
import { ApplicationEntity } from 'src/engine/core-modules/application/application.entity';
|
||||
import { FlatApplication } from 'src/engine/core-modules/application/types/flat-application.type';
|
||||
import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity';
|
||||
import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
|
||||
import { FieldPermissionService } from 'src/engine/metadata-modules/object-permission/field-permission/field-permission.service';
|
||||
@@ -13,7 +13,6 @@ import { RoleTargetService } from 'src/engine/metadata-modules/role-target/servi
|
||||
import { RoleEntity } from 'src/engine/metadata-modules/role/role.entity';
|
||||
import { RoleService } from 'src/engine/metadata-modules/role/role.service';
|
||||
import { UserRoleService } from 'src/engine/metadata-modules/user-role/user-role.service';
|
||||
import { WorkspaceCacheService } from 'src/engine/workspace-cache/services/workspace-cache.service';
|
||||
import {
|
||||
SEED_APPLE_WORKSPACE_ID,
|
||||
SEED_YCOMBINATOR_WORKSPACE_ID,
|
||||
@@ -23,7 +22,7 @@ import {
|
||||
USER_WORKSPACE_DATA_SEED_IDS,
|
||||
} from 'src/engine/workspace-manager/dev-seeder/core/utils/seed-user-workspaces.util';
|
||||
import { API_KEY_DATA_SEED_IDS } from 'src/engine/workspace-manager/dev-seeder/data/constants/api-key-data-seeds.constant';
|
||||
import { ADMIN_ROLE } from 'src/engine/workspace-manager/workspace-sync-metadata/standard-roles/roles/admin-role';
|
||||
import { STANDARD_ROLE } from 'src/engine/workspace-manager/twenty-standard-application/constants/standard-role.constant';
|
||||
|
||||
@Injectable()
|
||||
export class DevSeederPermissionsService {
|
||||
@@ -37,7 +36,6 @@ export class DevSeederPermissionsService {
|
||||
private readonly objectMetadataRepository: Repository<ObjectMetadataEntity>,
|
||||
@InjectRepository(RoleEntity)
|
||||
private readonly roleRepository: Repository<RoleEntity>,
|
||||
private readonly workspaceCacheService: WorkspaceCacheService,
|
||||
private readonly fieldPermissionService: FieldPermissionService,
|
||||
private readonly roleTargetService: RoleTargetService,
|
||||
@InjectDataSource()
|
||||
@@ -45,15 +43,15 @@ export class DevSeederPermissionsService {
|
||||
) {}
|
||||
|
||||
public async initPermissions({
|
||||
twentyStandardApplication,
|
||||
twentyStandardFlatApplication,
|
||||
workspaceId,
|
||||
}: {
|
||||
workspaceId: string;
|
||||
twentyStandardApplication: ApplicationEntity;
|
||||
twentyStandardFlatApplication: FlatApplication;
|
||||
}) {
|
||||
const adminRole = await this.roleRepository.findOne({
|
||||
where: {
|
||||
standardId: ADMIN_ROLE.standardId,
|
||||
universalIdentifier: STANDARD_ROLE.admin.universalIdentifier,
|
||||
workspaceId,
|
||||
},
|
||||
});
|
||||
@@ -64,21 +62,15 @@ export class DevSeederPermissionsService {
|
||||
);
|
||||
}
|
||||
|
||||
try {
|
||||
await this.roleTargetService.create({
|
||||
createRoleTargetInput: {
|
||||
roleId: adminRole.id,
|
||||
targetId: API_KEY_DATA_SEED_IDS.ID_1,
|
||||
targetMetadataForeignKey: 'apiKeyId',
|
||||
applicationId: twentyStandardApplication.id,
|
||||
},
|
||||
workspaceId,
|
||||
});
|
||||
} catch (error) {
|
||||
this.logger.error(
|
||||
`Could not assign role to test API key: ${error.message}`,
|
||||
);
|
||||
}
|
||||
await this.roleTargetService.create({
|
||||
createRoleTargetInput: {
|
||||
roleId: adminRole.id,
|
||||
targetId: API_KEY_DATA_SEED_IDS.ID_1,
|
||||
targetMetadataForeignKey: 'apiKeyId',
|
||||
applicationId: twentyStandardFlatApplication.id,
|
||||
},
|
||||
workspaceId,
|
||||
});
|
||||
|
||||
let adminUserWorkspaceId: string | undefined;
|
||||
let memberUserWorkspaceIds: string[] = [];
|
||||
@@ -96,7 +88,7 @@ export class DevSeederPermissionsService {
|
||||
|
||||
const guestRole = await this.roleService.createGuestRole({
|
||||
workspaceId,
|
||||
applicationId: twentyStandardApplication.id,
|
||||
applicationId: twentyStandardFlatApplication.id,
|
||||
});
|
||||
|
||||
await this.userRoleService.assignRoleToManyUserWorkspace({
|
||||
@@ -107,7 +99,7 @@ export class DevSeederPermissionsService {
|
||||
|
||||
const limitedRole = await this.createLimitedRoleForSeedWorkspace({
|
||||
workspaceId,
|
||||
applicationId: twentyStandardApplication.id,
|
||||
applicationId: twentyStandardFlatApplication.id,
|
||||
});
|
||||
|
||||
await this.userRoleService.assignRoleToManyUserWorkspace({
|
||||
@@ -124,17 +116,21 @@ export class DevSeederPermissionsService {
|
||||
];
|
||||
}
|
||||
|
||||
if (adminUserWorkspaceId) {
|
||||
await this.userRoleService.assignRoleToManyUserWorkspace({
|
||||
workspaceId,
|
||||
userWorkspaceIds: [adminUserWorkspaceId],
|
||||
roleId: adminRole.id,
|
||||
});
|
||||
if (!adminUserWorkspaceId) {
|
||||
throw new Error(
|
||||
'Should never occur, no eligible user workspace for admin has been found',
|
||||
);
|
||||
}
|
||||
|
||||
await this.userRoleService.assignRoleToManyUserWorkspace({
|
||||
workspaceId,
|
||||
userWorkspaceIds: [adminUserWorkspaceId],
|
||||
roleId: adminRole.id,
|
||||
});
|
||||
|
||||
const memberRole = await this.roleService.createMemberRole({
|
||||
workspaceId,
|
||||
applicationId: twentyStandardApplication.id,
|
||||
applicationId: twentyStandardFlatApplication.id,
|
||||
});
|
||||
|
||||
await this.coreDataSource
|
||||
|
||||
@@ -11,10 +11,7 @@ type AttachmentDataSeed = {
|
||||
id: string;
|
||||
name: string;
|
||||
fullPath: string;
|
||||
type: string;
|
||||
fileCategory?: string;
|
||||
// Deprecated: Use createdBy instead
|
||||
authorId: string | null;
|
||||
fileCategory: string;
|
||||
createdBySource: string;
|
||||
createdByWorkspaceMemberId: string;
|
||||
createdByName: string;
|
||||
@@ -29,9 +26,7 @@ export const ATTACHMENT_DATA_SEED_COLUMNS: (keyof AttachmentDataSeed)[] = [
|
||||
'id',
|
||||
'name',
|
||||
'fullPath',
|
||||
'type',
|
||||
'fileCategory',
|
||||
'authorId', // Deprecated: kept for backward compatibility during migration
|
||||
'createdBySource',
|
||||
'createdByWorkspaceMemberId',
|
||||
'createdByName',
|
||||
@@ -71,152 +66,128 @@ const FILE_NAME_VARIATIONS = [
|
||||
// Documents
|
||||
{
|
||||
name: 'Service Agreement.pdf',
|
||||
type: 'TextDocument',
|
||||
fileCategory: 'TEXT_DOCUMENT',
|
||||
pathIndex: 0,
|
||||
},
|
||||
{
|
||||
name: 'NDA Document.pdf',
|
||||
type: 'TextDocument',
|
||||
fileCategory: 'TEXT_DOCUMENT',
|
||||
pathIndex: 0,
|
||||
},
|
||||
{
|
||||
name: 'Project Proposal.pdf',
|
||||
type: 'TextDocument',
|
||||
fileCategory: 'TEXT_DOCUMENT',
|
||||
pathIndex: 0,
|
||||
},
|
||||
{
|
||||
name: 'Invoice Q1 2024.pdf',
|
||||
type: 'TextDocument',
|
||||
fileCategory: 'TEXT_DOCUMENT',
|
||||
pathIndex: 0,
|
||||
},
|
||||
{
|
||||
name: 'Meeting Notes.pdf',
|
||||
type: 'TextDocument',
|
||||
fileCategory: 'TEXT_DOCUMENT',
|
||||
pathIndex: 0,
|
||||
},
|
||||
{
|
||||
name: 'Report Final.pdf',
|
||||
type: 'TextDocument',
|
||||
fileCategory: 'TEXT_DOCUMENT',
|
||||
pathIndex: 0,
|
||||
},
|
||||
{
|
||||
name: 'Contract Signed.pdf',
|
||||
type: 'TextDocument',
|
||||
fileCategory: 'TEXT_DOCUMENT',
|
||||
pathIndex: 0,
|
||||
},
|
||||
// Spreadsheets
|
||||
{
|
||||
name: 'Financial Forecast.xlsx',
|
||||
type: 'Spreadsheet',
|
||||
fileCategory: 'SPREADSHEET',
|
||||
pathIndex: 1,
|
||||
},
|
||||
{
|
||||
name: 'Sales Report Q4.xlsx',
|
||||
type: 'Spreadsheet',
|
||||
fileCategory: 'SPREADSHEET',
|
||||
pathIndex: 1,
|
||||
},
|
||||
{
|
||||
name: 'Team Roster.xlsx',
|
||||
type: 'Spreadsheet',
|
||||
fileCategory: 'SPREADSHEET',
|
||||
pathIndex: 1,
|
||||
},
|
||||
{
|
||||
name: 'Expense Report.xlsx',
|
||||
type: 'Spreadsheet',
|
||||
fileCategory: 'SPREADSHEET',
|
||||
pathIndex: 1,
|
||||
},
|
||||
{
|
||||
name: 'Inventory List.xlsx',
|
||||
type: 'Spreadsheet',
|
||||
fileCategory: 'SPREADSHEET',
|
||||
pathIndex: 1,
|
||||
},
|
||||
{
|
||||
name: 'Data Export.csv',
|
||||
type: 'Spreadsheet',
|
||||
fileCategory: 'SPREADSHEET',
|
||||
pathIndex: 1,
|
||||
},
|
||||
// Presentations
|
||||
{
|
||||
name: 'Pitch Deck.pptx',
|
||||
type: 'Presentation',
|
||||
fileCategory: 'PRESENTATION',
|
||||
pathIndex: 2,
|
||||
},
|
||||
{
|
||||
name: 'Q4 Results.pptx',
|
||||
type: 'Presentation',
|
||||
fileCategory: 'PRESENTATION',
|
||||
pathIndex: 2,
|
||||
},
|
||||
{
|
||||
name: 'Roadmap 2024.pptx',
|
||||
type: 'Presentation',
|
||||
fileCategory: 'PRESENTATION',
|
||||
pathIndex: 2,
|
||||
},
|
||||
{
|
||||
name: 'Company Overview.pptx',
|
||||
type: 'Presentation',
|
||||
fileCategory: 'PRESENTATION',
|
||||
pathIndex: 2,
|
||||
},
|
||||
{
|
||||
name: 'Training Materials.pptx',
|
||||
type: 'Presentation',
|
||||
fileCategory: 'PRESENTATION',
|
||||
pathIndex: 2,
|
||||
},
|
||||
// Images
|
||||
{
|
||||
name: 'Company Logo.png',
|
||||
type: 'Image',
|
||||
fileCategory: 'IMAGE',
|
||||
pathIndex: 3,
|
||||
},
|
||||
{
|
||||
name: 'Product Photo.jpg',
|
||||
type: 'Image',
|
||||
fileCategory: 'IMAGE',
|
||||
pathIndex: 3,
|
||||
},
|
||||
{ name: 'Diagram.png', type: 'Image', fileCategory: 'IMAGE', pathIndex: 3 },
|
||||
{ name: 'Wireframe.png', type: 'Image', fileCategory: 'IMAGE', pathIndex: 3 },
|
||||
{ name: 'Diagram.png', fileCategory: 'IMAGE', pathIndex: 3 },
|
||||
{ name: 'Wireframe.png', fileCategory: 'IMAGE', pathIndex: 3 },
|
||||
{
|
||||
name: 'Mockup Design.png',
|
||||
type: 'Image',
|
||||
fileCategory: 'IMAGE',
|
||||
pathIndex: 3,
|
||||
},
|
||||
{ name: 'Headshot.jpg', type: 'Image', fileCategory: 'IMAGE', pathIndex: 3 },
|
||||
{ name: 'Headshot.jpg', fileCategory: 'IMAGE', pathIndex: 3 },
|
||||
// Archives
|
||||
{
|
||||
name: 'Project Files.zip',
|
||||
type: 'Archive',
|
||||
fileCategory: 'ARCHIVE',
|
||||
pathIndex: 4,
|
||||
},
|
||||
{
|
||||
name: 'Backup Data.zip',
|
||||
type: 'Archive',
|
||||
fileCategory: 'ARCHIVE',
|
||||
pathIndex: 4,
|
||||
},
|
||||
{
|
||||
name: 'Source Code.zip',
|
||||
type: 'Archive',
|
||||
fileCategory: 'ARCHIVE',
|
||||
pathIndex: 4,
|
||||
},
|
||||
@@ -276,10 +247,7 @@ const GENERATE_ATTACHMENT_SEEDS = (): AttachmentDataSeed[] => {
|
||||
id: ATTACHMENT_DATA_SEED_IDS[`ID_${INDEX}`],
|
||||
name: NAME_VARIATION.name,
|
||||
fullPath: FILE_PATH,
|
||||
type: NAME_VARIATION.type,
|
||||
fileCategory: NAME_VARIATION.fileCategory,
|
||||
// Deprecated: Use createdBy fields instead
|
||||
authorId: WORKSPACE_MEMBER_DATA_SEED_IDS.TIM,
|
||||
createdBySource: FieldActorSource.MANUAL,
|
||||
createdByWorkspaceMemberId: WORKSPACE_MEMBER_DATA_SEED_IDS.TIM,
|
||||
createdByName: 'Tim A',
|
||||
|
||||
@@ -24,7 +24,8 @@ import { DevSeederDataService } from 'src/engine/workspace-manager/dev-seeder/da
|
||||
import { TimelineActivitySeederService } from 'src/engine/workspace-manager/dev-seeder/data/services/timeline-activity-seeder.service';
|
||||
import { DevSeederMetadataService } from 'src/engine/workspace-manager/dev-seeder/metadata/services/dev-seeder-metadata.service';
|
||||
import { DevSeederService } from 'src/engine/workspace-manager/dev-seeder/services/dev-seeder.service';
|
||||
import { WorkspaceSyncMetadataModule } from 'src/engine/workspace-manager/workspace-sync-metadata/workspace-sync-metadata.module';
|
||||
import { TwentyStandardApplicationModule } from 'src/engine/workspace-manager/twenty-standard-application/twenty-standard-application.module';
|
||||
import { WorkspaceMigrationV2Module } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-v2.module';
|
||||
|
||||
@Module({
|
||||
imports: [
|
||||
@@ -41,11 +42,12 @@ import { WorkspaceSyncMetadataModule } from 'src/engine/workspace-manager/worksp
|
||||
ApplicationModule,
|
||||
FeatureFlagModule,
|
||||
FileStorageModule,
|
||||
WorkspaceSyncMetadataModule,
|
||||
TypeOrmModule.forFeature([WorkspaceEntity, ObjectMetadataEntity]),
|
||||
ObjectPermissionModule,
|
||||
WorkspaceManyOrAllFlatEntityMapsCacheModule,
|
||||
WorkspaceCacheModule,
|
||||
WorkspaceMigrationV2Module,
|
||||
TwentyStandardApplicationModule,
|
||||
],
|
||||
exports: [DevSeederService],
|
||||
providers: [
|
||||
|
||||
@@ -1,10 +1,7 @@
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { InjectDataSource } from '@nestjs/typeorm';
|
||||
|
||||
import { isDefined } from 'twenty-shared/utils';
|
||||
import { DataSource } from 'typeorm';
|
||||
|
||||
import { FlatApplication } from 'src/engine/core-modules/application/types/flat-application.type';
|
||||
import { type DataSourceEntity } from 'src/engine/metadata-modules/data-source/data-source.entity';
|
||||
import { CreateFieldInput } from 'src/engine/metadata-modules/field-metadata/dtos/create-field.input';
|
||||
import { FieldMetadataService } from 'src/engine/metadata-modules/field-metadata/services/field-metadata.service';
|
||||
@@ -25,7 +22,6 @@ import { ROCKET_CUSTOM_OBJECT_SEED } from 'src/engine/workspace-manager/dev-seed
|
||||
import { SURVEY_RESULT_CUSTOM_OBJECT_SEED } from 'src/engine/workspace-manager/dev-seeder/metadata/custom-objects/constants/survey-results-object-seed.constant';
|
||||
import { type FieldMetadataSeed } from 'src/engine/workspace-manager/dev-seeder/metadata/types/field-metadata-seed.type';
|
||||
import { type ObjectMetadataSeed } from 'src/engine/workspace-manager/dev-seeder/metadata/types/object-metadata-seed.type';
|
||||
import { prefillCoreViews } from 'src/engine/workspace-manager/standard-objects-prefill-data/prefill-core-views';
|
||||
|
||||
@Injectable()
|
||||
export class DevSeederMetadataService {
|
||||
@@ -33,8 +29,6 @@ export class DevSeederMetadataService {
|
||||
private readonly objectMetadataService: ObjectMetadataService,
|
||||
private readonly fieldMetadataService: FieldMetadataService,
|
||||
private readonly flatEntityMapsCacheService: WorkspaceManyOrAllFlatEntityMapsCacheService,
|
||||
@InjectDataSource()
|
||||
private readonly coreDataSource: DataSource,
|
||||
) {}
|
||||
|
||||
private readonly workspaceConfigs: Record<
|
||||
@@ -85,13 +79,9 @@ export class DevSeederMetadataService {
|
||||
public async seed({
|
||||
dataSourceMetadata,
|
||||
workspaceId,
|
||||
featureFlags,
|
||||
twentyStandardFlatApplication,
|
||||
}: {
|
||||
dataSourceMetadata: DataSourceEntity;
|
||||
workspaceId: string;
|
||||
twentyStandardFlatApplication: FlatApplication;
|
||||
featureFlags?: Record<string, boolean>;
|
||||
}) {
|
||||
const config = this.workspaceConfigs[workspaceId];
|
||||
|
||||
@@ -125,13 +115,6 @@ export class DevSeederMetadataService {
|
||||
fieldMetadataSeeds: fieldConfig.seeds,
|
||||
});
|
||||
}
|
||||
|
||||
await this.seedCoreViews({
|
||||
workspaceId,
|
||||
dataSourceMetadata,
|
||||
featureFlags,
|
||||
twentyStandardFlatApplication,
|
||||
});
|
||||
}
|
||||
|
||||
private async seedCustomObject({
|
||||
@@ -182,36 +165,6 @@ export class DevSeederMetadataService {
|
||||
});
|
||||
}
|
||||
|
||||
private async seedCoreViews({
|
||||
workspaceId,
|
||||
dataSourceMetadata,
|
||||
featureFlags,
|
||||
twentyStandardFlatApplication,
|
||||
}: {
|
||||
workspaceId: string;
|
||||
dataSourceMetadata: DataSourceEntity;
|
||||
featureFlags?: Record<string, boolean>;
|
||||
twentyStandardFlatApplication: FlatApplication;
|
||||
}): Promise<void> {
|
||||
const { flatObjectMetadataMaps, flatFieldMetadataMaps } =
|
||||
await this.flatEntityMapsCacheService.getOrRecomputeManyOrAllFlatEntityMaps(
|
||||
{
|
||||
workspaceId,
|
||||
flatMapsKeys: ['flatObjectMetadataMaps', 'flatFieldMetadataMaps'],
|
||||
},
|
||||
);
|
||||
|
||||
await prefillCoreViews({
|
||||
coreDataSource: this.coreDataSource,
|
||||
workspaceId,
|
||||
flatObjectMetadataMaps,
|
||||
flatFieldMetadataMaps,
|
||||
workspaceSchemaName: dataSourceMetadata.schema,
|
||||
featureFlags,
|
||||
twentyStandardFlatApplication,
|
||||
});
|
||||
}
|
||||
|
||||
public async seedRelations({ workspaceId }: { workspaceId: string }) {
|
||||
const config = this.workspaceConfigs[workspaceId];
|
||||
|
||||
|
||||
@@ -1,12 +1,10 @@
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { InjectDataSource } from '@nestjs/typeorm';
|
||||
|
||||
import { isDefined } from 'twenty-shared/utils';
|
||||
import { DataSource } from 'typeorm';
|
||||
|
||||
import { ApplicationService } from 'src/engine/core-modules/application/application.service';
|
||||
import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum';
|
||||
import { FeatureFlagService } from 'src/engine/core-modules/feature-flag/services/feature-flag.service';
|
||||
import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service';
|
||||
import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service';
|
||||
import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
|
||||
@@ -21,8 +19,7 @@ import { seedPageLayoutWidgets } from 'src/engine/workspace-manager/dev-seeder/c
|
||||
import { seedPageLayouts } from 'src/engine/workspace-manager/dev-seeder/core/utils/seed-page-layouts.util';
|
||||
import { DevSeederDataService } from 'src/engine/workspace-manager/dev-seeder/data/services/dev-seeder-data.service';
|
||||
import { DevSeederMetadataService } from 'src/engine/workspace-manager/dev-seeder/metadata/services/dev-seeder-metadata.service';
|
||||
import { TWENTY_STANDARD_APPLICATION } from 'src/engine/workspace-manager/twenty-standard-application/constants/twenty-standard-applications';
|
||||
import { WorkspaceSyncMetadataService } from 'src/engine/workspace-manager/workspace-sync-metadata/workspace-sync-metadata.service';
|
||||
import { TwentyStandardApplicationService } from 'src/engine/workspace-manager/twenty-standard-application/services/twenty-standard-application.service';
|
||||
|
||||
@Injectable()
|
||||
export class DevSeederService {
|
||||
@@ -31,8 +28,7 @@ export class DevSeederService {
|
||||
private readonly twentyConfigService: TwentyConfigService,
|
||||
private readonly workspaceDataSourceService: WorkspaceDataSourceService,
|
||||
private readonly dataSourceService: DataSourceService,
|
||||
private readonly featureFlagService: FeatureFlagService,
|
||||
private readonly workspaceSyncMetadataService: WorkspaceSyncMetadataService,
|
||||
private readonly twentyStandardApplicationService: TwentyStandardApplicationService,
|
||||
private readonly devSeederMetadataService: DevSeederMetadataService,
|
||||
private readonly devSeederPermissionsService: DevSeederPermissionsService,
|
||||
private readonly devSeederDataService: DevSeederDataService,
|
||||
@@ -70,36 +66,22 @@ export class DevSeederService {
|
||||
schemaName,
|
||||
);
|
||||
|
||||
const twentyStandardApplication =
|
||||
await this.applicationService.findByUniversalIdentifier({
|
||||
workspaceId,
|
||||
universalIdentifier: TWENTY_STANDARD_APPLICATION.universalIdentifier,
|
||||
});
|
||||
|
||||
if (!isDefined(twentyStandardApplication)) {
|
||||
throw new Error(
|
||||
'Seeder failed to find twenty standard application, should never occur',
|
||||
);
|
||||
}
|
||||
|
||||
const { twentyStandardFlatApplication, workspaceCustomFlatApplication } =
|
||||
const { workspaceCustomFlatApplication, twentyStandardFlatApplication } =
|
||||
await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow(
|
||||
{
|
||||
workspaceId,
|
||||
},
|
||||
);
|
||||
|
||||
await this.workspaceSyncMetadataService.synchronize({
|
||||
workspaceId: workspaceId,
|
||||
dataSourceId: dataSourceMetadata.id,
|
||||
featureFlags: featureFlagsMap,
|
||||
});
|
||||
await this.twentyStandardApplicationService.synchronizeTwentyStandardApplicationOrThrow(
|
||||
{
|
||||
workspaceId,
|
||||
},
|
||||
);
|
||||
|
||||
await this.devSeederMetadataService.seed({
|
||||
dataSourceMetadata,
|
||||
workspaceId,
|
||||
featureFlags: featureFlagsMap,
|
||||
twentyStandardFlatApplication,
|
||||
});
|
||||
|
||||
await this.devSeederMetadataService.seedRelations({
|
||||
@@ -108,7 +90,7 @@ export class DevSeederService {
|
||||
|
||||
await this.devSeederPermissionsService.initPermissions({
|
||||
workspaceId,
|
||||
twentyStandardApplication,
|
||||
twentyStandardFlatApplication,
|
||||
});
|
||||
|
||||
await seedPageLayouts(
|
||||
|
||||
@@ -48,14 +48,12 @@ export const STANDARD_OBJECTS = {
|
||||
},
|
||||
name: { universalIdentifier: ATTACHMENT_STANDARD_FIELD_IDS.name },
|
||||
fullPath: { universalIdentifier: ATTACHMENT_STANDARD_FIELD_IDS.fullPath },
|
||||
type: { universalIdentifier: ATTACHMENT_STANDARD_FIELD_IDS.type },
|
||||
fileCategory: {
|
||||
universalIdentifier: ATTACHMENT_STANDARD_FIELD_IDS.fileCategory,
|
||||
},
|
||||
createdBy: {
|
||||
universalIdentifier: ATTACHMENT_STANDARD_FIELD_IDS.createdBy,
|
||||
},
|
||||
author: { universalIdentifier: ATTACHMENT_STANDARD_FIELD_IDS.author },
|
||||
task: { universalIdentifier: ATTACHMENT_STANDARD_FIELD_IDS.task },
|
||||
note: { universalIdentifier: ATTACHMENT_STANDARD_FIELD_IDS.note },
|
||||
person: { universalIdentifier: ATTACHMENT_STANDARD_FIELD_IDS.person },
|
||||
@@ -69,9 +67,6 @@ export const STANDARD_OBJECTS = {
|
||||
workflow: { universalIdentifier: ATTACHMENT_STANDARD_FIELD_IDS.workflow },
|
||||
},
|
||||
indexes: {
|
||||
authorIdIndex: {
|
||||
universalIdentifier: 'a7c3e8f2-9b14-4d6a-8e5f-1c2d3b4a5e6f',
|
||||
},
|
||||
taskIdIndex: {
|
||||
universalIdentifier: 'b8d4f9a3-0c25-4e7b-9f6a-2d3e4c5b6f70',
|
||||
},
|
||||
@@ -389,9 +384,6 @@ export const STANDARD_OBJECTS = {
|
||||
universalIdentifier: COMPANY_STANDARD_FIELD_IDS.domainName,
|
||||
},
|
||||
address: { universalIdentifier: COMPANY_STANDARD_FIELD_IDS.address },
|
||||
addressOld: {
|
||||
universalIdentifier: COMPANY_STANDARD_FIELD_IDS.address_deprecated,
|
||||
},
|
||||
employees: { universalIdentifier: COMPANY_STANDARD_FIELD_IDS.employees },
|
||||
linkedinLink: {
|
||||
universalIdentifier: COMPANY_STANDARD_FIELD_IDS.linkedinLink,
|
||||
@@ -626,7 +618,7 @@ export const STANDARD_OBJECTS = {
|
||||
},
|
||||
task: { universalIdentifier: FAVORITE_STANDARD_FIELD_IDS.task },
|
||||
note: { universalIdentifier: FAVORITE_STANDARD_FIELD_IDS.note },
|
||||
view: { universalIdentifier: FAVORITE_STANDARD_FIELD_IDS.view },
|
||||
viewId: { universalIdentifier: FAVORITE_STANDARD_FIELD_IDS.view },
|
||||
favoriteFolder: {
|
||||
universalIdentifier: FAVORITE_STANDARD_FIELD_IDS.favoriteFolder,
|
||||
},
|
||||
@@ -1035,7 +1027,6 @@ export const STANDARD_OBJECTS = {
|
||||
},
|
||||
position: { universalIdentifier: NOTE_STANDARD_FIELD_IDS.position },
|
||||
title: { universalIdentifier: NOTE_STANDARD_FIELD_IDS.title },
|
||||
body: { universalIdentifier: NOTE_STANDARD_FIELD_IDS.body },
|
||||
bodyV2: { universalIdentifier: NOTE_STANDARD_FIELD_IDS.bodyV2 },
|
||||
createdBy: { universalIdentifier: NOTE_STANDARD_FIELD_IDS.createdBy },
|
||||
noteTargets: { universalIdentifier: NOTE_STANDARD_FIELD_IDS.noteTargets },
|
||||
@@ -1253,14 +1244,12 @@ export const STANDARD_OBJECTS = {
|
||||
universalIdentifier: '20202020-e01d-4144-9d44-789abcdefabc',
|
||||
},
|
||||
name: { universalIdentifier: PERSON_STANDARD_FIELD_IDS.name },
|
||||
email: { universalIdentifier: PERSON_STANDARD_FIELD_IDS.email },
|
||||
emails: { universalIdentifier: PERSON_STANDARD_FIELD_IDS.emails },
|
||||
linkedinLink: {
|
||||
universalIdentifier: PERSON_STANDARD_FIELD_IDS.linkedinLink,
|
||||
},
|
||||
xLink: { universalIdentifier: PERSON_STANDARD_FIELD_IDS.xLink },
|
||||
jobTitle: { universalIdentifier: PERSON_STANDARD_FIELD_IDS.jobTitle },
|
||||
phone: { universalIdentifier: PERSON_STANDARD_FIELD_IDS.phone },
|
||||
phones: { universalIdentifier: PERSON_STANDARD_FIELD_IDS.phones },
|
||||
city: { universalIdentifier: PERSON_STANDARD_FIELD_IDS.city },
|
||||
avatarUrl: { universalIdentifier: PERSON_STANDARD_FIELD_IDS.avatarUrl },
|
||||
@@ -1359,7 +1348,6 @@ export const STANDARD_OBJECTS = {
|
||||
},
|
||||
position: { universalIdentifier: TASK_STANDARD_FIELD_IDS.position },
|
||||
title: { universalIdentifier: TASK_STANDARD_FIELD_IDS.title },
|
||||
body: { universalIdentifier: TASK_STANDARD_FIELD_IDS.body },
|
||||
bodyV2: { universalIdentifier: TASK_STANDARD_FIELD_IDS.bodyV2 },
|
||||
dueAt: { universalIdentifier: TASK_STANDARD_FIELD_IDS.dueAt },
|
||||
status: { universalIdentifier: TASK_STANDARD_FIELD_IDS.status },
|
||||
@@ -1946,10 +1934,6 @@ export const STANDARD_OBJECTS = {
|
||||
universalIdentifier:
|
||||
WORKSPACE_MEMBER_STANDARD_FIELD_IDS.accountOwnerForCompanies,
|
||||
},
|
||||
authoredAttachments: {
|
||||
universalIdentifier:
|
||||
WORKSPACE_MEMBER_STANDARD_FIELD_IDS.authoredAttachments,
|
||||
},
|
||||
connectedAccounts: {
|
||||
universalIdentifier:
|
||||
WORKSPACE_MEMBER_STANDARD_FIELD_IDS.connectedAccounts,
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
import { type AllMetadataName } from 'twenty-shared/metadata';
|
||||
|
||||
export const TWENTY_STANDARD_ALL_METADATA_NAME = [
|
||||
'index',
|
||||
'objectMetadata',
|
||||
'fieldMetadata',
|
||||
'viewField',
|
||||
'viewFilter',
|
||||
'viewGroup',
|
||||
'view',
|
||||
'role',
|
||||
'agent',
|
||||
] as const satisfies AllMetadataName[];
|
||||
@@ -0,0 +1,153 @@
|
||||
import { Injectable } from '@nestjs/common';
|
||||
|
||||
import { isDefined } from 'twenty-shared/utils';
|
||||
|
||||
import { ApplicationService } from 'src/engine/core-modules/application/application.service';
|
||||
import { MetadataFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity.type';
|
||||
import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util';
|
||||
import { getMetadataFlatEntityMapsKey } from 'src/engine/metadata-modules/flat-entity/utils/get-metadata-flat-entity-maps-key.util';
|
||||
import { getSubFlatEntityMapsByApplicationIdOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/get-sub-flat-entity-maps-by-application-id-or-throw.util';
|
||||
import { FlatView } from 'src/engine/metadata-modules/flat-view/types/flat-view.type';
|
||||
import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager';
|
||||
import { buildSystemAuthContext } from 'src/engine/twenty-orm/utils/build-system-auth-context.util';
|
||||
import { WorkspaceCacheService } from 'src/engine/workspace-cache/services/workspace-cache.service';
|
||||
import { STANDARD_OBJECTS } from 'src/engine/workspace-manager/twenty-standard-application/constants/standard-object.constant';
|
||||
import { TWENTY_STANDARD_ALL_METADATA_NAME } from 'src/engine/workspace-manager/twenty-standard-application/constants/twenty-standard-all-metadata-name.constant';
|
||||
import { computeTwentyStandardApplicationAllFlatEntityMaps } from 'src/engine/workspace-manager/twenty-standard-application/utils/twenty-standard-application-all-flat-entity-maps.constant';
|
||||
import { WorkspaceMigrationBuilderExceptionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/exceptions/workspace-migration-builder-exception-v2';
|
||||
import { WorkspaceMigrationValidateBuildAndRunService } from 'src/engine/workspace-manager/workspace-migration-v2/services/workspace-migration-validate-build-and-run-service';
|
||||
import { FromToAllFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration-v2/types/workspace-migration-orchestrator.type';
|
||||
import { FavoriteWorkspaceEntity } from 'src/modules/favorite/standard-objects/favorite.workspace-entity';
|
||||
|
||||
@Injectable()
|
||||
export class TwentyStandardApplicationService {
|
||||
constructor(
|
||||
private readonly applicationService: ApplicationService,
|
||||
private readonly workspaceMigrationValidateBuildAndRunService: WorkspaceMigrationValidateBuildAndRunService,
|
||||
private readonly workspaceCacheService: WorkspaceCacheService,
|
||||
private readonly globalWorkspaceOrmManager: GlobalWorkspaceOrmManager,
|
||||
) {}
|
||||
|
||||
// Note: To remove and handle natively in validateBuildAndRun after favorite migration to metadata
|
||||
private async createManyFavorite({
|
||||
flatViews,
|
||||
workspaceId,
|
||||
}: {
|
||||
flatViews: FlatView[];
|
||||
workspaceId: string;
|
||||
}) {
|
||||
const authContext = buildSystemAuthContext(workspaceId);
|
||||
|
||||
await this.globalWorkspaceOrmManager.executeInWorkspaceContext(
|
||||
authContext,
|
||||
async () => {
|
||||
const favoriteRepository =
|
||||
await this.globalWorkspaceOrmManager.getRepository<FavoriteWorkspaceEntity>(
|
||||
workspaceId,
|
||||
'favorite',
|
||||
);
|
||||
|
||||
const favoriteCount = await favoriteRepository.count();
|
||||
const favoriteToCreate = flatViews.map((flatView, index) => ({
|
||||
viewId: flatView.id,
|
||||
position: favoriteCount + index,
|
||||
}));
|
||||
|
||||
await favoriteRepository.insert(favoriteToCreate);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
async synchronizeTwentyStandardApplicationOrThrow({
|
||||
workspaceId,
|
||||
}: {
|
||||
workspaceId: string;
|
||||
}) {
|
||||
const { twentyStandardFlatApplication } =
|
||||
await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow(
|
||||
{
|
||||
workspaceId,
|
||||
},
|
||||
);
|
||||
const { featureFlagsMap, ...fromTwentyStandardAllFlatEntityMaps } =
|
||||
await this.workspaceCacheService.getOrRecompute(workspaceId, [
|
||||
...TWENTY_STANDARD_ALL_METADATA_NAME.map(getMetadataFlatEntityMapsKey),
|
||||
'featureFlagsMap',
|
||||
]);
|
||||
const toTwentyStandardAllFlatEntityMaps =
|
||||
computeTwentyStandardApplicationAllFlatEntityMaps({
|
||||
now: new Date().toISOString(),
|
||||
workspaceId,
|
||||
twentyStandardApplicationId: twentyStandardFlatApplication.id,
|
||||
});
|
||||
|
||||
const fromToAllFlatEntityMaps: FromToAllFlatEntityMaps = {};
|
||||
|
||||
for (const metadataName of TWENTY_STANDARD_ALL_METADATA_NAME) {
|
||||
const flatEntityMapsKey = getMetadataFlatEntityMapsKey(metadataName);
|
||||
const fromFlatEntityMaps =
|
||||
fromTwentyStandardAllFlatEntityMaps[flatEntityMapsKey];
|
||||
const fromTo = {
|
||||
from: getSubFlatEntityMapsByApplicationIdOrThrow<
|
||||
MetadataFlatEntity<typeof metadataName>
|
||||
>({
|
||||
applicationId: twentyStandardFlatApplication.id,
|
||||
flatEntityMaps: fromFlatEntityMaps,
|
||||
}),
|
||||
to: toTwentyStandardAllFlatEntityMaps[flatEntityMapsKey],
|
||||
};
|
||||
|
||||
// @ts-expect-error Metadata flat entity maps cache key and metadataName colliding
|
||||
fromToAllFlatEntityMaps[flatEntityMapsKey] = fromTo;
|
||||
}
|
||||
|
||||
const validateAndBuildResult =
|
||||
await this.workspaceMigrationValidateBuildAndRunService.validateBuildAndRunWorkspaceMigrationFromTo(
|
||||
{
|
||||
buildOptions: {
|
||||
isSystemBuild: true,
|
||||
inferDeletionFromMissingEntities: true,
|
||||
},
|
||||
fromToAllFlatEntityMaps,
|
||||
workspaceId,
|
||||
additionalCacheDataMaps: {
|
||||
featureFlagsMap,
|
||||
},
|
||||
},
|
||||
);
|
||||
|
||||
if (isDefined(validateAndBuildResult)) {
|
||||
throw new WorkspaceMigrationBuilderExceptionV2(
|
||||
validateAndBuildResult,
|
||||
'Multiple validation errors occurred while synchronizing twenty-standard application',
|
||||
);
|
||||
}
|
||||
|
||||
const { flatViewMaps } = await this.workspaceCacheService.getOrRecompute(
|
||||
workspaceId,
|
||||
['flatViewMaps'],
|
||||
);
|
||||
|
||||
const flatViews = [
|
||||
STANDARD_OBJECTS.company.views.allCompanies.universalIdentifier,
|
||||
STANDARD_OBJECTS.dashboard.views.allDashboards.universalIdentifier,
|
||||
STANDARD_OBJECTS.note.views.allNotes.universalIdentifier,
|
||||
STANDARD_OBJECTS.opportunity.views.allOpportunities.universalIdentifier,
|
||||
STANDARD_OBJECTS.person.views.allPeople.universalIdentifier,
|
||||
STANDARD_OBJECTS.task.views.allTasks.universalIdentifier,
|
||||
STANDARD_OBJECTS.workflow.views.allWorkflows.universalIdentifier,
|
||||
]
|
||||
.map((universalIdentifier) =>
|
||||
findFlatEntityByUniversalIdentifier({
|
||||
flatEntityMaps: flatViewMaps,
|
||||
universalIdentifier,
|
||||
}),
|
||||
)
|
||||
.filter(isDefined);
|
||||
|
||||
await this.createManyFavorite({
|
||||
flatViews,
|
||||
workspaceId,
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
import { Module } from '@nestjs/common';
|
||||
|
||||
import { ApplicationModule } from 'src/engine/core-modules/application/application.module';
|
||||
import { WorkspaceCacheModule } from 'src/engine/workspace-cache/workspace-cache.module';
|
||||
import { WorkspaceMigrationV2Module } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-v2.module';
|
||||
import { GlobalWorkspaceDataSourceModule } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-datasource.module';
|
||||
|
||||
import { TwentyStandardApplicationService } from './services/twenty-standard-application.service';
|
||||
|
||||
@Module({
|
||||
providers: [TwentyStandardApplicationService],
|
||||
imports: [
|
||||
ApplicationModule,
|
||||
WorkspaceCacheModule,
|
||||
WorkspaceMigrationV2Module,
|
||||
GlobalWorkspaceDataSourceModule,
|
||||
],
|
||||
exports: [TwentyStandardApplicationService],
|
||||
})
|
||||
export class TwentyStandardApplicationModule {}
|
||||
@@ -1,14 +1,10 @@
|
||||
import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type';
|
||||
import { type MetadataToFlatEntityMapsKey } from 'src/engine/metadata-modules/flat-entity/types/metadata-to-flat-entity-maps-key';
|
||||
import { type TWENTY_STANDARD_ALL_METADATA_NAME } from 'src/engine/workspace-manager/twenty-standard-application/constants/twenty-standard-all-metadata-name.constant';
|
||||
|
||||
export type TwentyStandardAllFlatEntityMaps = Pick<
|
||||
AllFlatEntityMaps,
|
||||
| 'flatIndexMaps'
|
||||
| 'flatObjectMetadataMaps'
|
||||
| 'flatFieldMetadataMaps'
|
||||
| 'flatViewFieldMaps'
|
||||
| 'flatViewFilterMaps'
|
||||
| 'flatViewGroupMaps'
|
||||
| 'flatViewMaps'
|
||||
| 'flatRoleMaps'
|
||||
| 'flatAgentMaps'
|
||||
MetadataToFlatEntityMapsKey<
|
||||
(typeof TWENTY_STANDARD_ALL_METADATA_NAME)[number]
|
||||
>
|
||||
>;
|
||||
|
||||
@@ -49,7 +49,7 @@ export const createStandardAgentFlatMetadata = ({
|
||||
return {
|
||||
id: v4(),
|
||||
universalIdentifier,
|
||||
standardId: null,
|
||||
standardId: universalIdentifier,
|
||||
name,
|
||||
label,
|
||||
icon,
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import { type FieldMetadataType } from 'twenty-shared/types';
|
||||
|
||||
import { createEmptyFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/constant/create-empty-flat-entity-maps.constant';
|
||||
import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type';
|
||||
import { addFlatEntityToFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/add-flat-entity-to-flat-entity-maps-or-throw.util';
|
||||
@@ -35,7 +37,7 @@ import { buildWorkspaceMemberStandardFlatFieldMetadatas } from 'src/engine/works
|
||||
import { type CreateStandardFieldArgs } from 'src/engine/workspace-manager/twenty-standard-application/utils/field-metadata/create-standard-field-flat-metadata.util';
|
||||
|
||||
type StandardFieldBuilder<P extends AllStandardObjectName> = (
|
||||
args: Omit<CreateStandardFieldArgs<P>, 'context'>,
|
||||
args: Omit<CreateStandardFieldArgs<P, FieldMetadataType>, 'context'>,
|
||||
) => Record<string, FlatFieldMetadata>;
|
||||
|
||||
const STANDARD_FLAT_FIELD_METADATA_BUILDERS_BY_OBJECT_NAME = {
|
||||
@@ -77,7 +79,10 @@ const STANDARD_FLAT_FIELD_METADATA_BUILDERS_BY_OBJECT_NAME = {
|
||||
};
|
||||
|
||||
export const buildStandardFlatFieldMetadataMaps = (
|
||||
args: Omit<CreateStandardFieldArgs, 'context' | 'objectName'>,
|
||||
args: Omit<
|
||||
CreateStandardFieldArgs<AllStandardObjectName, FieldMetadataType>,
|
||||
'context' | 'objectName'
|
||||
>,
|
||||
): FlatEntityMaps<FlatFieldMetadata> => {
|
||||
const allFieldMetadatas: FlatFieldMetadata[] = (
|
||||
Object.keys(
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import {
|
||||
DateDisplayFormat,
|
||||
FieldMetadataType,
|
||||
RelationOnDeleteAction,
|
||||
RelationType,
|
||||
@@ -19,10 +20,10 @@ export const buildAttachmentStandardFlatFieldMetadatas = ({
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
twentyStandardApplicationId,
|
||||
}: Omit<CreateStandardFieldArgs<'attachment'>, 'context'>): Record<
|
||||
AllStandardObjectFieldName<'attachment'>,
|
||||
FlatFieldMetadata
|
||||
> => ({
|
||||
}: Omit<
|
||||
CreateStandardFieldArgs<'attachment', FieldMetadataType>,
|
||||
'context'
|
||||
>): Record<AllStandardObjectFieldName<'attachment'>, FlatFieldMetadata> => ({
|
||||
// Base fields from BaseWorkspaceEntity
|
||||
id: createStandardFieldFlatMetadata({
|
||||
objectName,
|
||||
@@ -56,7 +57,7 @@ export const buildAttachmentStandardFlatFieldMetadatas = ({
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: {
|
||||
displayFormat: 'RELATIVE',
|
||||
displayFormat: DateDisplayFormat.RELATIVE,
|
||||
},
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
@@ -77,7 +78,7 @@ export const buildAttachmentStandardFlatFieldMetadatas = ({
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: {
|
||||
displayFormat: 'RELATIVE',
|
||||
displayFormat: DateDisplayFormat.RELATIVE,
|
||||
},
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
@@ -97,7 +98,7 @@ export const buildAttachmentStandardFlatFieldMetadatas = ({
|
||||
isNullable: true,
|
||||
isUIReadOnly: true,
|
||||
settings: {
|
||||
displayFormat: 'RELATIVE',
|
||||
displayFormat: DateDisplayFormat.RELATIVE,
|
||||
},
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
@@ -139,22 +140,6 @@ export const buildAttachmentStandardFlatFieldMetadatas = ({
|
||||
twentyStandardApplicationId,
|
||||
now,
|
||||
}),
|
||||
type: createStandardFieldFlatMetadata({
|
||||
objectName,
|
||||
workspaceId,
|
||||
context: {
|
||||
fieldName: 'type',
|
||||
type: FieldMetadataType.TEXT,
|
||||
label: 'Type (deprecated)',
|
||||
description: 'Attachment type (deprecated - use fileCategory)',
|
||||
icon: 'IconList',
|
||||
isNullable: true,
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
twentyStandardApplicationId,
|
||||
now,
|
||||
}),
|
||||
fileCategory: createStandardFieldFlatMetadata({
|
||||
objectName,
|
||||
workspaceId,
|
||||
@@ -208,6 +193,11 @@ export const buildAttachmentStandardFlatFieldMetadatas = ({
|
||||
icon: 'IconCreativeCommonsSa',
|
||||
isUIReadOnly: true,
|
||||
isNullable: false,
|
||||
defaultValue: {
|
||||
source: "'MANUAL'",
|
||||
name: "'System'",
|
||||
workspaceMemberId: null,
|
||||
},
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -216,30 +206,6 @@ export const buildAttachmentStandardFlatFieldMetadatas = ({
|
||||
}),
|
||||
|
||||
// Relation fields
|
||||
author: createStandardRelationFieldFlatMetadata({
|
||||
objectName,
|
||||
workspaceId,
|
||||
context: {
|
||||
type: FieldMetadataType.RELATION,
|
||||
morphId: null,
|
||||
fieldName: 'author',
|
||||
label: 'Author',
|
||||
description: 'Attachment author (deprecated - use createdBy)',
|
||||
icon: 'IconCircleUser',
|
||||
isNullable: true,
|
||||
targetObjectName: 'workspaceMember',
|
||||
targetFieldName: 'authoredAttachments',
|
||||
settings: {
|
||||
relationType: RelationType.MANY_TO_ONE,
|
||||
onDelete: RelationOnDeleteAction.SET_NULL,
|
||||
joinColumnName: 'authorId',
|
||||
},
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
twentyStandardApplicationId,
|
||||
now,
|
||||
}),
|
||||
task: createStandardRelationFieldFlatMetadata({
|
||||
objectName,
|
||||
workspaceId,
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import {
|
||||
DateDisplayFormat,
|
||||
FieldMetadataType,
|
||||
RelationOnDeleteAction,
|
||||
RelationType,
|
||||
@@ -19,10 +20,10 @@ export const buildBlocklistStandardFlatFieldMetadatas = ({
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
twentyStandardApplicationId,
|
||||
}: Omit<CreateStandardFieldArgs<'blocklist'>, 'context'>): Record<
|
||||
AllStandardObjectFieldName<'blocklist'>,
|
||||
FlatFieldMetadata
|
||||
> => ({
|
||||
}: Omit<
|
||||
CreateStandardFieldArgs<'blocklist', FieldMetadataType>,
|
||||
'context'
|
||||
>): Record<AllStandardObjectFieldName<'blocklist'>, FlatFieldMetadata> => ({
|
||||
// Base fields from BaseWorkspaceEntity
|
||||
id: createStandardFieldFlatMetadata({
|
||||
objectName,
|
||||
@@ -56,7 +57,7 @@ export const buildBlocklistStandardFlatFieldMetadatas = ({
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: {
|
||||
displayFormat: 'RELATIVE',
|
||||
displayFormat: DateDisplayFormat.RELATIVE,
|
||||
},
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
@@ -77,7 +78,7 @@ export const buildBlocklistStandardFlatFieldMetadatas = ({
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: {
|
||||
displayFormat: 'RELATIVE',
|
||||
displayFormat: DateDisplayFormat.RELATIVE,
|
||||
},
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
@@ -97,7 +98,7 @@ export const buildBlocklistStandardFlatFieldMetadatas = ({
|
||||
isNullable: true,
|
||||
isUIReadOnly: true,
|
||||
settings: {
|
||||
displayFormat: 'RELATIVE',
|
||||
displayFormat: DateDisplayFormat.RELATIVE,
|
||||
},
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import {
|
||||
DateDisplayFormat,
|
||||
FieldMetadataType,
|
||||
RelationOnDeleteAction,
|
||||
RelationType,
|
||||
@@ -20,7 +21,7 @@ export const buildCalendarChannelEventAssociationStandardFlatFieldMetadatas = ({
|
||||
dependencyFlatEntityMaps,
|
||||
twentyStandardApplicationId,
|
||||
}: Omit<
|
||||
CreateStandardFieldArgs<'calendarChannelEventAssociation'>,
|
||||
CreateStandardFieldArgs<'calendarChannelEventAssociation', FieldMetadataType>,
|
||||
'context'
|
||||
>): Record<
|
||||
AllStandardObjectFieldName<'calendarChannelEventAssociation'>,
|
||||
@@ -57,7 +58,7 @@ export const buildCalendarChannelEventAssociationStandardFlatFieldMetadatas = ({
|
||||
isNullable: false,
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -76,7 +77,7 @@ export const buildCalendarChannelEventAssociationStandardFlatFieldMetadatas = ({
|
||||
isNullable: false,
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -94,7 +95,7 @@ export const buildCalendarChannelEventAssociationStandardFlatFieldMetadatas = ({
|
||||
icon: 'IconCalendarMinus',
|
||||
isNullable: true,
|
||||
isUIReadOnly: true,
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import {
|
||||
DateDisplayFormat,
|
||||
FieldMetadataType,
|
||||
RelationOnDeleteAction,
|
||||
RelationType,
|
||||
@@ -19,7 +20,10 @@ export const buildCalendarChannelStandardFlatFieldMetadatas = ({
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
twentyStandardApplicationId,
|
||||
}: Omit<CreateStandardFieldArgs<'calendarChannel'>, 'context'>): Record<
|
||||
}: Omit<
|
||||
CreateStandardFieldArgs<'calendarChannel', FieldMetadataType>,
|
||||
'context'
|
||||
>): Record<
|
||||
AllStandardObjectFieldName<'calendarChannel'>,
|
||||
FlatFieldMetadata
|
||||
> => ({
|
||||
@@ -54,7 +58,7 @@ export const buildCalendarChannelStandardFlatFieldMetadatas = ({
|
||||
isNullable: false,
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -73,7 +77,7 @@ export const buildCalendarChannelStandardFlatFieldMetadatas = ({
|
||||
isNullable: false,
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -91,7 +95,7 @@ export const buildCalendarChannelStandardFlatFieldMetadatas = ({
|
||||
icon: 'IconCalendarMinus',
|
||||
isNullable: true,
|
||||
isUIReadOnly: true,
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import {
|
||||
DateDisplayFormat,
|
||||
FieldMetadataType,
|
||||
RelationOnDeleteAction,
|
||||
RelationType,
|
||||
@@ -20,7 +21,7 @@ export const buildCalendarEventParticipantStandardFlatFieldMetadatas = ({
|
||||
dependencyFlatEntityMaps,
|
||||
twentyStandardApplicationId,
|
||||
}: Omit<
|
||||
CreateStandardFieldArgs<'calendarEventParticipant'>,
|
||||
CreateStandardFieldArgs<'calendarEventParticipant', FieldMetadataType>,
|
||||
'context'
|
||||
>): Record<
|
||||
AllStandardObjectFieldName<'calendarEventParticipant'>,
|
||||
@@ -57,7 +58,7 @@ export const buildCalendarEventParticipantStandardFlatFieldMetadatas = ({
|
||||
isNullable: false,
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -76,7 +77,7 @@ export const buildCalendarEventParticipantStandardFlatFieldMetadatas = ({
|
||||
isNullable: false,
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -94,7 +95,7 @@ export const buildCalendarEventParticipantStandardFlatFieldMetadatas = ({
|
||||
icon: 'IconCalendarMinus',
|
||||
isNullable: true,
|
||||
isUIReadOnly: true,
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
|
||||
@@ -1,4 +1,8 @@
|
||||
import { FieldMetadataType, RelationType } from 'twenty-shared/types';
|
||||
import {
|
||||
DateDisplayFormat,
|
||||
FieldMetadataType,
|
||||
RelationType,
|
||||
} from 'twenty-shared/types';
|
||||
|
||||
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';
|
||||
@@ -15,10 +19,10 @@ export const buildCalendarEventStandardFlatFieldMetadatas = ({
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
twentyStandardApplicationId,
|
||||
}: Omit<CreateStandardFieldArgs<'calendarEvent'>, 'context'>): Record<
|
||||
AllStandardObjectFieldName<'calendarEvent'>,
|
||||
FlatFieldMetadata
|
||||
> => ({
|
||||
}: Omit<
|
||||
CreateStandardFieldArgs<'calendarEvent', FieldMetadataType>,
|
||||
'context'
|
||||
>): Record<AllStandardObjectFieldName<'calendarEvent'>, FlatFieldMetadata> => ({
|
||||
id: createStandardFieldFlatMetadata({
|
||||
objectName,
|
||||
workspaceId,
|
||||
@@ -50,7 +54,7 @@ export const buildCalendarEventStandardFlatFieldMetadatas = ({
|
||||
isNullable: false,
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -69,7 +73,7 @@ export const buildCalendarEventStandardFlatFieldMetadatas = ({
|
||||
isNullable: false,
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -87,7 +91,7 @@ export const buildCalendarEventStandardFlatFieldMetadatas = ({
|
||||
icon: 'IconCalendarMinus',
|
||||
isNullable: true,
|
||||
isUIReadOnly: true,
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import {
|
||||
DateDisplayFormat,
|
||||
FieldMetadataType,
|
||||
RelationOnDeleteAction,
|
||||
RelationType,
|
||||
@@ -11,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/workspace-sync-metadata/utils/get-ts-vector-column-expression.util';
|
||||
import { SEARCH_FIELDS_FOR_COMPANY } from 'src/modules/company/standard-objects/company.workspace-entity';
|
||||
|
||||
export const buildCompanyStandardFlatFieldMetadatas = ({
|
||||
now,
|
||||
@@ -19,10 +22,10 @@ export const buildCompanyStandardFlatFieldMetadatas = ({
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
twentyStandardApplicationId,
|
||||
}: Omit<CreateStandardFieldArgs<'company'>, 'context'>): Record<
|
||||
AllStandardObjectFieldName<'company'>,
|
||||
FlatFieldMetadata
|
||||
> => ({
|
||||
}: Omit<
|
||||
CreateStandardFieldArgs<'company', FieldMetadataType>,
|
||||
'context'
|
||||
>): Record<AllStandardObjectFieldName<'company'>, FlatFieldMetadata> => ({
|
||||
// Base fields from BaseWorkspaceEntity
|
||||
id: createStandardFieldFlatMetadata({
|
||||
objectName,
|
||||
@@ -56,7 +59,7 @@ export const buildCompanyStandardFlatFieldMetadatas = ({
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: {
|
||||
displayFormat: 'RELATIVE',
|
||||
displayFormat: DateDisplayFormat.RELATIVE,
|
||||
},
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
@@ -77,7 +80,7 @@ export const buildCompanyStandardFlatFieldMetadatas = ({
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: {
|
||||
displayFormat: 'RELATIVE',
|
||||
displayFormat: DateDisplayFormat.RELATIVE,
|
||||
},
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
@@ -97,7 +100,7 @@ export const buildCompanyStandardFlatFieldMetadatas = ({
|
||||
isNullable: true,
|
||||
isUIReadOnly: true,
|
||||
settings: {
|
||||
displayFormat: 'RELATIVE',
|
||||
displayFormat: DateDisplayFormat.RELATIVE,
|
||||
},
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
@@ -160,23 +163,6 @@ export const buildCompanyStandardFlatFieldMetadatas = ({
|
||||
twentyStandardApplicationId,
|
||||
now,
|
||||
}),
|
||||
addressOld: createStandardFieldFlatMetadata({
|
||||
objectName,
|
||||
workspaceId,
|
||||
context: {
|
||||
fieldName: 'addressOld',
|
||||
type: FieldMetadataType.TEXT,
|
||||
label: 'Address (deprecated)',
|
||||
description:
|
||||
'Address of the company - deprecated in favor of new address field',
|
||||
icon: 'IconMap',
|
||||
isNullable: true,
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
twentyStandardApplicationId,
|
||||
now,
|
||||
}),
|
||||
employees: createStandardFieldFlatMetadata({
|
||||
objectName,
|
||||
workspaceId,
|
||||
@@ -289,6 +275,11 @@ export const buildCompanyStandardFlatFieldMetadatas = ({
|
||||
icon: 'IconCreativeCommonsSa',
|
||||
isUIReadOnly: true,
|
||||
isNullable: false,
|
||||
defaultValue: {
|
||||
source: "'MANUAL'",
|
||||
name: "'System'",
|
||||
workspaceMemberId: null,
|
||||
},
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -306,6 +297,12 @@ export const buildCompanyStandardFlatFieldMetadatas = ({
|
||||
icon: 'IconUser',
|
||||
isSystem: true,
|
||||
isNullable: true,
|
||||
settings: {
|
||||
generatedType: 'STORED',
|
||||
asExpression: getTsVectorColumnExpressionFromFields(
|
||||
SEARCH_FIELDS_FOR_COMPANY,
|
||||
),
|
||||
},
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import {
|
||||
DateDisplayFormat,
|
||||
FieldMetadataType,
|
||||
RelationOnDeleteAction,
|
||||
RelationType,
|
||||
@@ -19,7 +20,10 @@ export const buildConnectedAccountStandardFlatFieldMetadatas = ({
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
twentyStandardApplicationId,
|
||||
}: Omit<CreateStandardFieldArgs<'connectedAccount'>, 'context'>): Record<
|
||||
}: Omit<
|
||||
CreateStandardFieldArgs<'connectedAccount', FieldMetadataType>,
|
||||
'context'
|
||||
>): Record<
|
||||
AllStandardObjectFieldName<'connectedAccount'>,
|
||||
FlatFieldMetadata
|
||||
> => ({
|
||||
@@ -54,7 +58,7 @@ export const buildConnectedAccountStandardFlatFieldMetadatas = ({
|
||||
isNullable: false,
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -73,7 +77,7 @@ export const buildConnectedAccountStandardFlatFieldMetadatas = ({
|
||||
isNullable: false,
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -91,7 +95,7 @@ export const buildConnectedAccountStandardFlatFieldMetadatas = ({
|
||||
icon: 'IconCalendarMinus',
|
||||
isNullable: true,
|
||||
isUIReadOnly: true,
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
|
||||
@@ -1,4 +1,8 @@
|
||||
import { FieldMetadataType, RelationType } from 'twenty-shared/types';
|
||||
import {
|
||||
DateDisplayFormat,
|
||||
FieldMetadataType,
|
||||
RelationType,
|
||||
} from 'twenty-shared/types';
|
||||
|
||||
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';
|
||||
@@ -7,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/workspace-sync-metadata/utils/get-ts-vector-column-expression.util';
|
||||
import { SEARCH_FIELDS_FOR_DASHBOARD } from 'src/modules/dashboard/standard-objects/dashboard.workspace-entity';
|
||||
|
||||
export const buildDashboardStandardFlatFieldMetadatas = ({
|
||||
now,
|
||||
@@ -15,10 +21,10 @@ export const buildDashboardStandardFlatFieldMetadatas = ({
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
twentyStandardApplicationId,
|
||||
}: Omit<CreateStandardFieldArgs<'dashboard'>, 'context'>): Record<
|
||||
AllStandardObjectFieldName<'dashboard'>,
|
||||
FlatFieldMetadata
|
||||
> => ({
|
||||
}: Omit<
|
||||
CreateStandardFieldArgs<'dashboard', FieldMetadataType>,
|
||||
'context'
|
||||
>): Record<AllStandardObjectFieldName<'dashboard'>, FlatFieldMetadata> => ({
|
||||
// Base fields from BaseWorkspaceEntity
|
||||
id: createStandardFieldFlatMetadata({
|
||||
objectName,
|
||||
@@ -51,7 +57,7 @@ export const buildDashboardStandardFlatFieldMetadatas = ({
|
||||
isNullable: false,
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -70,7 +76,7 @@ export const buildDashboardStandardFlatFieldMetadatas = ({
|
||||
isNullable: false,
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -88,7 +94,7 @@ export const buildDashboardStandardFlatFieldMetadatas = ({
|
||||
icon: 'IconCalendarMinus',
|
||||
isNullable: true,
|
||||
isUIReadOnly: true,
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -159,6 +165,11 @@ export const buildDashboardStandardFlatFieldMetadatas = ({
|
||||
icon: 'IconCreativeCommonsSa',
|
||||
isUIReadOnly: true,
|
||||
isNullable: false,
|
||||
defaultValue: {
|
||||
source: "'MANUAL'",
|
||||
name: "'System'",
|
||||
workspaceMemberId: null,
|
||||
},
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -176,6 +187,12 @@ export const buildDashboardStandardFlatFieldMetadatas = ({
|
||||
icon: 'IconUser',
|
||||
isSystem: true,
|
||||
isNullable: true,
|
||||
settings: {
|
||||
generatedType: 'STORED',
|
||||
asExpression: getTsVectorColumnExpressionFromFields(
|
||||
SEARCH_FIELDS_FOR_DASHBOARD,
|
||||
),
|
||||
},
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
|
||||
@@ -1,4 +1,8 @@
|
||||
import { FieldMetadataType, RelationType } from 'twenty-shared/types';
|
||||
import {
|
||||
DateDisplayFormat,
|
||||
FieldMetadataType,
|
||||
RelationType,
|
||||
} from 'twenty-shared/types';
|
||||
|
||||
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';
|
||||
@@ -15,7 +19,10 @@ export const buildFavoriteFolderStandardFlatFieldMetadatas = ({
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
twentyStandardApplicationId,
|
||||
}: Omit<CreateStandardFieldArgs<'favoriteFolder'>, 'context'>): Record<
|
||||
}: Omit<
|
||||
CreateStandardFieldArgs<'favoriteFolder', FieldMetadataType>,
|
||||
'context'
|
||||
>): Record<
|
||||
AllStandardObjectFieldName<'favoriteFolder'>,
|
||||
FlatFieldMetadata
|
||||
> => ({
|
||||
@@ -51,7 +58,7 @@ export const buildFavoriteFolderStandardFlatFieldMetadatas = ({
|
||||
isNullable: false,
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -70,7 +77,7 @@ export const buildFavoriteFolderStandardFlatFieldMetadatas = ({
|
||||
isNullable: false,
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -88,7 +95,7 @@ export const buildFavoriteFolderStandardFlatFieldMetadatas = ({
|
||||
icon: 'IconCalendarMinus',
|
||||
isNullable: true,
|
||||
isUIReadOnly: true,
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import {
|
||||
DateDisplayFormat,
|
||||
FieldMetadataType,
|
||||
RelationOnDeleteAction,
|
||||
RelationType,
|
||||
@@ -19,10 +20,10 @@ export const buildFavoriteStandardFlatFieldMetadatas = ({
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
twentyStandardApplicationId,
|
||||
}: Omit<CreateStandardFieldArgs<'favorite'>, 'context'>): Record<
|
||||
AllStandardObjectFieldName<'favorite'>,
|
||||
FlatFieldMetadata
|
||||
> => ({
|
||||
}: Omit<
|
||||
CreateStandardFieldArgs<'favorite', FieldMetadataType>,
|
||||
'context'
|
||||
>): Record<AllStandardObjectFieldName<'favorite'>, FlatFieldMetadata> => ({
|
||||
// Base fields from BaseWorkspaceEntity
|
||||
id: createStandardFieldFlatMetadata({
|
||||
objectName,
|
||||
@@ -55,7 +56,7 @@ export const buildFavoriteStandardFlatFieldMetadatas = ({
|
||||
isNullable: false,
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -74,7 +75,7 @@ export const buildFavoriteStandardFlatFieldMetadatas = ({
|
||||
isNullable: false,
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -92,7 +93,7 @@ export const buildFavoriteStandardFlatFieldMetadatas = ({
|
||||
icon: 'IconCalendarMinus',
|
||||
isNullable: true,
|
||||
isUIReadOnly: true,
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -119,11 +120,11 @@ export const buildFavoriteStandardFlatFieldMetadatas = ({
|
||||
twentyStandardApplicationId,
|
||||
now,
|
||||
}),
|
||||
view: createStandardFieldFlatMetadata({
|
||||
viewId: createStandardFieldFlatMetadata({
|
||||
objectName,
|
||||
workspaceId,
|
||||
context: {
|
||||
fieldName: 'view',
|
||||
fieldName: 'viewId',
|
||||
type: FieldMetadataType.UUID,
|
||||
label: 'ViewId',
|
||||
description: 'ViewId',
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import {
|
||||
DateDisplayFormat,
|
||||
FieldMetadataType,
|
||||
RelationOnDeleteAction,
|
||||
RelationType,
|
||||
@@ -22,7 +23,10 @@ export const buildMessageChannelMessageAssociationStandardFlatFieldMetadatas =
|
||||
dependencyFlatEntityMaps,
|
||||
twentyStandardApplicationId,
|
||||
}: Omit<
|
||||
CreateStandardFieldArgs<'messageChannelMessageAssociation'>,
|
||||
CreateStandardFieldArgs<
|
||||
'messageChannelMessageAssociation',
|
||||
FieldMetadataType
|
||||
>,
|
||||
'context'
|
||||
>): Record<
|
||||
AllStandardObjectFieldName<'messageChannelMessageAssociation'>,
|
||||
@@ -59,7 +63,7 @@ export const buildMessageChannelMessageAssociationStandardFlatFieldMetadatas =
|
||||
isNullable: false,
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -78,7 +82,7 @@ export const buildMessageChannelMessageAssociationStandardFlatFieldMetadatas =
|
||||
isNullable: false,
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -96,7 +100,7 @@ export const buildMessageChannelMessageAssociationStandardFlatFieldMetadatas =
|
||||
icon: 'IconCalendarMinus',
|
||||
isNullable: true,
|
||||
isUIReadOnly: true,
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import {
|
||||
DateDisplayFormat,
|
||||
FieldMetadataType,
|
||||
RelationOnDeleteAction,
|
||||
RelationType,
|
||||
@@ -20,7 +21,10 @@ export const buildMessageChannelStandardFlatFieldMetadatas = ({
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
twentyStandardApplicationId,
|
||||
}: Omit<CreateStandardFieldArgs<'messageChannel'>, 'context'>): Record<
|
||||
}: Omit<
|
||||
CreateStandardFieldArgs<'messageChannel', FieldMetadataType>,
|
||||
'context'
|
||||
>): Record<
|
||||
AllStandardObjectFieldName<'messageChannel'>,
|
||||
FlatFieldMetadata
|
||||
> => ({
|
||||
@@ -55,7 +59,7 @@ export const buildMessageChannelStandardFlatFieldMetadatas = ({
|
||||
isNullable: false,
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -74,7 +78,7 @@ export const buildMessageChannelStandardFlatFieldMetadatas = ({
|
||||
isNullable: false,
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -92,7 +96,7 @@ export const buildMessageChannelStandardFlatFieldMetadatas = ({
|
||||
icon: 'IconCalendarMinus',
|
||||
isNullable: true,
|
||||
isUIReadOnly: true,
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import {
|
||||
DateDisplayFormat,
|
||||
FieldMetadataType,
|
||||
RelationOnDeleteAction,
|
||||
RelationType,
|
||||
@@ -19,10 +20,10 @@ export const buildMessageFolderStandardFlatFieldMetadatas = ({
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
twentyStandardApplicationId,
|
||||
}: Omit<CreateStandardFieldArgs<'messageFolder'>, 'context'>): Record<
|
||||
AllStandardObjectFieldName<'messageFolder'>,
|
||||
FlatFieldMetadata
|
||||
> => ({
|
||||
}: Omit<
|
||||
CreateStandardFieldArgs<'messageFolder', FieldMetadataType>,
|
||||
'context'
|
||||
>): Record<AllStandardObjectFieldName<'messageFolder'>, FlatFieldMetadata> => ({
|
||||
id: createStandardFieldFlatMetadata({
|
||||
objectName,
|
||||
workspaceId,
|
||||
@@ -54,7 +55,7 @@ export const buildMessageFolderStandardFlatFieldMetadatas = ({
|
||||
isNullable: false,
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -73,7 +74,7 @@ export const buildMessageFolderStandardFlatFieldMetadatas = ({
|
||||
isNullable: false,
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -91,7 +92,7 @@ export const buildMessageFolderStandardFlatFieldMetadatas = ({
|
||||
icon: 'IconCalendarMinus',
|
||||
isNullable: true,
|
||||
isUIReadOnly: true,
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import {
|
||||
DateDisplayFormat,
|
||||
FieldMetadataType,
|
||||
MessageParticipantRole,
|
||||
RelationOnDeleteAction,
|
||||
@@ -20,7 +21,10 @@ export const buildMessageParticipantStandardFlatFieldMetadatas = ({
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
twentyStandardApplicationId,
|
||||
}: Omit<CreateStandardFieldArgs<'messageParticipant'>, 'context'>): Record<
|
||||
}: Omit<
|
||||
CreateStandardFieldArgs<'messageParticipant', FieldMetadataType>,
|
||||
'context'
|
||||
>): Record<
|
||||
AllStandardObjectFieldName<'messageParticipant'>,
|
||||
FlatFieldMetadata
|
||||
> => ({
|
||||
@@ -55,7 +59,7 @@ export const buildMessageParticipantStandardFlatFieldMetadatas = ({
|
||||
isNullable: false,
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -74,7 +78,7 @@ export const buildMessageParticipantStandardFlatFieldMetadatas = ({
|
||||
isNullable: false,
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -92,7 +96,7 @@ export const buildMessageParticipantStandardFlatFieldMetadatas = ({
|
||||
icon: 'IconCalendarMinus',
|
||||
isNullable: true,
|
||||
isUIReadOnly: true,
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import {
|
||||
DateDisplayFormat,
|
||||
FieldMetadataType,
|
||||
RelationOnDeleteAction,
|
||||
RelationType,
|
||||
@@ -19,10 +20,10 @@ export const buildMessageStandardFlatFieldMetadatas = ({
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
twentyStandardApplicationId,
|
||||
}: Omit<CreateStandardFieldArgs<'message'>, 'context'>): Record<
|
||||
AllStandardObjectFieldName<'message'>,
|
||||
FlatFieldMetadata
|
||||
> => ({
|
||||
}: Omit<
|
||||
CreateStandardFieldArgs<'message', FieldMetadataType>,
|
||||
'context'
|
||||
>): Record<AllStandardObjectFieldName<'message'>, FlatFieldMetadata> => ({
|
||||
id: createStandardFieldFlatMetadata({
|
||||
objectName,
|
||||
workspaceId,
|
||||
@@ -54,7 +55,7 @@ export const buildMessageStandardFlatFieldMetadatas = ({
|
||||
isNullable: false,
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -73,7 +74,7 @@ export const buildMessageStandardFlatFieldMetadatas = ({
|
||||
isNullable: false,
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -91,7 +92,7 @@ export const buildMessageStandardFlatFieldMetadatas = ({
|
||||
icon: 'IconCalendarMinus',
|
||||
isNullable: true,
|
||||
isUIReadOnly: true,
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
|
||||
@@ -1,4 +1,8 @@
|
||||
import { FieldMetadataType, RelationType } from 'twenty-shared/types';
|
||||
import {
|
||||
DateDisplayFormat,
|
||||
FieldMetadataType,
|
||||
RelationType,
|
||||
} from 'twenty-shared/types';
|
||||
|
||||
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';
|
||||
@@ -15,10 +19,10 @@ export const buildMessageThreadStandardFlatFieldMetadatas = ({
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
twentyStandardApplicationId,
|
||||
}: Omit<CreateStandardFieldArgs<'messageThread'>, 'context'>): Record<
|
||||
AllStandardObjectFieldName<'messageThread'>,
|
||||
FlatFieldMetadata
|
||||
> => ({
|
||||
}: Omit<
|
||||
CreateStandardFieldArgs<'messageThread', FieldMetadataType>,
|
||||
'context'
|
||||
>): Record<AllStandardObjectFieldName<'messageThread'>, FlatFieldMetadata> => ({
|
||||
id: createStandardFieldFlatMetadata({
|
||||
objectName,
|
||||
workspaceId,
|
||||
@@ -50,7 +54,7 @@ export const buildMessageThreadStandardFlatFieldMetadatas = ({
|
||||
isNullable: false,
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -69,7 +73,7 @@ export const buildMessageThreadStandardFlatFieldMetadatas = ({
|
||||
isNullable: false,
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -87,7 +91,7 @@ export const buildMessageThreadStandardFlatFieldMetadatas = ({
|
||||
icon: 'IconCalendarMinus',
|
||||
isNullable: true,
|
||||
isUIReadOnly: true,
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
|
||||
@@ -1,4 +1,8 @@
|
||||
import { FieldMetadataType, RelationType } from 'twenty-shared/types';
|
||||
import {
|
||||
DateDisplayFormat,
|
||||
FieldMetadataType,
|
||||
RelationType,
|
||||
} from 'twenty-shared/types';
|
||||
|
||||
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';
|
||||
@@ -7,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/workspace-sync-metadata/utils/get-ts-vector-column-expression.util';
|
||||
import { SEARCH_FIELDS_FOR_NOTES } from 'src/modules/note/standard-objects/note.workspace-entity';
|
||||
|
||||
export const buildNoteStandardFlatFieldMetadatas = ({
|
||||
now,
|
||||
@@ -15,7 +21,7 @@ export const buildNoteStandardFlatFieldMetadatas = ({
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
twentyStandardApplicationId,
|
||||
}: Omit<CreateStandardFieldArgs<'note'>, 'context'>): Record<
|
||||
}: Omit<CreateStandardFieldArgs<'note', FieldMetadataType>, 'context'>): Record<
|
||||
AllStandardObjectFieldName<'note'>,
|
||||
FlatFieldMetadata
|
||||
> => ({
|
||||
@@ -52,7 +58,7 @@ export const buildNoteStandardFlatFieldMetadatas = ({
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: {
|
||||
displayFormat: 'RELATIVE',
|
||||
displayFormat: DateDisplayFormat.RELATIVE,
|
||||
},
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
@@ -73,7 +79,7 @@ export const buildNoteStandardFlatFieldMetadatas = ({
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: {
|
||||
displayFormat: 'RELATIVE',
|
||||
displayFormat: DateDisplayFormat.RELATIVE,
|
||||
},
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
@@ -93,7 +99,7 @@ export const buildNoteStandardFlatFieldMetadatas = ({
|
||||
isNullable: true,
|
||||
isUIReadOnly: true,
|
||||
settings: {
|
||||
displayFormat: 'RELATIVE',
|
||||
displayFormat: DateDisplayFormat.RELATIVE,
|
||||
},
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
@@ -137,22 +143,6 @@ export const buildNoteStandardFlatFieldMetadatas = ({
|
||||
twentyStandardApplicationId,
|
||||
now,
|
||||
}),
|
||||
body: createStandardFieldFlatMetadata({
|
||||
objectName,
|
||||
workspaceId,
|
||||
context: {
|
||||
fieldName: 'body',
|
||||
type: FieldMetadataType.TEXT,
|
||||
label: 'Body (deprecated)',
|
||||
description: 'Note body (deprecated - use bodyV2)',
|
||||
icon: 'IconFilePencil',
|
||||
isNullable: true,
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
twentyStandardApplicationId,
|
||||
now,
|
||||
}),
|
||||
bodyV2: createStandardFieldFlatMetadata({
|
||||
objectName,
|
||||
workspaceId,
|
||||
@@ -180,6 +170,11 @@ export const buildNoteStandardFlatFieldMetadatas = ({
|
||||
icon: 'IconCreativeCommonsSa',
|
||||
isUIReadOnly: true,
|
||||
isNullable: false,
|
||||
defaultValue: {
|
||||
source: "'MANUAL'",
|
||||
name: "'System'",
|
||||
workspaceMemberId: null,
|
||||
},
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -197,6 +192,12 @@ export const buildNoteStandardFlatFieldMetadatas = ({
|
||||
icon: 'IconUser',
|
||||
isSystem: true,
|
||||
isNullable: true,
|
||||
settings: {
|
||||
generatedType: 'STORED',
|
||||
asExpression: getTsVectorColumnExpressionFromFields(
|
||||
SEARCH_FIELDS_FOR_NOTES,
|
||||
),
|
||||
},
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import {
|
||||
DateDisplayFormat,
|
||||
FieldMetadataType,
|
||||
RelationOnDeleteAction,
|
||||
RelationType,
|
||||
@@ -19,10 +20,10 @@ export const buildNoteTargetStandardFlatFieldMetadatas = ({
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
twentyStandardApplicationId,
|
||||
}: Omit<CreateStandardFieldArgs<'noteTarget'>, 'context'>): Record<
|
||||
AllStandardObjectFieldName<'noteTarget'>,
|
||||
FlatFieldMetadata
|
||||
> => ({
|
||||
}: Omit<
|
||||
CreateStandardFieldArgs<'noteTarget', FieldMetadataType>,
|
||||
'context'
|
||||
>): Record<AllStandardObjectFieldName<'noteTarget'>, FlatFieldMetadata> => ({
|
||||
// Base fields from BaseWorkspaceEntity
|
||||
id: createStandardFieldFlatMetadata({
|
||||
objectName,
|
||||
@@ -56,7 +57,7 @@ export const buildNoteTargetStandardFlatFieldMetadatas = ({
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: {
|
||||
displayFormat: 'RELATIVE',
|
||||
displayFormat: DateDisplayFormat.RELATIVE,
|
||||
},
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
@@ -77,7 +78,7 @@ export const buildNoteTargetStandardFlatFieldMetadatas = ({
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: {
|
||||
displayFormat: 'RELATIVE',
|
||||
displayFormat: DateDisplayFormat.RELATIVE,
|
||||
},
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
@@ -97,7 +98,7 @@ export const buildNoteTargetStandardFlatFieldMetadatas = ({
|
||||
isNullable: true,
|
||||
isUIReadOnly: true,
|
||||
settings: {
|
||||
displayFormat: 'RELATIVE',
|
||||
displayFormat: DateDisplayFormat.RELATIVE,
|
||||
},
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import {
|
||||
DateDisplayFormat,
|
||||
FieldMetadataType,
|
||||
RelationOnDeleteAction,
|
||||
RelationType,
|
||||
@@ -11,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/workspace-sync-metadata/utils/get-ts-vector-column-expression.util';
|
||||
import { SEARCH_FIELDS_FOR_OPPORTUNITY } from 'src/modules/opportunity/standard-objects/opportunity.workspace-entity';
|
||||
|
||||
export const buildOpportunityStandardFlatFieldMetadatas = ({
|
||||
now,
|
||||
@@ -19,10 +22,10 @@ export const buildOpportunityStandardFlatFieldMetadatas = ({
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
twentyStandardApplicationId,
|
||||
}: Omit<CreateStandardFieldArgs<'opportunity'>, 'context'>): Record<
|
||||
AllStandardObjectFieldName<'opportunity'>,
|
||||
FlatFieldMetadata
|
||||
> => ({
|
||||
}: Omit<
|
||||
CreateStandardFieldArgs<'opportunity', FieldMetadataType>,
|
||||
'context'
|
||||
>): Record<AllStandardObjectFieldName<'opportunity'>, FlatFieldMetadata> => ({
|
||||
// Base fields from BaseWorkspaceEntity
|
||||
id: createStandardFieldFlatMetadata({
|
||||
objectName,
|
||||
@@ -56,7 +59,7 @@ export const buildOpportunityStandardFlatFieldMetadatas = ({
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: {
|
||||
displayFormat: 'RELATIVE',
|
||||
displayFormat: DateDisplayFormat.RELATIVE,
|
||||
},
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
@@ -77,7 +80,7 @@ export const buildOpportunityStandardFlatFieldMetadatas = ({
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: {
|
||||
displayFormat: 'RELATIVE',
|
||||
displayFormat: DateDisplayFormat.RELATIVE,
|
||||
},
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
@@ -97,7 +100,7 @@ export const buildOpportunityStandardFlatFieldMetadatas = ({
|
||||
isNullable: true,
|
||||
isUIReadOnly: true,
|
||||
settings: {
|
||||
displayFormat: 'RELATIVE',
|
||||
displayFormat: DateDisplayFormat.RELATIVE,
|
||||
},
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
@@ -218,6 +221,11 @@ export const buildOpportunityStandardFlatFieldMetadatas = ({
|
||||
icon: 'IconCreativeCommonsSa',
|
||||
isUIReadOnly: true,
|
||||
isNullable: false,
|
||||
defaultValue: {
|
||||
source: "'MANUAL'",
|
||||
name: "'System'",
|
||||
workspaceMemberId: null,
|
||||
},
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -235,6 +243,12 @@ export const buildOpportunityStandardFlatFieldMetadatas = ({
|
||||
icon: 'IconUser',
|
||||
isSystem: true,
|
||||
isNullable: true,
|
||||
settings: {
|
||||
generatedType: 'STORED',
|
||||
asExpression: getTsVectorColumnExpressionFromFields(
|
||||
SEARCH_FIELDS_FOR_OPPORTUNITY,
|
||||
),
|
||||
},
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import {
|
||||
DateDisplayFormat,
|
||||
FieldMetadataType,
|
||||
RelationOnDeleteAction,
|
||||
RelationType,
|
||||
@@ -11,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/workspace-sync-metadata/utils/get-ts-vector-column-expression.util';
|
||||
import { SEARCH_FIELDS_FOR_PERSON } from 'src/modules/person/standard-objects/person.workspace-entity';
|
||||
|
||||
export const buildPersonStandardFlatFieldMetadatas = ({
|
||||
now,
|
||||
@@ -19,10 +22,10 @@ export const buildPersonStandardFlatFieldMetadatas = ({
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
twentyStandardApplicationId,
|
||||
}: Omit<CreateStandardFieldArgs<'person'>, 'context'>): Record<
|
||||
AllStandardObjectFieldName<'person'>,
|
||||
FlatFieldMetadata
|
||||
> => ({
|
||||
}: Omit<
|
||||
CreateStandardFieldArgs<'person', FieldMetadataType>,
|
||||
'context'
|
||||
>): Record<AllStandardObjectFieldName<'person'>, FlatFieldMetadata> => ({
|
||||
// Base fields from BaseWorkspaceEntity
|
||||
id: createStandardFieldFlatMetadata({
|
||||
objectName,
|
||||
@@ -56,7 +59,7 @@ export const buildPersonStandardFlatFieldMetadatas = ({
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: {
|
||||
displayFormat: 'RELATIVE',
|
||||
displayFormat: DateDisplayFormat.RELATIVE,
|
||||
},
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
@@ -77,7 +80,7 @@ export const buildPersonStandardFlatFieldMetadatas = ({
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: {
|
||||
displayFormat: 'RELATIVE',
|
||||
displayFormat: DateDisplayFormat.RELATIVE,
|
||||
},
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
@@ -97,7 +100,7 @@ export const buildPersonStandardFlatFieldMetadatas = ({
|
||||
isNullable: true,
|
||||
isUIReadOnly: true,
|
||||
settings: {
|
||||
displayFormat: 'RELATIVE',
|
||||
displayFormat: DateDisplayFormat.RELATIVE,
|
||||
},
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
@@ -123,22 +126,6 @@ export const buildPersonStandardFlatFieldMetadatas = ({
|
||||
twentyStandardApplicationId,
|
||||
now,
|
||||
}),
|
||||
email: createStandardFieldFlatMetadata({
|
||||
objectName,
|
||||
workspaceId,
|
||||
context: {
|
||||
fieldName: 'email',
|
||||
type: FieldMetadataType.TEXT,
|
||||
label: 'Email',
|
||||
description: "Contact's Email (deprecated)",
|
||||
icon: 'IconMail',
|
||||
isNullable: true,
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
twentyStandardApplicationId,
|
||||
now,
|
||||
}),
|
||||
emails: createStandardFieldFlatMetadata({
|
||||
objectName,
|
||||
workspaceId,
|
||||
@@ -207,22 +194,6 @@ export const buildPersonStandardFlatFieldMetadatas = ({
|
||||
twentyStandardApplicationId,
|
||||
now,
|
||||
}),
|
||||
phone: createStandardFieldFlatMetadata({
|
||||
objectName,
|
||||
workspaceId,
|
||||
context: {
|
||||
fieldName: 'phone',
|
||||
type: FieldMetadataType.TEXT,
|
||||
label: 'Phone',
|
||||
description: "Contact's phone number (deprecated)",
|
||||
icon: 'IconPhone',
|
||||
isNullable: true,
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
twentyStandardApplicationId,
|
||||
now,
|
||||
}),
|
||||
phones: createStandardFieldFlatMetadata({
|
||||
objectName,
|
||||
workspaceId,
|
||||
@@ -304,6 +275,11 @@ export const buildPersonStandardFlatFieldMetadatas = ({
|
||||
icon: 'IconCreativeCommonsSa',
|
||||
isUIReadOnly: true,
|
||||
isNullable: false,
|
||||
defaultValue: {
|
||||
source: "'MANUAL'",
|
||||
name: "'System'",
|
||||
workspaceMemberId: null,
|
||||
},
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -531,6 +507,12 @@ export const buildPersonStandardFlatFieldMetadatas = ({
|
||||
icon: 'IconUser',
|
||||
isSystem: true,
|
||||
isNullable: true,
|
||||
settings: {
|
||||
generatedType: 'STORED',
|
||||
asExpression: getTsVectorColumnExpressionFromFields(
|
||||
SEARCH_FIELDS_FOR_PERSON,
|
||||
),
|
||||
},
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import {
|
||||
DateDisplayFormat,
|
||||
FieldMetadataType,
|
||||
RelationOnDeleteAction,
|
||||
RelationType,
|
||||
@@ -11,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/workspace-sync-metadata/utils/get-ts-vector-column-expression.util';
|
||||
import { SEARCH_FIELDS_FOR_TASKS } from 'src/modules/task/standard-objects/task.workspace-entity';
|
||||
|
||||
export const buildTaskStandardFlatFieldMetadatas = ({
|
||||
now,
|
||||
@@ -19,7 +22,7 @@ export const buildTaskStandardFlatFieldMetadatas = ({
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
twentyStandardApplicationId,
|
||||
}: Omit<CreateStandardFieldArgs<'task'>, 'context'>): Record<
|
||||
}: Omit<CreateStandardFieldArgs<'task', FieldMetadataType>, 'context'>): Record<
|
||||
AllStandardObjectFieldName<'task'>,
|
||||
FlatFieldMetadata
|
||||
> => ({
|
||||
@@ -56,7 +59,7 @@ export const buildTaskStandardFlatFieldMetadatas = ({
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: {
|
||||
displayFormat: 'RELATIVE',
|
||||
displayFormat: DateDisplayFormat.RELATIVE,
|
||||
},
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
@@ -77,7 +80,7 @@ export const buildTaskStandardFlatFieldMetadatas = ({
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: {
|
||||
displayFormat: 'RELATIVE',
|
||||
displayFormat: DateDisplayFormat.RELATIVE,
|
||||
},
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
@@ -97,7 +100,7 @@ export const buildTaskStandardFlatFieldMetadatas = ({
|
||||
isNullable: true,
|
||||
isUIReadOnly: true,
|
||||
settings: {
|
||||
displayFormat: 'RELATIVE',
|
||||
displayFormat: DateDisplayFormat.RELATIVE,
|
||||
},
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
@@ -141,22 +144,6 @@ export const buildTaskStandardFlatFieldMetadatas = ({
|
||||
twentyStandardApplicationId,
|
||||
now,
|
||||
}),
|
||||
body: createStandardFieldFlatMetadata({
|
||||
objectName,
|
||||
workspaceId,
|
||||
context: {
|
||||
fieldName: 'body',
|
||||
type: FieldMetadataType.TEXT,
|
||||
label: 'Body (deprecated)',
|
||||
description: 'Task body (deprecated - use bodyV2)',
|
||||
icon: 'IconFilePencil',
|
||||
isNullable: true,
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
twentyStandardApplicationId,
|
||||
now,
|
||||
}),
|
||||
bodyV2: createStandardFieldFlatMetadata({
|
||||
objectName,
|
||||
workspaceId,
|
||||
@@ -227,6 +214,11 @@ export const buildTaskStandardFlatFieldMetadatas = ({
|
||||
icon: 'IconCreativeCommonsSa',
|
||||
isUIReadOnly: true,
|
||||
isNullable: false,
|
||||
defaultValue: {
|
||||
source: "'MANUAL'",
|
||||
name: "'System'",
|
||||
workspaceMemberId: null,
|
||||
},
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -244,6 +236,12 @@ export const buildTaskStandardFlatFieldMetadatas = ({
|
||||
icon: 'IconUser',
|
||||
isSystem: true,
|
||||
isNullable: true,
|
||||
settings: {
|
||||
generatedType: 'STORED',
|
||||
asExpression: getTsVectorColumnExpressionFromFields(
|
||||
SEARCH_FIELDS_FOR_TASKS,
|
||||
),
|
||||
},
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import {
|
||||
DateDisplayFormat,
|
||||
FieldMetadataType,
|
||||
RelationOnDeleteAction,
|
||||
RelationType,
|
||||
@@ -19,10 +20,10 @@ export const buildTaskTargetStandardFlatFieldMetadatas = ({
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
twentyStandardApplicationId,
|
||||
}: Omit<CreateStandardFieldArgs<'taskTarget'>, 'context'>): Record<
|
||||
AllStandardObjectFieldName<'taskTarget'>,
|
||||
FlatFieldMetadata
|
||||
> => ({
|
||||
}: Omit<
|
||||
CreateStandardFieldArgs<'taskTarget', FieldMetadataType>,
|
||||
'context'
|
||||
>): Record<AllStandardObjectFieldName<'taskTarget'>, FlatFieldMetadata> => ({
|
||||
// Base fields from BaseWorkspaceEntity
|
||||
id: createStandardFieldFlatMetadata({
|
||||
objectName,
|
||||
@@ -56,7 +57,7 @@ export const buildTaskTargetStandardFlatFieldMetadatas = ({
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: {
|
||||
displayFormat: 'RELATIVE',
|
||||
displayFormat: DateDisplayFormat.RELATIVE,
|
||||
},
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
@@ -77,7 +78,7 @@ export const buildTaskTargetStandardFlatFieldMetadatas = ({
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: {
|
||||
displayFormat: 'RELATIVE',
|
||||
displayFormat: DateDisplayFormat.RELATIVE,
|
||||
},
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
@@ -97,7 +98,7 @@ export const buildTaskTargetStandardFlatFieldMetadatas = ({
|
||||
isNullable: true,
|
||||
isUIReadOnly: true,
|
||||
settings: {
|
||||
displayFormat: 'RELATIVE',
|
||||
displayFormat: DateDisplayFormat.RELATIVE,
|
||||
},
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import {
|
||||
DateDisplayFormat,
|
||||
FieldMetadataType,
|
||||
RelationOnDeleteAction,
|
||||
RelationType,
|
||||
@@ -20,7 +21,10 @@ export const buildTimelineActivityStandardFlatFieldMetadatas = ({
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
twentyStandardApplicationId,
|
||||
}: Omit<CreateStandardFieldArgs<'timelineActivity'>, 'context'>): Record<
|
||||
}: Omit<
|
||||
CreateStandardFieldArgs<'timelineActivity', FieldMetadataType>,
|
||||
'context'
|
||||
>): Record<
|
||||
AllStandardObjectFieldName<'timelineActivity'>,
|
||||
FlatFieldMetadata
|
||||
> => ({
|
||||
@@ -56,7 +60,7 @@ export const buildTimelineActivityStandardFlatFieldMetadatas = ({
|
||||
isNullable: false,
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -75,7 +79,7 @@ export const buildTimelineActivityStandardFlatFieldMetadatas = ({
|
||||
isNullable: false,
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -93,7 +97,7 @@ export const buildTimelineActivityStandardFlatFieldMetadatas = ({
|
||||
icon: 'IconCalendarMinus',
|
||||
isNullable: true,
|
||||
isUIReadOnly: true,
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import {
|
||||
DateDisplayFormat,
|
||||
FieldMetadataType,
|
||||
RelationOnDeleteAction,
|
||||
RelationType,
|
||||
@@ -20,7 +21,7 @@ export const buildWorkflowAutomatedTriggerStandardFlatFieldMetadatas = ({
|
||||
dependencyFlatEntityMaps,
|
||||
twentyStandardApplicationId,
|
||||
}: Omit<
|
||||
CreateStandardFieldArgs<'workflowAutomatedTrigger'>,
|
||||
CreateStandardFieldArgs<'workflowAutomatedTrigger', FieldMetadataType>,
|
||||
'context'
|
||||
>): Record<
|
||||
AllStandardObjectFieldName<'workflowAutomatedTrigger'>,
|
||||
@@ -57,7 +58,7 @@ export const buildWorkflowAutomatedTriggerStandardFlatFieldMetadatas = ({
|
||||
isNullable: false,
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -76,7 +77,7 @@ export const buildWorkflowAutomatedTriggerStandardFlatFieldMetadatas = ({
|
||||
isNullable: false,
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -94,7 +95,7 @@ export const buildWorkflowAutomatedTriggerStandardFlatFieldMetadatas = ({
|
||||
icon: 'IconCalendarMinus',
|
||||
isNullable: true,
|
||||
isUIReadOnly: true,
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import {
|
||||
DateDisplayFormat,
|
||||
FieldMetadataType,
|
||||
RelationOnDeleteAction,
|
||||
RelationType,
|
||||
@@ -11,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/workspace-sync-metadata/utils/get-ts-vector-column-expression.util';
|
||||
import { SEARCH_FIELDS_FOR_WORKFLOW_RUNS } from 'src/modules/workflow/common/standard-objects/workflow-run.workspace-entity';
|
||||
|
||||
export const buildWorkflowRunStandardFlatFieldMetadatas = ({
|
||||
now,
|
||||
@@ -19,10 +22,10 @@ export const buildWorkflowRunStandardFlatFieldMetadatas = ({
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
twentyStandardApplicationId,
|
||||
}: Omit<CreateStandardFieldArgs<'workflowRun'>, 'context'>): Record<
|
||||
AllStandardObjectFieldName<'workflowRun'>,
|
||||
FlatFieldMetadata
|
||||
> => ({
|
||||
}: Omit<
|
||||
CreateStandardFieldArgs<'workflowRun', FieldMetadataType>,
|
||||
'context'
|
||||
>): Record<AllStandardObjectFieldName<'workflowRun'>, FlatFieldMetadata> => ({
|
||||
id: createStandardFieldFlatMetadata({
|
||||
objectName,
|
||||
workspaceId,
|
||||
@@ -54,7 +57,7 @@ export const buildWorkflowRunStandardFlatFieldMetadatas = ({
|
||||
isNullable: false,
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -73,7 +76,7 @@ export const buildWorkflowRunStandardFlatFieldMetadatas = ({
|
||||
isNullable: false,
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -91,7 +94,7 @@ export const buildWorkflowRunStandardFlatFieldMetadatas = ({
|
||||
icon: 'IconCalendarMinus',
|
||||
isNullable: true,
|
||||
isUIReadOnly: true,
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -203,6 +206,11 @@ export const buildWorkflowRunStandardFlatFieldMetadatas = ({
|
||||
description: 'The executor of the workflow',
|
||||
icon: 'IconCreativeCommonsSa',
|
||||
isNullable: false,
|
||||
defaultValue: {
|
||||
source: "'MANUAL'",
|
||||
name: "'System'",
|
||||
workspaceMemberId: null,
|
||||
},
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -286,6 +294,12 @@ export const buildWorkflowRunStandardFlatFieldMetadatas = ({
|
||||
icon: 'IconUser',
|
||||
isSystem: true,
|
||||
isNullable: true,
|
||||
settings: {
|
||||
generatedType: 'STORED',
|
||||
asExpression: getTsVectorColumnExpressionFromFields(
|
||||
SEARCH_FIELDS_FOR_WORKFLOW_RUNS,
|
||||
),
|
||||
},
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
|
||||
@@ -1,4 +1,8 @@
|
||||
import { FieldMetadataType, RelationType } from 'twenty-shared/types';
|
||||
import {
|
||||
DateDisplayFormat,
|
||||
FieldMetadataType,
|
||||
RelationType,
|
||||
} from 'twenty-shared/types';
|
||||
|
||||
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';
|
||||
@@ -7,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/workspace-sync-metadata/utils/get-ts-vector-column-expression.util';
|
||||
import { SEARCH_FIELDS_FOR_WORKFLOWS } from 'src/modules/workflow/common/standard-objects/workflow.workspace-entity';
|
||||
|
||||
export const buildWorkflowStandardFlatFieldMetadatas = ({
|
||||
now,
|
||||
@@ -15,10 +21,10 @@ export const buildWorkflowStandardFlatFieldMetadatas = ({
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
twentyStandardApplicationId,
|
||||
}: Omit<CreateStandardFieldArgs<'workflow'>, 'context'>): Record<
|
||||
AllStandardObjectFieldName<'workflow'>,
|
||||
FlatFieldMetadata
|
||||
> => ({
|
||||
}: Omit<
|
||||
CreateStandardFieldArgs<'workflow', FieldMetadataType>,
|
||||
'context'
|
||||
>): Record<AllStandardObjectFieldName<'workflow'>, FlatFieldMetadata> => ({
|
||||
id: createStandardFieldFlatMetadata({
|
||||
objectName,
|
||||
workspaceId,
|
||||
@@ -50,7 +56,7 @@ export const buildWorkflowStandardFlatFieldMetadatas = ({
|
||||
isNullable: false,
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -69,7 +75,7 @@ export const buildWorkflowStandardFlatFieldMetadatas = ({
|
||||
isNullable: false,
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -87,7 +93,7 @@ export const buildWorkflowStandardFlatFieldMetadatas = ({
|
||||
icon: 'IconCalendarMinus',
|
||||
isNullable: true,
|
||||
isUIReadOnly: true,
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -183,6 +189,11 @@ export const buildWorkflowStandardFlatFieldMetadatas = ({
|
||||
icon: 'IconCreativeCommonsSa',
|
||||
isUIReadOnly: true,
|
||||
isNullable: false,
|
||||
defaultValue: {
|
||||
source: "'MANUAL'",
|
||||
name: "'System'",
|
||||
workspaceMemberId: null,
|
||||
},
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -200,6 +211,12 @@ export const buildWorkflowStandardFlatFieldMetadatas = ({
|
||||
icon: 'IconUser',
|
||||
isSystem: true,
|
||||
isNullable: true,
|
||||
settings: {
|
||||
generatedType: 'STORED',
|
||||
asExpression: getTsVectorColumnExpressionFromFields(
|
||||
SEARCH_FIELDS_FOR_WORKFLOWS,
|
||||
),
|
||||
},
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import {
|
||||
DateDisplayFormat,
|
||||
FieldMetadataType,
|
||||
RelationOnDeleteAction,
|
||||
RelationType,
|
||||
@@ -11,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/workspace-sync-metadata/utils/get-ts-vector-column-expression.util';
|
||||
import { SEARCH_FIELDS_FOR_WORKFLOW_VERSIONS } from 'src/modules/workflow/common/standard-objects/workflow-version.workspace-entity';
|
||||
|
||||
export const buildWorkflowVersionStandardFlatFieldMetadatas = ({
|
||||
now,
|
||||
@@ -19,7 +22,10 @@ export const buildWorkflowVersionStandardFlatFieldMetadatas = ({
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
twentyStandardApplicationId,
|
||||
}: Omit<CreateStandardFieldArgs<'workflowVersion'>, 'context'>): Record<
|
||||
}: Omit<
|
||||
CreateStandardFieldArgs<'workflowVersion', FieldMetadataType>,
|
||||
'context'
|
||||
>): Record<
|
||||
AllStandardObjectFieldName<'workflowVersion'>,
|
||||
FlatFieldMetadata
|
||||
> => ({
|
||||
@@ -54,7 +60,7 @@ export const buildWorkflowVersionStandardFlatFieldMetadatas = ({
|
||||
isNullable: false,
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -73,7 +79,7 @@ export const buildWorkflowVersionStandardFlatFieldMetadatas = ({
|
||||
isNullable: false,
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -91,7 +97,7 @@ export const buildWorkflowVersionStandardFlatFieldMetadatas = ({
|
||||
icon: 'IconCalendarMinus',
|
||||
isNullable: true,
|
||||
isUIReadOnly: true,
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -203,6 +209,12 @@ export const buildWorkflowVersionStandardFlatFieldMetadatas = ({
|
||||
icon: 'IconUser',
|
||||
isSystem: true,
|
||||
isNullable: true,
|
||||
settings: {
|
||||
generatedType: 'STORED',
|
||||
asExpression: getTsVectorColumnExpressionFromFields(
|
||||
SEARCH_FIELDS_FOR_WORKFLOW_VERSIONS,
|
||||
),
|
||||
},
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import {
|
||||
DateDisplayFormat,
|
||||
FieldMetadataType,
|
||||
NumberDataType,
|
||||
RelationType,
|
||||
@@ -11,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 { WorkspaceMemberNumberFormatEnum } from 'src/modules/workspace-member/standard-objects/workspace-member.workspace-entity';
|
||||
import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/workspace-sync-metadata/utils/get-ts-vector-column-expression.util';
|
||||
import {
|
||||
SEARCH_FIELDS_FOR_WORKSPACE_MEMBER,
|
||||
WorkspaceMemberNumberFormatEnum,
|
||||
} from 'src/modules/workspace-member/standard-objects/workspace-member.workspace-entity';
|
||||
|
||||
export const buildWorkspaceMemberStandardFlatFieldMetadatas = ({
|
||||
now,
|
||||
@@ -20,7 +25,10 @@ export const buildWorkspaceMemberStandardFlatFieldMetadatas = ({
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
twentyStandardApplicationId,
|
||||
}: Omit<CreateStandardFieldArgs<'workspaceMember'>, 'context'>): Record<
|
||||
}: Omit<
|
||||
CreateStandardFieldArgs<'workspaceMember', FieldMetadataType>,
|
||||
'context'
|
||||
>): Record<
|
||||
AllStandardObjectFieldName<'workspaceMember'>,
|
||||
FlatFieldMetadata
|
||||
> => ({
|
||||
@@ -55,7 +63,7 @@ export const buildWorkspaceMemberStandardFlatFieldMetadatas = ({
|
||||
isNullable: false,
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -74,7 +82,7 @@ export const buildWorkspaceMemberStandardFlatFieldMetadatas = ({
|
||||
isNullable: false,
|
||||
isUIReadOnly: true,
|
||||
defaultValue: 'now',
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -92,7 +100,7 @@ export const buildWorkspaceMemberStandardFlatFieldMetadatas = ({
|
||||
icon: 'IconCalendarMinus',
|
||||
isNullable: true,
|
||||
isUIReadOnly: true,
|
||||
settings: { displayFormat: 'RELATIVE' },
|
||||
settings: { displayFormat: DateDisplayFormat.RELATIVE },
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -378,6 +386,12 @@ export const buildWorkspaceMemberStandardFlatFieldMetadatas = ({
|
||||
icon: 'IconUser',
|
||||
isSystem: true,
|
||||
isNullable: true,
|
||||
settings: {
|
||||
generatedType: 'STORED',
|
||||
asExpression: getTsVectorColumnExpressionFromFields(
|
||||
SEARCH_FIELDS_FOR_WORKSPACE_MEMBER,
|
||||
),
|
||||
},
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
@@ -450,29 +464,6 @@ export const buildWorkspaceMemberStandardFlatFieldMetadatas = ({
|
||||
twentyStandardApplicationId,
|
||||
now,
|
||||
}),
|
||||
authoredAttachments: createStandardRelationFieldFlatMetadata({
|
||||
objectName,
|
||||
workspaceId,
|
||||
context: {
|
||||
type: FieldMetadataType.RELATION,
|
||||
morphId: null,
|
||||
fieldName: 'authoredAttachments',
|
||||
label: 'Authored attachments',
|
||||
description: 'Attachments created by the workspace member',
|
||||
icon: 'IconFileImport',
|
||||
isSystem: true,
|
||||
isNullable: false,
|
||||
targetObjectName: 'attachment',
|
||||
targetFieldName: 'author',
|
||||
settings: {
|
||||
relationType: RelationType.ONE_TO_MANY,
|
||||
},
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
twentyStandardApplicationId,
|
||||
now,
|
||||
}),
|
||||
connectedAccounts: createStandardRelationFieldFlatMetadata({
|
||||
objectName,
|
||||
workspaceId,
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
import {
|
||||
type FieldMetadataDefaultValue,
|
||||
type FieldMetadataSettings,
|
||||
type FieldMetadataComplexOption,
|
||||
type FieldMetadataDefaultOption,
|
||||
type FieldMetadataDefaultValueForAnyType,
|
||||
type FieldMetadataType,
|
||||
} from 'twenty-shared/types';
|
||||
import { v4 } from 'uuid';
|
||||
@@ -13,12 +14,13 @@ import { type AllStandardObjectName } from 'src/engine/workspace-manager/twenty-
|
||||
import { type StandardBuilderArgs } from 'src/engine/workspace-manager/twenty-standard-application/types/metadata-standard-buillder-args.type';
|
||||
|
||||
export type CreateStandardFieldArgs<
|
||||
O extends AllStandardObjectName = AllStandardObjectName,
|
||||
O extends AllStandardObjectName,
|
||||
T extends FieldMetadataType,
|
||||
> = StandardBuilderArgs<'fieldMetadata'> & {
|
||||
objectName: O;
|
||||
context: {
|
||||
fieldName: AllStandardObjectFieldName<O>;
|
||||
type: Exclude<FieldMetadataType, typeof FieldMetadataType.RELATION>;
|
||||
type: T;
|
||||
label: string;
|
||||
description: string;
|
||||
icon: string;
|
||||
@@ -26,8 +28,8 @@ export type CreateStandardFieldArgs<
|
||||
isNullable?: boolean;
|
||||
isUnique?: boolean;
|
||||
isUIReadOnly?: boolean;
|
||||
defaultValue?: FieldMetadataDefaultValueForAnyType;
|
||||
settings?: Record<string, unknown> | null;
|
||||
defaultValue?: FieldMetadataDefaultValue<T>;
|
||||
settings?: FieldMetadataSettings<T>;
|
||||
options?:
|
||||
| FieldMetadataDefaultOption[]
|
||||
| FieldMetadataComplexOption[]
|
||||
@@ -37,6 +39,7 @@ export type CreateStandardFieldArgs<
|
||||
|
||||
export const createStandardFieldFlatMetadata = <
|
||||
O extends AllStandardObjectName,
|
||||
T extends FieldMetadataType,
|
||||
>({
|
||||
objectName,
|
||||
workspaceId,
|
||||
@@ -50,14 +53,14 @@ export const createStandardFieldFlatMetadata = <
|
||||
isNullable = true,
|
||||
isUnique = false,
|
||||
isUIReadOnly = false,
|
||||
defaultValue = null,
|
||||
settings = null,
|
||||
defaultValue,
|
||||
settings,
|
||||
options: fieldOptions = null,
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
twentyStandardApplicationId,
|
||||
now,
|
||||
}: CreateStandardFieldArgs<O>): FlatFieldMetadata => {
|
||||
}: CreateStandardFieldArgs<O, T>): FlatFieldMetadata => {
|
||||
const objectFields = STANDARD_OBJECTS[objectName].fields;
|
||||
const fieldDefinition = objectFields[fieldName as keyof typeof objectFields];
|
||||
const fieldIds = standardObjectMetadataRelatedEntityIds[objectName].fields;
|
||||
@@ -67,7 +70,7 @@ export const createStandardFieldFlatMetadata = <
|
||||
return {
|
||||
id: fieldIds[fieldName].id,
|
||||
universalIdentifier: fieldDefinition.universalIdentifier,
|
||||
standardId: null,
|
||||
standardId: fieldDefinition.universalIdentifier,
|
||||
applicationId: twentyStandardApplicationId,
|
||||
workspaceId,
|
||||
objectMetadataId: standardObjectMetadataRelatedEntityIds[objectName].id,
|
||||
@@ -84,8 +87,8 @@ export const createStandardFieldFlatMetadata = <
|
||||
isUIReadOnly,
|
||||
isLabelSyncedWithName: false,
|
||||
standardOverrides: null,
|
||||
defaultValue,
|
||||
settings,
|
||||
defaultValue: defaultValue ?? null,
|
||||
settings: settings ?? null,
|
||||
options: fieldOptions?.map((option) => ({ ...option, id: v4() })) ?? null,
|
||||
relationTargetFieldMetadataId: null,
|
||||
relationTargetObjectMetadataId: null,
|
||||
|
||||
@@ -85,7 +85,7 @@ export const createStandardRelationFieldFlatMetadata = <
|
||||
return {
|
||||
id: fieldIds[fieldName as keyof typeof fieldIds].id,
|
||||
universalIdentifier: fieldDefinition.universalIdentifier,
|
||||
standardId: null,
|
||||
standardId: fieldDefinition.universalIdentifier,
|
||||
applicationId: twentyStandardApplicationId,
|
||||
workspaceId,
|
||||
objectMetadataId: standardObjectMetadataRelatedEntityIds[objectName].id,
|
||||
|
||||
@@ -16,18 +16,6 @@ export const buildAttachmentStandardFlatIndexMetadatas = ({
|
||||
AllStandardObjectIndexName<'attachment'>,
|
||||
FlatIndexMetadata
|
||||
> => ({
|
||||
authorIdIndex: createStandardIndexFlatMetadata({
|
||||
objectName,
|
||||
workspaceId,
|
||||
context: {
|
||||
indexName: 'authorIdIndex',
|
||||
relatedFieldNames: ['author'],
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
twentyStandardApplicationId,
|
||||
now,
|
||||
}),
|
||||
taskIdIndex: createStandardIndexFlatMetadata({
|
||||
objectName,
|
||||
workspaceId,
|
||||
|
||||
@@ -51,6 +51,7 @@ export const buildMessageChannelMessageAssociationStandardFlatIndexMetadatas =
|
||||
indexName: 'messageChannelIdMessageIdUniqueIndex',
|
||||
relatedFieldNames: ['messageChannel', 'message'],
|
||||
isUnique: true,
|
||||
indexWhereClause: '"deletedAt" IS NULL',
|
||||
},
|
||||
standardObjectMetadataRelatedEntityIds,
|
||||
dependencyFlatEntityMaps,
|
||||
|
||||
@@ -203,6 +203,7 @@ export const STANDARD_FLAT_OBJECT_METADATA_BUILDERS_BY_OBJECT_NAME = {
|
||||
icon: 'IconBuildingSkyscraper',
|
||||
isSearchable: true,
|
||||
shortcut: 'C',
|
||||
duplicateCriteria: [['name'], ['domainNamePrimaryLinkUrl']],
|
||||
labelIdentifierFieldMetadataName: 'name',
|
||||
},
|
||||
workspaceId,
|
||||
@@ -233,7 +234,6 @@ export const STANDARD_FLAT_OBJECT_METADATA_BUILDERS_BY_OBJECT_NAME = {
|
||||
description: 'A connected account',
|
||||
icon: 'IconAt',
|
||||
isSystem: true,
|
||||
isAuditLogged: false,
|
||||
labelIdentifierFieldMetadataName: 'handle',
|
||||
},
|
||||
workspaceId,
|
||||
@@ -470,7 +470,6 @@ export const STANDARD_FLAT_OBJECT_METADATA_BUILDERS_BY_OBJECT_NAME = {
|
||||
icon: 'IconMessage',
|
||||
isSystem: true,
|
||||
isAuditLogged: false,
|
||||
isUIReadOnly: true,
|
||||
labelIdentifierFieldMetadataName: 'id',
|
||||
},
|
||||
workspaceId,
|
||||
@@ -498,7 +497,6 @@ export const STANDARD_FLAT_OBJECT_METADATA_BUILDERS_BY_OBJECT_NAME = {
|
||||
icon: 'IconMessage',
|
||||
isSystem: true,
|
||||
isAuditLogged: false,
|
||||
isUIReadOnly: true,
|
||||
labelIdentifierFieldMetadataName: 'subject',
|
||||
},
|
||||
workspaceId,
|
||||
@@ -606,6 +604,11 @@ export const STANDARD_FLAT_OBJECT_METADATA_BUILDERS_BY_OBJECT_NAME = {
|
||||
icon: 'IconUser',
|
||||
isSearchable: true,
|
||||
shortcut: 'P',
|
||||
duplicateCriteria: [
|
||||
['nameFirstName', 'nameLastName'],
|
||||
['linkedinLinkPrimaryLinkUrl'],
|
||||
['emailsPrimaryEmail'],
|
||||
],
|
||||
labelIdentifierFieldMetadataName: 'name',
|
||||
},
|
||||
workspaceId,
|
||||
@@ -690,6 +693,7 @@ export const STANDARD_FLAT_OBJECT_METADATA_BUILDERS_BY_OBJECT_NAME = {
|
||||
'Aggregated / filtered event to be displayed on the timeline',
|
||||
icon: 'IconTimelineEvent',
|
||||
isSystem: true,
|
||||
isAuditLogged: false,
|
||||
labelIdentifierFieldMetadataName: 'name',
|
||||
},
|
||||
workspaceId,
|
||||
@@ -715,7 +719,6 @@ export const STANDARD_FLAT_OBJECT_METADATA_BUILDERS_BY_OBJECT_NAME = {
|
||||
labelPlural: 'Workflows',
|
||||
description: 'A workflow',
|
||||
icon: 'IconSettingsAutomation',
|
||||
isSearchable: true,
|
||||
shortcut: 'W',
|
||||
labelIdentifierFieldMetadataName: 'name',
|
||||
},
|
||||
@@ -772,7 +775,9 @@ export const STANDARD_FLAT_OBJECT_METADATA_BUILDERS_BY_OBJECT_NAME = {
|
||||
labelPlural: 'Workflow Runs',
|
||||
description: 'A workflow run',
|
||||
icon: 'IconHistoryToggle',
|
||||
isSearchable: true,
|
||||
isSystem: true,
|
||||
isAuditLogged: false,
|
||||
isUIReadOnly: true,
|
||||
labelIdentifierFieldMetadataName: 'name',
|
||||
},
|
||||
workspaceId,
|
||||
@@ -802,7 +807,8 @@ export const STANDARD_FLAT_OBJECT_METADATA_BUILDERS_BY_OBJECT_NAME = {
|
||||
labelPlural: 'Workflow Versions',
|
||||
description: 'A workflow version',
|
||||
icon: 'IconVersions',
|
||||
isSearchable: true,
|
||||
isSystem: true,
|
||||
isUIReadOnly: true,
|
||||
labelIdentifierFieldMetadataName: 'name',
|
||||
},
|
||||
workspaceId,
|
||||
@@ -833,6 +839,7 @@ export const STANDARD_FLAT_OBJECT_METADATA_BUILDERS_BY_OBJECT_NAME = {
|
||||
description: 'A workspace member',
|
||||
icon: 'IconUserCircle',
|
||||
isSystem: true,
|
||||
isSearchable: true,
|
||||
labelIdentifierFieldMetadataName: 'name',
|
||||
},
|
||||
workspaceId,
|
||||
|
||||
@@ -16,6 +16,7 @@ export type CreateStandardObjectContext<O extends AllStandardObjectName> = {
|
||||
isAuditLogged?: boolean;
|
||||
isUIReadOnly?: boolean;
|
||||
shortcut?: string | null;
|
||||
duplicateCriteria?: string[][] | null;
|
||||
labelIdentifierFieldMetadataName: AllStandardObjectFieldName<O>;
|
||||
};
|
||||
|
||||
@@ -42,6 +43,7 @@ export const createStandardObjectFlatMetadata = <
|
||||
isAuditLogged = true,
|
||||
isUIReadOnly = false,
|
||||
shortcut = null,
|
||||
duplicateCriteria = null,
|
||||
labelIdentifierFieldMetadataName,
|
||||
},
|
||||
workspaceId,
|
||||
@@ -50,7 +52,7 @@ export const createStandardObjectFlatMetadata = <
|
||||
now,
|
||||
}: CreateStandardObjectArgs<O>): FlatObjectMetadata => ({
|
||||
universalIdentifier,
|
||||
standardId: null,
|
||||
standardId: universalIdentifier,
|
||||
applicationId: twentyStandardApplicationId,
|
||||
workspaceId,
|
||||
nameSingular,
|
||||
@@ -68,7 +70,7 @@ export const createStandardObjectFlatMetadata = <
|
||||
isUIReadOnly,
|
||||
isLabelSyncedWithName: false,
|
||||
standardOverrides: null,
|
||||
duplicateCriteria: null,
|
||||
duplicateCriteria,
|
||||
shortcut,
|
||||
labelIdentifierFieldMetadataId:
|
||||
standardObjectMetadataRelatedEntityIds[nameSingular].fields[
|
||||
|
||||
@@ -54,7 +54,7 @@ export const createStandardRoleFlatMetadata = ({
|
||||
return {
|
||||
id: v4(),
|
||||
universalIdentifier,
|
||||
standardId: null,
|
||||
standardId: universalIdentifier,
|
||||
label,
|
||||
description,
|
||||
icon,
|
||||
|
||||
@@ -17,7 +17,7 @@ export const computeStandardCalendarEventViewFields = (
|
||||
fieldName: 'title',
|
||||
position: 0,
|
||||
isVisible: true,
|
||||
size: 150,
|
||||
size: 180,
|
||||
},
|
||||
}),
|
||||
allCalendarEventsStartsAt: createStandardViewFieldFlatMetadata({
|
||||
|
||||
@@ -18,7 +18,7 @@ export const computeStandardCompanyViewFields = (
|
||||
fieldName: 'name',
|
||||
position: 0,
|
||||
isVisible: true,
|
||||
size: 150,
|
||||
size: 180,
|
||||
},
|
||||
}),
|
||||
allCompaniesDomainName: createStandardViewFieldFlatMetadata({
|
||||
|
||||
@@ -17,7 +17,7 @@ export const computeStandardDashboardViewFields = (
|
||||
fieldName: 'title',
|
||||
position: 0,
|
||||
isVisible: true,
|
||||
size: 210,
|
||||
size: 200,
|
||||
},
|
||||
}),
|
||||
allDashboardsCreatedBy: createStandardViewFieldFlatMetadata({
|
||||
|
||||
@@ -17,7 +17,7 @@ export const computeStandardMessageThreadViewFields = (
|
||||
fieldName: 'messages',
|
||||
position: 0,
|
||||
isVisible: true,
|
||||
size: 150,
|
||||
size: 180,
|
||||
},
|
||||
}),
|
||||
allMessageThreadsCreatedAt: createStandardViewFieldFlatMetadata({
|
||||
|
||||
@@ -17,7 +17,7 @@ export const computeStandardMessageViewFields = (
|
||||
fieldName: 'subject',
|
||||
position: 0,
|
||||
isVisible: true,
|
||||
size: 150,
|
||||
size: 180,
|
||||
},
|
||||
}),
|
||||
allMessagesMessageThread: createStandardViewFieldFlatMetadata({
|
||||
|
||||
@@ -17,7 +17,7 @@ export const computeStandardWorkflowRunViewFields = (
|
||||
fieldName: 'name',
|
||||
position: 0,
|
||||
isVisible: true,
|
||||
size: 210,
|
||||
size: 150,
|
||||
},
|
||||
}),
|
||||
allWorkflowRunsWorkflow: createStandardViewFieldFlatMetadata({
|
||||
|
||||
@@ -17,7 +17,7 @@ export const computeStandardWorkflowViewFields = (
|
||||
fieldName: 'name',
|
||||
position: 0,
|
||||
isVisible: true,
|
||||
size: 210,
|
||||
size: 150,
|
||||
},
|
||||
}),
|
||||
allWorkflowsStatuses: createStandardViewFieldFlatMetadata({
|
||||
|
||||
@@ -17,6 +17,7 @@ import { WORKSPACE_MIGRATION_ADDITIONAL_CACHE_DATA_MAPS_KEY } from 'src/engine/w
|
||||
import { WorkspaceMigrationBuildOrchestratorService } from 'src/engine/workspace-manager/workspace-migration-v2/services/workspace-migration-build-orchestrator.service';
|
||||
import { WorkspaceMigrationBuilderAdditionalCacheDataMaps } from 'src/engine/workspace-manager/workspace-migration-v2/types/workspace-migration-builder-additional-cache-data-maps.type';
|
||||
import {
|
||||
FromToAllFlatEntityMaps,
|
||||
WorkspaceMigrationOrchestratorBuildArgs,
|
||||
WorkspaceMigrationOrchestratorFailedResult,
|
||||
} from 'src/engine/workspace-manager/workspace-migration-v2/types/workspace-migration-orchestrator.type';
|
||||
@@ -116,7 +117,7 @@ export class WorkspaceMigrationValidateBuildAndRunService {
|
||||
allFlatEntityOperationByMetadataName,
|
||||
workspaceId,
|
||||
}: ValidateBuildAndRunWorkspaceMigrationFromMatriceArgs): Promise<{
|
||||
fromToAllFlatEntityMaps: WorkspaceMigrationOrchestratorBuildArgs['fromToAllFlatEntityMaps'];
|
||||
fromToAllFlatEntityMaps: FromToAllFlatEntityMaps;
|
||||
inferDeletionFromMissingEntities: InferDeletionFromMissingEntities;
|
||||
dependencyAllFlatEntityMaps: Partial<AllFlatEntityMaps>;
|
||||
additionalCacheDataMaps: WorkspaceMigrationBuilderAdditionalCacheDataMaps;
|
||||
@@ -130,8 +131,7 @@ export class WorkspaceMigrationValidateBuildAndRunService {
|
||||
workspaceId,
|
||||
});
|
||||
|
||||
const fromToAllFlatEntityMaps: WorkspaceMigrationOrchestratorBuildArgs['fromToAllFlatEntityMaps'] =
|
||||
{};
|
||||
const fromToAllFlatEntityMaps: FromToAllFlatEntityMaps = {};
|
||||
const inferDeletionFromMissingEntities: InferDeletionFromMissingEntities =
|
||||
{};
|
||||
const allMetadataNameToCompare = Object.keys(
|
||||
@@ -171,35 +171,12 @@ export class WorkspaceMigrationValidateBuildAndRunService {
|
||||
};
|
||||
}
|
||||
|
||||
public async validateBuildAndRunWorkspaceMigration({
|
||||
allFlatEntityOperationByMetadataName: allFlatEntities,
|
||||
workspaceId,
|
||||
isSystemBuild = false,
|
||||
}: ValidateBuildAndRunWorkspaceMigrationFromMatriceArgs): Promise<
|
||||
WorkspaceMigrationOrchestratorFailedResult | undefined
|
||||
> {
|
||||
const {
|
||||
fromToAllFlatEntityMaps,
|
||||
inferDeletionFromMissingEntities,
|
||||
dependencyAllFlatEntityMaps,
|
||||
additionalCacheDataMaps,
|
||||
} = await this.computeFromToAllFlatEntityMapsAndBuildOptions({
|
||||
allFlatEntityOperationByMetadataName: allFlatEntities,
|
||||
workspaceId,
|
||||
});
|
||||
|
||||
public async validateBuildAndRunWorkspaceMigrationFromTo(
|
||||
args: WorkspaceMigrationOrchestratorBuildArgs,
|
||||
) {
|
||||
const validateAndBuildResult =
|
||||
await this.workspaceMigrationBuildOrchestratorService
|
||||
.buildWorkspaceMigration({
|
||||
buildOptions: {
|
||||
isSystemBuild,
|
||||
inferDeletionFromMissingEntities,
|
||||
},
|
||||
fromToAllFlatEntityMaps,
|
||||
workspaceId,
|
||||
dependencyAllFlatEntityMaps,
|
||||
additionalCacheDataMaps,
|
||||
})
|
||||
.buildWorkspaceMigration(args)
|
||||
.catch((error) => {
|
||||
this.logger.error(error);
|
||||
throw new WorkspaceMigrationV2Exception(
|
||||
@@ -229,4 +206,33 @@ export class WorkspaceMigrationValidateBuildAndRunService {
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
public async validateBuildAndRunWorkspaceMigration({
|
||||
allFlatEntityOperationByMetadataName: allFlatEntities,
|
||||
workspaceId,
|
||||
isSystemBuild = false,
|
||||
}: ValidateBuildAndRunWorkspaceMigrationFromMatriceArgs): Promise<
|
||||
WorkspaceMigrationOrchestratorFailedResult | undefined
|
||||
> {
|
||||
const {
|
||||
fromToAllFlatEntityMaps,
|
||||
inferDeletionFromMissingEntities,
|
||||
dependencyAllFlatEntityMaps,
|
||||
additionalCacheDataMaps,
|
||||
} = await this.computeFromToAllFlatEntityMapsAndBuildOptions({
|
||||
allFlatEntityOperationByMetadataName: allFlatEntities,
|
||||
workspaceId,
|
||||
});
|
||||
|
||||
return await this.validateBuildAndRunWorkspaceMigrationFromTo({
|
||||
buildOptions: {
|
||||
isSystemBuild,
|
||||
inferDeletionFromMissingEntities,
|
||||
},
|
||||
fromToAllFlatEntityMaps,
|
||||
workspaceId,
|
||||
dependencyAllFlatEntityMaps,
|
||||
additionalCacheDataMaps,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,12 +9,14 @@ import { type FailedFlatEntityValidation } from 'src/engine/workspace-manager/wo
|
||||
import { type WorkspaceMigrationBuilderOptions } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-builder-options.type';
|
||||
import { type WorkspaceMigrationV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-v2';
|
||||
|
||||
export type FromToAllFlatEntityMaps = {
|
||||
[P in keyof AllFlatEntityMaps]?: FromTo<AllFlatEntityMaps[P]>;
|
||||
};
|
||||
|
||||
export type WorkspaceMigrationOrchestratorBuildArgs = {
|
||||
workspaceId: string;
|
||||
buildOptions: WorkspaceMigrationBuilderOptions;
|
||||
fromToAllFlatEntityMaps: {
|
||||
[P in keyof AllFlatEntityMaps]?: FromTo<AllFlatEntityMaps[P]>;
|
||||
};
|
||||
fromToAllFlatEntityMaps: FromToAllFlatEntityMaps;
|
||||
dependencyAllFlatEntityMaps?: Partial<AllFlatEntityMaps>;
|
||||
additionalCacheDataMaps: WorkspaceMigrationBuilderAdditionalCacheDataMaps;
|
||||
};
|
||||
|
||||
@@ -14,6 +14,7 @@ import { CustomWorkspaceEntity } from 'src/engine/twenty-orm/custom.workspace-en
|
||||
import { WorkspaceDynamicRelation } from 'src/engine/twenty-orm/decorators/workspace-dynamic-relation.decorator';
|
||||
import { WorkspaceEntity } from 'src/engine/twenty-orm/decorators/workspace-entity.decorator';
|
||||
import { WorkspaceField } from 'src/engine/twenty-orm/decorators/workspace-field.decorator';
|
||||
import { WorkspaceIsDeprecated } from 'src/engine/twenty-orm/decorators/workspace-is-deprecated.decorator';
|
||||
import { WorkspaceIsFieldUIReadOnly } from 'src/engine/twenty-orm/decorators/workspace-is-field-ui-readonly.decorator';
|
||||
import { WorkspaceIsNullable } from 'src/engine/twenty-orm/decorators/workspace-is-nullable.decorator';
|
||||
import { WorkspaceIsSystem } from 'src/engine/twenty-orm/decorators/workspace-is-system.decorator';
|
||||
@@ -62,7 +63,6 @@ export class AttachmentWorkspaceEntity extends BaseWorkspaceEntity {
|
||||
@WorkspaceIsNullable()
|
||||
fullPath: string | null;
|
||||
|
||||
// Deprecated: Use fileCategory instead
|
||||
@WorkspaceField({
|
||||
standardId: ATTACHMENT_STANDARD_FIELD_IDS.type,
|
||||
type: FieldMetadataType.TEXT,
|
||||
@@ -71,6 +71,7 @@ export class AttachmentWorkspaceEntity extends BaseWorkspaceEntity {
|
||||
icon: 'IconList',
|
||||
})
|
||||
@WorkspaceIsNullable()
|
||||
@WorkspaceIsDeprecated()
|
||||
type: string | null;
|
||||
|
||||
@WorkspaceField({
|
||||
@@ -143,7 +144,6 @@ export class AttachmentWorkspaceEntity extends BaseWorkspaceEntity {
|
||||
@WorkspaceIsFieldUIReadOnly()
|
||||
createdBy: ActorMetadata;
|
||||
|
||||
// Deprecated: Use createdBy composite field instead
|
||||
@WorkspaceRelation({
|
||||
standardId: ATTACHMENT_STANDARD_FIELD_IDS.author,
|
||||
type: RelationType.MANY_TO_ONE,
|
||||
@@ -155,6 +155,7 @@ export class AttachmentWorkspaceEntity extends BaseWorkspaceEntity {
|
||||
onDelete: RelationOnDeleteAction.SET_NULL,
|
||||
})
|
||||
@WorkspaceIsNullable()
|
||||
@WorkspaceIsDeprecated()
|
||||
author: Relation<WorkspaceMemberWorkspaceEntity> | null;
|
||||
|
||||
@WorkspaceJoinColumn('author')
|
||||
|
||||
@@ -12,12 +12,10 @@ describe('attachmentsResolver (e2e)', () => {
|
||||
node {
|
||||
name
|
||||
fullPath
|
||||
type
|
||||
id
|
||||
createdAt
|
||||
updatedAt
|
||||
deletedAt
|
||||
authorId
|
||||
taskId
|
||||
noteId
|
||||
personId
|
||||
@@ -54,7 +52,6 @@ describe('attachmentsResolver (e2e)', () => {
|
||||
|
||||
expect(attachments).toHaveProperty('name');
|
||||
expect(attachments).toHaveProperty('fullPath');
|
||||
expect(attachments).toHaveProperty('type');
|
||||
expect(attachments).toHaveProperty('id');
|
||||
expect(attachments).toHaveProperty('createdAt');
|
||||
expect(attachments).toHaveProperty('updatedAt');
|
||||
|
||||
@@ -17,7 +17,7 @@ import { createManyOperationFactory } from 'test/integration/graphql/utils/creat
|
||||
import { createOneOperationFactory } from 'test/integration/graphql/utils/create-one-operation-factory.util';
|
||||
import { destroyManyOperationFactory } from 'test/integration/graphql/utils/destroy-many-operation-factory.util';
|
||||
import { makeGraphqlAPIRequest } from 'test/integration/graphql/utils/make-graphql-api-request.util';
|
||||
import { performCreateManyOperation } from 'test/integration/graphql/utils/perform-create-many-operation.utils';
|
||||
import { createManyOperation } from 'test/integration/graphql/utils/create-many-operation.util';
|
||||
import { updateManyOperationFactory } from 'test/integration/graphql/utils/update-many-operation-factory.util';
|
||||
import { updateOneOperationFactory } from 'test/integration/graphql/utils/update-one-operation-factory.util';
|
||||
import { type ObjectRecord } from 'twenty-shared/types';
|
||||
@@ -67,10 +67,12 @@ describe('relation connect in workspace createOne/createMany resolvers (e2e)',
|
||||
}),
|
||||
);
|
||||
|
||||
await performCreateManyOperation('company', 'companies', `id`, [
|
||||
company1,
|
||||
company2,
|
||||
]);
|
||||
await createManyOperation({
|
||||
objectMetadataSingularName: 'company',
|
||||
objectMetadataPluralName: 'companies',
|
||||
gqlFields: 'id',
|
||||
data: [company1, company2],
|
||||
});
|
||||
});
|
||||
|
||||
beforeEach(async () => {
|
||||
|
||||
@@ -20,7 +20,7 @@ import {
|
||||
TEST_PET_ID_3,
|
||||
TEST_PET_ID_4,
|
||||
} from 'test/integration/constants/test-pet-ids.constants';
|
||||
import { performCreateManyOperation } from 'test/integration/graphql/utils/perform-create-many-operation.utils';
|
||||
import { createManyOperation } from 'test/integration/graphql/utils/create-many-operation.util';
|
||||
import { search } from 'test/integration/graphql/utils/search.util';
|
||||
import { deleteAllRecords } from 'test/integration/utils/delete-all-records';
|
||||
import {
|
||||
@@ -113,6 +113,7 @@ describe('SearchResolver', () => {
|
||||
const [searchInput1Pet, searchInput2Pet, cafePet, naivePet] = pets;
|
||||
|
||||
beforeAll(async () => {
|
||||
// TODO refactor not a good practice, or should at least restore afterwards
|
||||
await deleteAllRecords('person');
|
||||
await deleteAllRecords('company');
|
||||
await deleteAllRecords('opportunity');
|
||||
@@ -124,33 +125,28 @@ describe('SearchResolver', () => {
|
||||
await deleteAllRecords('_pet');
|
||||
await deleteAllRecords('_surveyResult');
|
||||
await deleteAllRecords('_rocket');
|
||||
///
|
||||
|
||||
try {
|
||||
await performCreateManyOperation(
|
||||
'pet',
|
||||
'pets',
|
||||
OBJECT_MODEL_COMMON_FIELDS,
|
||||
pets,
|
||||
);
|
||||
await createManyOperation({
|
||||
objectMetadataSingularName: 'pet',
|
||||
objectMetadataPluralName: 'pets',
|
||||
gqlFields: OBJECT_MODEL_COMMON_FIELDS,
|
||||
data: pets,
|
||||
});
|
||||
|
||||
await performCreateManyOperation(
|
||||
'person',
|
||||
'people',
|
||||
PERSON_GQL_FIELDS,
|
||||
persons,
|
||||
);
|
||||
await createManyOperation({
|
||||
objectMetadataSingularName: 'person',
|
||||
objectMetadataPluralName: 'people',
|
||||
gqlFields: PERSON_GQL_FIELDS,
|
||||
data: persons,
|
||||
});
|
||||
|
||||
await performCreateManyOperation(
|
||||
'company',
|
||||
'companies',
|
||||
COMPANY_GQL_FIELDS,
|
||||
companies,
|
||||
);
|
||||
} catch (error) {
|
||||
// eslint-disable-next-line no-console
|
||||
console.log(error);
|
||||
throw new Error('beforeAll failed');
|
||||
}
|
||||
await createManyOperation({
|
||||
objectMetadataSingularName: 'company',
|
||||
objectMetadataPluralName: 'companies',
|
||||
gqlFields: COMPANY_GQL_FIELDS,
|
||||
data: companies,
|
||||
});
|
||||
});
|
||||
|
||||
const testsUseCases: EachTestingContext<{
|
||||
|
||||
@@ -28,6 +28,7 @@ describe('Granular settings permissions', () => {
|
||||
originalMemberRoleId = memberRole.id;
|
||||
|
||||
// Create a custom role with canUpdateAllSettings = false
|
||||
// canUpdateAllObjectRecords must be true to allow creating records like workflows
|
||||
const createRoleQuery = {
|
||||
query: `
|
||||
mutation CreateOneRole {
|
||||
@@ -36,7 +37,7 @@ describe('Granular settings permissions', () => {
|
||||
description: "Role for testing specific setting permissions"
|
||||
canUpdateAllSettings: false
|
||||
canReadAllObjectRecords: true
|
||||
canUpdateAllObjectRecords: false
|
||||
canUpdateAllObjectRecords: true
|
||||
canSoftDeleteAllObjectRecords: false
|
||||
canDestroyAllObjectRecords: false
|
||||
}) {
|
||||
|
||||
@@ -0,0 +1,66 @@
|
||||
import { createManyOperationFactory } from 'test/integration/graphql/utils/create-many-operation-factory.util';
|
||||
import { makeGraphqlAPIRequest } from 'test/integration/graphql/utils/make-graphql-api-request.util';
|
||||
import { type CommonResponseBody } from 'test/integration/metadata/types/common-response-body.type';
|
||||
import { warnIfErrorButNotExpectedToFail } from 'test/integration/metadata/utils/warn-if-error-but-not-expected-to-fail.util';
|
||||
import { warnIfNoErrorButExpectedToFail } from 'test/integration/metadata/utils/warn-if-no-error-but-expected-to-fail.util';
|
||||
import { type ObjectRecord } from 'twenty-shared/types';
|
||||
import { capitalize } from 'twenty-shared/utils';
|
||||
import { v4 } from 'uuid';
|
||||
|
||||
type CreateManyOperationInput = {
|
||||
objectMetadataSingularName: string;
|
||||
objectMetadataPluralName: string;
|
||||
gqlFields?: string;
|
||||
data: object[];
|
||||
upsert?: boolean;
|
||||
expectToFail?: boolean;
|
||||
token?: string;
|
||||
};
|
||||
|
||||
export const createManyOperation = async ({
|
||||
objectMetadataSingularName,
|
||||
objectMetadataPluralName,
|
||||
gqlFields = 'id',
|
||||
data,
|
||||
upsert = false,
|
||||
expectToFail = false,
|
||||
token,
|
||||
}: CreateManyOperationInput): CommonResponseBody<{
|
||||
createdRecords: ObjectRecord[];
|
||||
}> => {
|
||||
const graphqlOperation = createManyOperationFactory({
|
||||
objectMetadataSingularName,
|
||||
objectMetadataPluralName,
|
||||
gqlFields,
|
||||
data: data.map((item) => ({
|
||||
id: v4(),
|
||||
...item,
|
||||
})),
|
||||
upsert,
|
||||
});
|
||||
|
||||
const response = await makeGraphqlAPIRequest(graphqlOperation, token);
|
||||
|
||||
if (expectToFail === true) {
|
||||
warnIfNoErrorButExpectedToFail({
|
||||
response,
|
||||
errorMessage: 'Create many operation should have failed but did not',
|
||||
});
|
||||
}
|
||||
|
||||
if (expectToFail === false) {
|
||||
warnIfErrorButNotExpectedToFail({
|
||||
response,
|
||||
errorMessage: 'Create many operation failed but should not have',
|
||||
});
|
||||
}
|
||||
|
||||
return {
|
||||
data: {
|
||||
createdRecords:
|
||||
response.body.data?.[`create${capitalize(objectMetadataPluralName)}`] ??
|
||||
[],
|
||||
},
|
||||
errors: response.body.errors,
|
||||
};
|
||||
};
|
||||
@@ -1,25 +0,0 @@
|
||||
import { createManyOperationFactory } from 'test/integration/graphql/utils/create-many-operation-factory.util';
|
||||
import { makeGraphqlAPIRequest } from 'test/integration/graphql/utils/make-graphql-api-request.util';
|
||||
import { capitalize } from 'twenty-shared/utils';
|
||||
import { v4 } from 'uuid';
|
||||
|
||||
export const performCreateManyOperation = async (
|
||||
objectMetadataSingularName: string,
|
||||
objectMetadataPluralName: string,
|
||||
gqlFields: string,
|
||||
data: object[],
|
||||
) => {
|
||||
const response = await makeGraphqlAPIRequest(
|
||||
createManyOperationFactory({
|
||||
objectMetadataSingularName,
|
||||
objectMetadataPluralName,
|
||||
gqlFields,
|
||||
data: data.map((item) => ({
|
||||
id: v4(),
|
||||
...item,
|
||||
})),
|
||||
}),
|
||||
);
|
||||
|
||||
return response.body.data[`create${capitalize(objectMetadataPluralName)}`];
|
||||
};
|
||||
@@ -190,25 +190,23 @@ describe('Standard field metadata update should succeed', () => {
|
||||
);
|
||||
});
|
||||
|
||||
it.failing(
|
||||
'Should deactivate and reactivate standard field successfully',
|
||||
async () => {
|
||||
const deletedAtField = opportunityObjectFields.find(
|
||||
(field) => field.name === 'deletedAt',
|
||||
);
|
||||
it('Should deactivate and reactivate standard field successfully', async () => {
|
||||
const deletedAtField = opportunityObjectFields.find(
|
||||
(field) => field.name === 'deletedAt',
|
||||
);
|
||||
|
||||
jestExpectToBeDefined(deletedAtField);
|
||||
expect(deletedAtField.isActive).toBe(true);
|
||||
jestExpectToBeDefined(deletedAtField);
|
||||
expect(deletedAtField.isActive).toBe(true);
|
||||
|
||||
const { data: firstUpdateData } = await updateOneFieldMetadata({
|
||||
input: {
|
||||
idToUpdate: deletedAtField.id,
|
||||
updatePayload: {
|
||||
isActive: false,
|
||||
},
|
||||
const { data: firstUpdateData } = await updateOneFieldMetadata({
|
||||
input: {
|
||||
idToUpdate: deletedAtField.id,
|
||||
updatePayload: {
|
||||
isActive: false,
|
||||
},
|
||||
expectToFail: false,
|
||||
gqlFields: `
|
||||
},
|
||||
expectToFail: false,
|
||||
gqlFields: `
|
||||
id
|
||||
name
|
||||
label
|
||||
@@ -224,19 +222,19 @@ describe('Standard field metadata update should succeed', () => {
|
||||
icon
|
||||
}
|
||||
`,
|
||||
});
|
||||
});
|
||||
|
||||
expect(firstUpdateData.updateOneField.isActive).toBe(false);
|
||||
expect(firstUpdateData.updateOneField.isActive).toBe(false);
|
||||
|
||||
const { data: secondUpdateData } = await updateOneFieldMetadata({
|
||||
input: {
|
||||
idToUpdate: deletedAtField.id,
|
||||
updatePayload: {
|
||||
isActive: true,
|
||||
},
|
||||
const { data: secondUpdateData } = await updateOneFieldMetadata({
|
||||
input: {
|
||||
idToUpdate: deletedAtField.id,
|
||||
updatePayload: {
|
||||
isActive: true,
|
||||
},
|
||||
expectToFail: false,
|
||||
gqlFields: `
|
||||
},
|
||||
expectToFail: false,
|
||||
gqlFields: `
|
||||
id
|
||||
name
|
||||
label
|
||||
@@ -252,11 +250,10 @@ describe('Standard field metadata update should succeed', () => {
|
||||
icon
|
||||
}
|
||||
`,
|
||||
});
|
||||
});
|
||||
|
||||
expect(secondUpdateData.updateOneField.isActive).toBe(true);
|
||||
},
|
||||
);
|
||||
expect(secondUpdateData.updateOneField.isActive).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe('Standard field isUnique update should succeed', () => {
|
||||
|
||||
@@ -1,11 +1,7 @@
|
||||
const TEST_SCHEMA_NAME = 'workspace_1wgvd1injqtife6y4rvfbu3h5';
|
||||
|
||||
export const deleteAllRecords = async (objectNameSingular: string) => {
|
||||
try {
|
||||
await global.testDataSource.query(
|
||||
`DELETE from "${TEST_SCHEMA_NAME}"."${objectNameSingular}"`,
|
||||
);
|
||||
} catch {
|
||||
/* empty */
|
||||
}
|
||||
await global.testDataSource.query(
|
||||
`DELETE from "${TEST_SCHEMA_NAME}"."${objectNameSingular}"`,
|
||||
);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user