Put workfows behind a feature flag (#6417)
We have recently merged [#workflow](https://github.com/twentyhq/twenty/pull/6412) but we should put the workflow standard object behind a feature flag for now --------- Co-authored-by: bosiraphael <raphael.bosi@gmail.com>
This commit is contained in:
@ -29,7 +29,6 @@ import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-
|
|||||||
import { ObjectMetadataService } from 'src/engine/metadata-modules/object-metadata/object-metadata.service';
|
import { ObjectMetadataService } from 'src/engine/metadata-modules/object-metadata/object-metadata.service';
|
||||||
import { WorkspaceDataSourceService } from 'src/engine/workspace-datasource/workspace-datasource.service';
|
import { WorkspaceDataSourceService } from 'src/engine/workspace-datasource/workspace-datasource.service';
|
||||||
import { viewPrefillData } from 'src/engine/workspace-manager/standard-objects-prefill-data/view';
|
import { viewPrefillData } from 'src/engine/workspace-manager/standard-objects-prefill-data/view';
|
||||||
import { workflowPrefillData } from 'src/engine/workspace-manager/standard-objects-prefill-data/workflow';
|
|
||||||
import { WorkspaceSyncMetadataService } from 'src/engine/workspace-manager/workspace-sync-metadata/workspace-sync-metadata.service';
|
import { WorkspaceSyncMetadataService } from 'src/engine/workspace-manager/workspace-sync-metadata/workspace-sync-metadata.service';
|
||||||
|
|
||||||
// TODO: implement dry-run
|
// TODO: implement dry-run
|
||||||
@ -125,7 +124,6 @@ export class DataSeedWorkspaceCommand extends CommandRunner {
|
|||||||
dataSourceMetadata.schema,
|
dataSourceMetadata.schema,
|
||||||
workspaceId,
|
workspaceId,
|
||||||
);
|
);
|
||||||
await workflowPrefillData(entityManager, dataSourceMetadata.schema);
|
|
||||||
|
|
||||||
if (workspaceId === SEED_APPLE_WORKSPACE_ID) {
|
if (workspaceId === SEED_APPLE_WORKSPACE_ID) {
|
||||||
await seedMessageThread(entityManager, dataSourceMetadata.schema);
|
await seedMessageThread(entityManager, dataSourceMetadata.schema);
|
||||||
|
|||||||
@ -3,7 +3,6 @@ import { InjectRepository } from '@nestjs/typeorm';
|
|||||||
|
|
||||||
import { Repository } from 'typeorm';
|
import { Repository } from 'typeorm';
|
||||||
|
|
||||||
import { WorkspaceSyncContext } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/workspace-sync-context.interface';
|
|
||||||
import { FeatureFlagMap } from 'src/engine/core-modules/feature-flag/interfaces/feature-flag-map.interface';
|
import { FeatureFlagMap } from 'src/engine/core-modules/feature-flag/interfaces/feature-flag-map.interface';
|
||||||
|
|
||||||
import { FeatureFlagEntity } from 'src/engine/core-modules/feature-flag/feature-flag.entity';
|
import { FeatureFlagEntity } from 'src/engine/core-modules/feature-flag/feature-flag.entity';
|
||||||
@ -15,9 +14,9 @@ export class FeatureFlagFactory {
|
|||||||
private readonly featureFlagRepository: Repository<FeatureFlagEntity>,
|
private readonly featureFlagRepository: Repository<FeatureFlagEntity>,
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
async create(context: WorkspaceSyncContext): Promise<FeatureFlagMap> {
|
async create(workspaceId: string): Promise<FeatureFlagMap> {
|
||||||
const workspaceFeatureFlags = await this.featureFlagRepository.find({
|
const workspaceFeatureFlags = await this.featureFlagRepository.find({
|
||||||
where: { workspaceId: context.workspaceId },
|
where: { workspaceId },
|
||||||
});
|
});
|
||||||
|
|
||||||
const workspaceFeatureFlagsMap = workspaceFeatureFlags.reduce(
|
const workspaceFeatureFlagsMap = workspaceFeatureFlags.reduce(
|
||||||
@ -83,7 +83,7 @@ export class ObjectMetadataEntity implements ObjectMetadataInterface {
|
|||||||
})
|
})
|
||||||
fields: Relation<FieldMetadataEntity[]>;
|
fields: Relation<FieldMetadataEntity[]>;
|
||||||
|
|
||||||
@OneToMany(() => FieldMetadataEntity, (field) => field.object, {
|
@OneToMany(() => IndexMetadataEntity, (index) => index.objectMetadata, {
|
||||||
cascade: true,
|
cascade: true,
|
||||||
})
|
})
|
||||||
indexes: Relation<IndexMetadataEntity[]>;
|
indexes: Relation<IndexMetadataEntity[]>;
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
import { generateDeterministicIndexName } from 'src/engine/metadata-modules/index-metadata/utils/generate-deterministic-index-name';
|
import { generateDeterministicIndexName } from 'src/engine/metadata-modules/index-metadata/utils/generate-deterministic-index-name';
|
||||||
import { metadataArgsStorage } from 'src/engine/twenty-orm/storage/metadata-args.storage';
|
import { metadataArgsStorage } from 'src/engine/twenty-orm/storage/metadata-args.storage';
|
||||||
import { convertClassNameToObjectMetadataName } from 'src/engine/workspace-manager/workspace-sync-metadata/utils/convert-class-to-object-metadata-name.util';
|
import { convertClassNameToObjectMetadataName } from 'src/engine/workspace-manager/workspace-sync-metadata/utils/convert-class-to-object-metadata-name.util';
|
||||||
|
import { TypedReflect } from 'src/utils/typed-reflect';
|
||||||
|
|
||||||
export interface WorkspaceIndexOptions {
|
export interface WorkspaceIndexOptions {
|
||||||
columns?: string[];
|
columns?: string[];
|
||||||
@ -16,6 +17,12 @@ export function WorkspaceIndex(
|
|||||||
throw new Error('Class level WorkspaceIndex should be used with columns');
|
throw new Error('Class level WorkspaceIndex should be used with columns');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const gate = TypedReflect.getMetadata(
|
||||||
|
'workspace:gate-metadata-args',
|
||||||
|
target,
|
||||||
|
propertyKey.toString(),
|
||||||
|
);
|
||||||
|
|
||||||
// TODO: handle composite field metadata types
|
// TODO: handle composite field metadata types
|
||||||
|
|
||||||
if (Array.isArray(columns) && columns.length > 0) {
|
if (Array.isArray(columns) && columns.length > 0) {
|
||||||
@ -26,6 +33,7 @@ export function WorkspaceIndex(
|
|||||||
])}`,
|
])}`,
|
||||||
columns,
|
columns,
|
||||||
target: target,
|
target: target,
|
||||||
|
gate,
|
||||||
});
|
});
|
||||||
|
|
||||||
return;
|
return;
|
||||||
@ -38,6 +46,7 @@ export function WorkspaceIndex(
|
|||||||
])}`,
|
])}`,
|
||||||
columns: [propertyKey.toString()],
|
columns: [propertyKey.toString()],
|
||||||
target: target.constructor,
|
target: target.constructor,
|
||||||
|
gate,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,16 +2,16 @@ import { Injectable } from '@nestjs/common';
|
|||||||
|
|
||||||
import { ColumnType, EntitySchemaColumnOptions } from 'typeorm';
|
import { ColumnType, EntitySchemaColumnOptions } from 'typeorm';
|
||||||
|
|
||||||
import { fieldMetadataTypeToColumnType } from 'src/engine/metadata-modules/workspace-migration/utils/field-metadata-type-to-column-type.util';
|
|
||||||
import { isEnumFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/utils/is-enum-field-metadata-type.util';
|
|
||||||
import { serializeDefaultValue } from 'src/engine/metadata-modules/field-metadata/utils/serialize-default-value';
|
|
||||||
import { computeCompositeColumnName } from 'src/engine/metadata-modules/field-metadata/utils/compute-column-name.util';
|
|
||||||
import { isCompositeFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/utils/is-composite-field-metadata-type.util';
|
|
||||||
import { compositeTypeDefintions } from 'src/engine/metadata-modules/field-metadata/composite-types';
|
import { compositeTypeDefintions } from 'src/engine/metadata-modules/field-metadata/composite-types';
|
||||||
import {
|
import {
|
||||||
FieldMetadataEntity,
|
FieldMetadataEntity,
|
||||||
FieldMetadataType,
|
FieldMetadataType,
|
||||||
} from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
|
} from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
|
||||||
|
import { computeCompositeColumnName } from 'src/engine/metadata-modules/field-metadata/utils/compute-column-name.util';
|
||||||
|
import { isCompositeFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/utils/is-composite-field-metadata-type.util';
|
||||||
|
import { isEnumFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/utils/is-enum-field-metadata-type.util';
|
||||||
|
import { serializeDefaultValue } from 'src/engine/metadata-modules/field-metadata/utils/serialize-default-value';
|
||||||
|
import { fieldMetadataTypeToColumnType } from 'src/engine/metadata-modules/workspace-migration/utils/field-metadata-type-to-column-type.util';
|
||||||
import { isRelationFieldMetadataType } from 'src/engine/utils/is-relation-field-metadata-type.util';
|
import { isRelationFieldMetadataType } from 'src/engine/utils/is-relation-field-metadata-type.util';
|
||||||
|
|
||||||
type EntitySchemaColumnMap = {
|
type EntitySchemaColumnMap = {
|
||||||
@ -21,7 +21,6 @@ type EntitySchemaColumnMap = {
|
|||||||
@Injectable()
|
@Injectable()
|
||||||
export class EntitySchemaColumnFactory {
|
export class EntitySchemaColumnFactory {
|
||||||
create(
|
create(
|
||||||
workspaceId: string,
|
|
||||||
fieldMetadataCollection: FieldMetadataEntity[],
|
fieldMetadataCollection: FieldMetadataEntity[],
|
||||||
): EntitySchemaColumnMap {
|
): EntitySchemaColumnMap {
|
||||||
let entitySchemaColumnMap: EntitySchemaColumnMap = {};
|
let entitySchemaColumnMap: EntitySchemaColumnMap = {};
|
||||||
|
|||||||
@ -20,7 +20,6 @@ export class EntitySchemaFactory {
|
|||||||
objectMetadata: ObjectMetadataEntity,
|
objectMetadata: ObjectMetadataEntity,
|
||||||
): Promise<EntitySchema> {
|
): Promise<EntitySchema> {
|
||||||
const columns = this.entitySchemaColumnFactory.create(
|
const columns = this.entitySchemaColumnFactory.create(
|
||||||
workspaceId,
|
|
||||||
objectMetadata.fields,
|
objectMetadata.fields,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@ -1,3 +1,5 @@
|
|||||||
|
import { Gate } from 'src/engine/twenty-orm/interfaces/gate.interface';
|
||||||
|
|
||||||
export interface WorkspaceIndexMetadataArgs {
|
export interface WorkspaceIndexMetadataArgs {
|
||||||
/**
|
/**
|
||||||
* Class to which index is applied.
|
* Class to which index is applied.
|
||||||
@ -14,4 +16,9 @@ export interface WorkspaceIndexMetadataArgs {
|
|||||||
* Index columns.
|
* Index columns.
|
||||||
*/
|
*/
|
||||||
columns: string[];
|
columns: string[];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Field gate.
|
||||||
|
*/
|
||||||
|
readonly gate?: Gate;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,7 +4,6 @@ import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadat
|
|||||||
import { companyPrefillData } from 'src/engine/workspace-manager/standard-objects-prefill-data/company';
|
import { companyPrefillData } from 'src/engine/workspace-manager/standard-objects-prefill-data/company';
|
||||||
import { personPrefillData } from 'src/engine/workspace-manager/standard-objects-prefill-data/person';
|
import { personPrefillData } from 'src/engine/workspace-manager/standard-objects-prefill-data/person';
|
||||||
import { viewPrefillData } from 'src/engine/workspace-manager/standard-objects-prefill-data/view';
|
import { viewPrefillData } from 'src/engine/workspace-manager/standard-objects-prefill-data/view';
|
||||||
import { workflowPrefillData } from 'src/engine/workspace-manager/standard-objects-prefill-data/workflow';
|
|
||||||
|
|
||||||
export const standardObjectsPrefillData = async (
|
export const standardObjectsPrefillData = async (
|
||||||
workspaceDataSource: DataSource,
|
workspaceDataSource: DataSource,
|
||||||
@ -35,7 +34,6 @@ export const standardObjectsPrefillData = async (
|
|||||||
workspaceDataSource.transaction(async (entityManager: EntityManager) => {
|
workspaceDataSource.transaction(async (entityManager: EntityManager) => {
|
||||||
await companyPrefillData(entityManager, schemaName);
|
await companyPrefillData(entityManager, schemaName);
|
||||||
await personPrefillData(entityManager, schemaName);
|
await personPrefillData(entityManager, schemaName);
|
||||||
await workflowPrefillData(entityManager, schemaName);
|
|
||||||
await viewPrefillData(entityManager, schemaName, objectMetadataMap);
|
await viewPrefillData(entityManager, schemaName, objectMetadataMap);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
@ -1,31 +0,0 @@
|
|||||||
import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
|
|
||||||
import { WORKFLOW_STANDARD_FIELD_IDS } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-field-ids';
|
|
||||||
import { STANDARD_OBJECT_IDS } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-object-ids';
|
|
||||||
|
|
||||||
export const viewWorkflowFields = (
|
|
||||||
viewId: string,
|
|
||||||
objectMetadataMap: Record<string, ObjectMetadataEntity>,
|
|
||||||
) => {
|
|
||||||
return [
|
|
||||||
{
|
|
||||||
fieldMetadataId:
|
|
||||||
objectMetadataMap[STANDARD_OBJECT_IDS.workflow].fields[
|
|
||||||
WORKFLOW_STANDARD_FIELD_IDS.name
|
|
||||||
],
|
|
||||||
viewId: viewId,
|
|
||||||
position: 0,
|
|
||||||
isVisible: true,
|
|
||||||
size: 210,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
fieldMetadataId:
|
|
||||||
objectMetadataMap[STANDARD_OBJECT_IDS.workflow].fields[
|
|
||||||
WORKFLOW_STANDARD_FIELD_IDS.publishedVersionId
|
|
||||||
],
|
|
||||||
viewId: viewId,
|
|
||||||
position: 1,
|
|
||||||
isVisible: true,
|
|
||||||
size: 150,
|
|
||||||
},
|
|
||||||
];
|
|
||||||
};
|
|
||||||
@ -4,7 +4,6 @@ import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadat
|
|||||||
import { viewCompanyFields } from 'src/engine/workspace-manager/standard-objects-prefill-data/view-company-fields';
|
import { viewCompanyFields } from 'src/engine/workspace-manager/standard-objects-prefill-data/view-company-fields';
|
||||||
import { viewOpportunityFields } from 'src/engine/workspace-manager/standard-objects-prefill-data/view-opportunity-fields';
|
import { viewOpportunityFields } from 'src/engine/workspace-manager/standard-objects-prefill-data/view-opportunity-fields';
|
||||||
import { viewPersonFields } from 'src/engine/workspace-manager/standard-objects-prefill-data/view-person-fields';
|
import { viewPersonFields } from 'src/engine/workspace-manager/standard-objects-prefill-data/view-person-fields';
|
||||||
import { viewWorkflowFields } from 'src/engine/workspace-manager/standard-objects-prefill-data/view-workflow-fields';
|
|
||||||
import { OPPORTUNITY_STANDARD_FIELD_IDS } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-field-ids';
|
import { OPPORTUNITY_STANDARD_FIELD_IDS } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-field-ids';
|
||||||
import { STANDARD_OBJECT_IDS } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-object-ids';
|
import { STANDARD_OBJECT_IDS } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-object-ids';
|
||||||
|
|
||||||
@ -65,15 +64,6 @@ export const viewPrefillData = async (
|
|||||||
OPPORTUNITY_STANDARD_FIELD_IDS.stage
|
OPPORTUNITY_STANDARD_FIELD_IDS.stage
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
|
||||||
name: 'All Workflows',
|
|
||||||
objectMetadataId: objectMetadataMap[STANDARD_OBJECT_IDS.workflow].id,
|
|
||||||
type: 'table',
|
|
||||||
key: 'INDEX',
|
|
||||||
position: 0,
|
|
||||||
icon: 'IconSettingsAutomation',
|
|
||||||
kanbanFieldMetadataId: '',
|
|
||||||
},
|
|
||||||
])
|
])
|
||||||
.returning('*')
|
.returning('*')
|
||||||
.execute();
|
.execute();
|
||||||
@ -102,7 +92,6 @@ export const viewPrefillData = async (
|
|||||||
objectMetadataMap,
|
objectMetadataMap,
|
||||||
),
|
),
|
||||||
...viewOpportunityFields(viewIdMap['By Stage'], objectMetadataMap),
|
...viewOpportunityFields(viewIdMap['By Stage'], objectMetadataMap),
|
||||||
...viewWorkflowFields(viewIdMap['All Workflows'], objectMetadataMap),
|
|
||||||
])
|
])
|
||||||
.execute();
|
.execute();
|
||||||
};
|
};
|
||||||
|
|||||||
@ -1,21 +0,0 @@
|
|||||||
import { EntityManager } from 'typeorm';
|
|
||||||
|
|
||||||
export const workflowPrefillData = async (
|
|
||||||
entityManager: EntityManager,
|
|
||||||
schemaName: string,
|
|
||||||
) => {
|
|
||||||
await entityManager
|
|
||||||
.createQueryBuilder()
|
|
||||||
.insert()
|
|
||||||
.into(`${schemaName}.workflow`, ['name', 'publishedVersionId', 'position'])
|
|
||||||
.orIgnore()
|
|
||||||
.values([
|
|
||||||
{
|
|
||||||
name: 'Update Subscription Status',
|
|
||||||
publishedVersionId: null,
|
|
||||||
position: 1,
|
|
||||||
},
|
|
||||||
])
|
|
||||||
.returning('*')
|
|
||||||
.execute();
|
|
||||||
};
|
|
||||||
@ -1,6 +1,6 @@
|
|||||||
import { StandardIndexFactory } from 'src/engine/workspace-manager/workspace-sync-metadata/factories/standard-index.factory';
|
import { StandardIndexFactory } from 'src/engine/workspace-manager/workspace-sync-metadata/factories/standard-index.factory';
|
||||||
|
|
||||||
import { FeatureFlagFactory } from './feature-flags.factory';
|
import { FeatureFlagFactory } from '../../../core-modules/feature-flag/services/feature-flags.factory';
|
||||||
import { StandardFieldFactory } from './standard-field.factory';
|
import { StandardFieldFactory } from './standard-field.factory';
|
||||||
import { StandardObjectFactory } from './standard-object.factory';
|
import { StandardObjectFactory } from './standard-object.factory';
|
||||||
import { StandardRelationFactory } from './standard-relation.factory';
|
import { StandardRelationFactory } from './standard-relation.factory';
|
||||||
|
|||||||
@ -8,6 +8,7 @@ import { IndexMetadataEntity } from 'src/engine/metadata-modules/index-metadata/
|
|||||||
import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
|
import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
|
||||||
import { BaseWorkspaceEntity } from 'src/engine/twenty-orm/base.workspace-entity';
|
import { BaseWorkspaceEntity } from 'src/engine/twenty-orm/base.workspace-entity';
|
||||||
import { metadataArgsStorage } from 'src/engine/twenty-orm/storage/metadata-args.storage';
|
import { metadataArgsStorage } from 'src/engine/twenty-orm/storage/metadata-args.storage';
|
||||||
|
import { isGatedAndNotEnabled } from 'src/engine/workspace-manager/workspace-sync-metadata/utils/is-gate-and-not-enabled.util';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class StandardIndexFactory {
|
export class StandardIndexFactory {
|
||||||
@ -31,7 +32,7 @@ export class StandardIndexFactory {
|
|||||||
target: typeof BaseWorkspaceEntity,
|
target: typeof BaseWorkspaceEntity,
|
||||||
context: WorkspaceSyncContext,
|
context: WorkspaceSyncContext,
|
||||||
originalObjectMetadataMap: Record<string, ObjectMetadataEntity>,
|
originalObjectMetadataMap: Record<string, ObjectMetadataEntity>,
|
||||||
_workspaceFeatureFlagsMap: FeatureFlagMap,
|
workspaceFeatureFlagsMap: FeatureFlagMap,
|
||||||
): Partial<IndexMetadataEntity>[] {
|
): Partial<IndexMetadataEntity>[] {
|
||||||
const workspaceEntity = metadataArgsStorage.filterEntities(target);
|
const workspaceEntity = metadataArgsStorage.filterEntities(target);
|
||||||
|
|
||||||
@ -41,8 +42,18 @@ export class StandardIndexFactory {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const workspaceIndexMetadataArgsCollection =
|
if (isGatedAndNotEnabled(workspaceEntity?.gate, workspaceFeatureFlagsMap)) {
|
||||||
metadataArgsStorage.filterIndexes(target);
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
const workspaceIndexMetadataArgsCollection = metadataArgsStorage
|
||||||
|
.filterIndexes(target)
|
||||||
|
.filter((workspaceIndexMetadataArgs) => {
|
||||||
|
return !isGatedAndNotEnabled(
|
||||||
|
workspaceIndexMetadataArgs.gate,
|
||||||
|
workspaceFeatureFlagsMap,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
return workspaceIndexMetadataArgsCollection.map(
|
return workspaceIndexMetadataArgsCollection.map(
|
||||||
(workspaceIndexMetadataArgs) => {
|
(workspaceIndexMetadataArgs) => {
|
||||||
|
|||||||
@ -5,10 +5,10 @@ import { DataSource } from 'typeorm';
|
|||||||
|
|
||||||
import { WorkspaceSyncContext } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/workspace-sync-context.interface';
|
import { WorkspaceSyncContext } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/workspace-sync-context.interface';
|
||||||
|
|
||||||
|
import { FeatureFlagFactory } from 'src/engine/core-modules/feature-flag/services/feature-flags.factory';
|
||||||
import { WorkspaceCacheVersionService } from 'src/engine/metadata-modules/workspace-cache-version/workspace-cache-version.service';
|
import { WorkspaceCacheVersionService } from 'src/engine/metadata-modules/workspace-cache-version/workspace-cache-version.service';
|
||||||
import { WorkspaceMigrationEntity } from 'src/engine/metadata-modules/workspace-migration/workspace-migration.entity';
|
import { WorkspaceMigrationEntity } from 'src/engine/metadata-modules/workspace-migration/workspace-migration.entity';
|
||||||
import { WorkspaceMigrationRunnerService } from 'src/engine/workspace-manager/workspace-migration-runner/workspace-migration-runner.service';
|
import { WorkspaceMigrationRunnerService } from 'src/engine/workspace-manager/workspace-migration-runner/workspace-migration-runner.service';
|
||||||
import { FeatureFlagFactory } from 'src/engine/workspace-manager/workspace-sync-metadata/factories/feature-flags.factory';
|
|
||||||
import { WorkspaceSyncFieldMetadataService } from 'src/engine/workspace-manager/workspace-sync-metadata/services/workspace-sync-field-metadata.service';
|
import { WorkspaceSyncFieldMetadataService } from 'src/engine/workspace-manager/workspace-sync-metadata/services/workspace-sync-field-metadata.service';
|
||||||
import { WorkspaceSyncIndexMetadataService } from 'src/engine/workspace-manager/workspace-sync-metadata/services/workspace-sync-index-metadata.service';
|
import { WorkspaceSyncIndexMetadataService } from 'src/engine/workspace-manager/workspace-sync-metadata/services/workspace-sync-index-metadata.service';
|
||||||
import { WorkspaceSyncObjectMetadataIdentifiersService } from 'src/engine/workspace-manager/workspace-sync-metadata/services/workspace-sync-object-metadata-identifiers.service';
|
import { WorkspaceSyncObjectMetadataIdentifiersService } from 'src/engine/workspace-manager/workspace-sync-metadata/services/workspace-sync-object-metadata-identifiers.service';
|
||||||
@ -69,8 +69,9 @@ export class WorkspaceSyncMetadataService {
|
|||||||
);
|
);
|
||||||
|
|
||||||
// Retrieve feature flags
|
// Retrieve feature flags
|
||||||
const workspaceFeatureFlagsMap =
|
const workspaceFeatureFlagsMap = await this.featureFlagFactory.create(
|
||||||
await this.featureFlagFactory.create(context);
|
context.workspaceId,
|
||||||
|
);
|
||||||
|
|
||||||
this.logger.log('Syncing standard objects and fields metadata');
|
this.logger.log('Syncing standard objects and fields metadata');
|
||||||
|
|
||||||
|
|||||||
@ -1,10 +1,12 @@
|
|||||||
import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface';
|
import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface';
|
||||||
|
|
||||||
|
import { FeatureFlagKeys } from 'src/engine/core-modules/feature-flag/feature-flag.entity';
|
||||||
import { RelationMetadataType } from 'src/engine/metadata-modules/relation-metadata/relation-metadata.entity';
|
import { RelationMetadataType } from 'src/engine/metadata-modules/relation-metadata/relation-metadata.entity';
|
||||||
import { BaseWorkspaceEntity } from 'src/engine/twenty-orm/base.workspace-entity';
|
import { BaseWorkspaceEntity } from 'src/engine/twenty-orm/base.workspace-entity';
|
||||||
import { CustomWorkspaceEntity } from 'src/engine/twenty-orm/custom.workspace-entity';
|
import { CustomWorkspaceEntity } from 'src/engine/twenty-orm/custom.workspace-entity';
|
||||||
import { WorkspaceDynamicRelation } from 'src/engine/twenty-orm/decorators/workspace-dynamic-relation.decorator';
|
import { WorkspaceDynamicRelation } from 'src/engine/twenty-orm/decorators/workspace-dynamic-relation.decorator';
|
||||||
import { WorkspaceEntity } from 'src/engine/twenty-orm/decorators/workspace-entity.decorator';
|
import { WorkspaceEntity } from 'src/engine/twenty-orm/decorators/workspace-entity.decorator';
|
||||||
|
import { WorkspaceGate } from 'src/engine/twenty-orm/decorators/workspace-gate.decorator';
|
||||||
import { WorkspaceIsNullable } from 'src/engine/twenty-orm/decorators/workspace-is-nullable.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';
|
import { WorkspaceIsSystem } from 'src/engine/twenty-orm/decorators/workspace-is-system.decorator';
|
||||||
import { WorkspaceJoinColumn } from 'src/engine/twenty-orm/decorators/workspace-join-column.decorator';
|
import { WorkspaceJoinColumn } from 'src/engine/twenty-orm/decorators/workspace-join-column.decorator';
|
||||||
@ -96,10 +98,16 @@ export class ActivityTargetWorkspaceEntity extends BaseWorkspaceEntity {
|
|||||||
inverseSideTarget: () => WorkflowWorkspaceEntity,
|
inverseSideTarget: () => WorkflowWorkspaceEntity,
|
||||||
inverseSideFieldKey: 'activityTargets',
|
inverseSideFieldKey: 'activityTargets',
|
||||||
})
|
})
|
||||||
|
@WorkspaceGate({
|
||||||
|
featureFlag: FeatureFlagKeys.IsWorkflowEnabled,
|
||||||
|
})
|
||||||
@WorkspaceIsNullable()
|
@WorkspaceIsNullable()
|
||||||
workflow: Relation<WorkflowWorkspaceEntity> | null;
|
workflow: Relation<WorkflowWorkspaceEntity> | null;
|
||||||
|
|
||||||
@WorkspaceJoinColumn('workflow')
|
@WorkspaceJoinColumn('workflow')
|
||||||
|
@WorkspaceGate({
|
||||||
|
featureFlag: FeatureFlagKeys.IsWorkflowEnabled,
|
||||||
|
})
|
||||||
workflowId: string | null;
|
workflowId: string | null;
|
||||||
|
|
||||||
@WorkspaceDynamicRelation({
|
@WorkspaceDynamicRelation({
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface';
|
import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface';
|
||||||
|
|
||||||
|
import { FeatureFlagKeys } from 'src/engine/core-modules/feature-flag/feature-flag.entity';
|
||||||
import { FieldMetadataType } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
|
import { FieldMetadataType } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
|
||||||
import { RelationMetadataType } from 'src/engine/metadata-modules/relation-metadata/relation-metadata.entity';
|
import { RelationMetadataType } from 'src/engine/metadata-modules/relation-metadata/relation-metadata.entity';
|
||||||
import { BaseWorkspaceEntity } from 'src/engine/twenty-orm/base.workspace-entity';
|
import { BaseWorkspaceEntity } from 'src/engine/twenty-orm/base.workspace-entity';
|
||||||
@ -7,6 +8,7 @@ import { CustomWorkspaceEntity } from 'src/engine/twenty-orm/custom.workspace-en
|
|||||||
import { WorkspaceDynamicRelation } from 'src/engine/twenty-orm/decorators/workspace-dynamic-relation.decorator';
|
import { WorkspaceDynamicRelation } from 'src/engine/twenty-orm/decorators/workspace-dynamic-relation.decorator';
|
||||||
import { WorkspaceEntity } from 'src/engine/twenty-orm/decorators/workspace-entity.decorator';
|
import { WorkspaceEntity } from 'src/engine/twenty-orm/decorators/workspace-entity.decorator';
|
||||||
import { WorkspaceField } from 'src/engine/twenty-orm/decorators/workspace-field.decorator';
|
import { WorkspaceField } from 'src/engine/twenty-orm/decorators/workspace-field.decorator';
|
||||||
|
import { WorkspaceGate } from 'src/engine/twenty-orm/decorators/workspace-gate.decorator';
|
||||||
import { WorkspaceIsNotAuditLogged } from 'src/engine/twenty-orm/decorators/workspace-is-not-audit-logged.decorator';
|
import { WorkspaceIsNotAuditLogged } from 'src/engine/twenty-orm/decorators/workspace-is-not-audit-logged.decorator';
|
||||||
import { WorkspaceIsNullable } from 'src/engine/twenty-orm/decorators/workspace-is-nullable.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';
|
import { WorkspaceIsSystem } from 'src/engine/twenty-orm/decorators/workspace-is-system.decorator';
|
||||||
@ -144,9 +146,15 @@ export class AttachmentWorkspaceEntity extends BaseWorkspaceEntity {
|
|||||||
inverseSideFieldKey: 'attachments',
|
inverseSideFieldKey: 'attachments',
|
||||||
})
|
})
|
||||||
@WorkspaceIsNullable()
|
@WorkspaceIsNullable()
|
||||||
|
@WorkspaceGate({
|
||||||
|
featureFlag: FeatureFlagKeys.IsWorkflowEnabled,
|
||||||
|
})
|
||||||
workflow: Relation<WorkflowWorkspaceEntity> | null;
|
workflow: Relation<WorkflowWorkspaceEntity> | null;
|
||||||
|
|
||||||
@WorkspaceJoinColumn('workflow')
|
@WorkspaceJoinColumn('workflow')
|
||||||
|
@WorkspaceGate({
|
||||||
|
featureFlag: FeatureFlagKeys.IsWorkflowEnabled,
|
||||||
|
})
|
||||||
workflowId: string | null;
|
workflowId: string | null;
|
||||||
|
|
||||||
@WorkspaceDynamicRelation({
|
@WorkspaceDynamicRelation({
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface';
|
import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface';
|
||||||
|
|
||||||
|
import { FeatureFlagKeys } from 'src/engine/core-modules/feature-flag/feature-flag.entity';
|
||||||
import { FieldMetadataType } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
|
import { FieldMetadataType } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
|
||||||
import { RelationMetadataType } from 'src/engine/metadata-modules/relation-metadata/relation-metadata.entity';
|
import { RelationMetadataType } from 'src/engine/metadata-modules/relation-metadata/relation-metadata.entity';
|
||||||
import { BaseWorkspaceEntity } from 'src/engine/twenty-orm/base.workspace-entity';
|
import { BaseWorkspaceEntity } from 'src/engine/twenty-orm/base.workspace-entity';
|
||||||
@ -7,6 +8,7 @@ import { CustomWorkspaceEntity } from 'src/engine/twenty-orm/custom.workspace-en
|
|||||||
import { WorkspaceDynamicRelation } from 'src/engine/twenty-orm/decorators/workspace-dynamic-relation.decorator';
|
import { WorkspaceDynamicRelation } from 'src/engine/twenty-orm/decorators/workspace-dynamic-relation.decorator';
|
||||||
import { WorkspaceEntity } from 'src/engine/twenty-orm/decorators/workspace-entity.decorator';
|
import { WorkspaceEntity } from 'src/engine/twenty-orm/decorators/workspace-entity.decorator';
|
||||||
import { WorkspaceField } from 'src/engine/twenty-orm/decorators/workspace-field.decorator';
|
import { WorkspaceField } from 'src/engine/twenty-orm/decorators/workspace-field.decorator';
|
||||||
|
import { WorkspaceGate } from 'src/engine/twenty-orm/decorators/workspace-gate.decorator';
|
||||||
import { WorkspaceIsNotAuditLogged } from 'src/engine/twenty-orm/decorators/workspace-is-not-audit-logged.decorator';
|
import { WorkspaceIsNotAuditLogged } from 'src/engine/twenty-orm/decorators/workspace-is-not-audit-logged.decorator';
|
||||||
import { WorkspaceIsNullable } from 'src/engine/twenty-orm/decorators/workspace-is-nullable.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';
|
import { WorkspaceIsSystem } from 'src/engine/twenty-orm/decorators/workspace-is-system.decorator';
|
||||||
@ -110,10 +112,16 @@ export class FavoriteWorkspaceEntity extends BaseWorkspaceEntity {
|
|||||||
inverseSideTarget: () => WorkflowWorkspaceEntity,
|
inverseSideTarget: () => WorkflowWorkspaceEntity,
|
||||||
inverseSideFieldKey: 'favorites',
|
inverseSideFieldKey: 'favorites',
|
||||||
})
|
})
|
||||||
|
@WorkspaceGate({
|
||||||
|
featureFlag: FeatureFlagKeys.IsWorkflowEnabled,
|
||||||
|
})
|
||||||
@WorkspaceIsNullable()
|
@WorkspaceIsNullable()
|
||||||
workflow: Relation<WorkflowWorkspaceEntity> | null;
|
workflow: Relation<WorkflowWorkspaceEntity> | null;
|
||||||
|
|
||||||
@WorkspaceJoinColumn('workflow')
|
@WorkspaceJoinColumn('workflow')
|
||||||
|
@WorkspaceGate({
|
||||||
|
featureFlag: FeatureFlagKeys.IsWorkflowEnabled,
|
||||||
|
})
|
||||||
workflowId: string;
|
workflowId: string;
|
||||||
|
|
||||||
@WorkspaceDynamicRelation({
|
@WorkspaceDynamicRelation({
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface';
|
import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface';
|
||||||
|
|
||||||
|
import { FeatureFlagKeys } from 'src/engine/core-modules/feature-flag/feature-flag.entity';
|
||||||
import { FieldMetadataType } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
|
import { FieldMetadataType } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
|
||||||
import { RelationMetadataType } from 'src/engine/metadata-modules/relation-metadata/relation-metadata.entity';
|
import { RelationMetadataType } from 'src/engine/metadata-modules/relation-metadata/relation-metadata.entity';
|
||||||
import { BaseWorkspaceEntity } from 'src/engine/twenty-orm/base.workspace-entity';
|
import { BaseWorkspaceEntity } from 'src/engine/twenty-orm/base.workspace-entity';
|
||||||
@ -7,6 +8,7 @@ import { CustomWorkspaceEntity } from 'src/engine/twenty-orm/custom.workspace-en
|
|||||||
import { WorkspaceDynamicRelation } from 'src/engine/twenty-orm/decorators/workspace-dynamic-relation.decorator';
|
import { WorkspaceDynamicRelation } from 'src/engine/twenty-orm/decorators/workspace-dynamic-relation.decorator';
|
||||||
import { WorkspaceEntity } from 'src/engine/twenty-orm/decorators/workspace-entity.decorator';
|
import { WorkspaceEntity } from 'src/engine/twenty-orm/decorators/workspace-entity.decorator';
|
||||||
import { WorkspaceField } from 'src/engine/twenty-orm/decorators/workspace-field.decorator';
|
import { WorkspaceField } from 'src/engine/twenty-orm/decorators/workspace-field.decorator';
|
||||||
|
import { WorkspaceGate } from 'src/engine/twenty-orm/decorators/workspace-gate.decorator';
|
||||||
import { WorkspaceIsNotAuditLogged } from 'src/engine/twenty-orm/decorators/workspace-is-not-audit-logged.decorator';
|
import { WorkspaceIsNotAuditLogged } from 'src/engine/twenty-orm/decorators/workspace-is-not-audit-logged.decorator';
|
||||||
import { WorkspaceIsNullable } from 'src/engine/twenty-orm/decorators/workspace-is-nullable.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';
|
import { WorkspaceIsSystem } from 'src/engine/twenty-orm/decorators/workspace-is-system.decorator';
|
||||||
@ -160,10 +162,16 @@ export class TimelineActivityWorkspaceEntity extends BaseWorkspaceEntity {
|
|||||||
inverseSideTarget: () => WorkflowWorkspaceEntity,
|
inverseSideTarget: () => WorkflowWorkspaceEntity,
|
||||||
inverseSideFieldKey: 'timelineActivities',
|
inverseSideFieldKey: 'timelineActivities',
|
||||||
})
|
})
|
||||||
|
@WorkspaceGate({
|
||||||
|
featureFlag: FeatureFlagKeys.IsWorkflowEnabled,
|
||||||
|
})
|
||||||
@WorkspaceIsNullable()
|
@WorkspaceIsNullable()
|
||||||
workflow: Relation<WorkflowWorkspaceEntity> | null;
|
workflow: Relation<WorkflowWorkspaceEntity> | null;
|
||||||
|
|
||||||
@WorkspaceJoinColumn('workflow')
|
@WorkspaceJoinColumn('workflow')
|
||||||
|
@WorkspaceGate({
|
||||||
|
featureFlag: FeatureFlagKeys.IsWorkflowEnabled,
|
||||||
|
})
|
||||||
workflowId: string | null;
|
workflowId: string | null;
|
||||||
|
|
||||||
@WorkspaceDynamicRelation({
|
@WorkspaceDynamicRelation({
|
||||||
|
|||||||
@ -15,9 +15,6 @@ import { WORKFLOW_VERSION_STANDARD_FIELD_IDS } from 'src/engine/workspace-manage
|
|||||||
import { STANDARD_OBJECT_IDS } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-object-ids';
|
import { STANDARD_OBJECT_IDS } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-object-ids';
|
||||||
import { WorkflowWorkspaceEntity } from 'src/modules/workflow/standard-objects/workflow.workspace-entity';
|
import { WorkflowWorkspaceEntity } from 'src/modules/workflow/standard-objects/workflow.workspace-entity';
|
||||||
|
|
||||||
@WorkspaceGate({
|
|
||||||
featureFlag: FeatureFlagKeys.IsWorkflowEnabled,
|
|
||||||
})
|
|
||||||
@WorkspaceEntity({
|
@WorkspaceEntity({
|
||||||
standardId: STANDARD_OBJECT_IDS.workflowVersion,
|
standardId: STANDARD_OBJECT_IDS.workflowVersion,
|
||||||
namePlural: 'workflowVersions',
|
namePlural: 'workflowVersions',
|
||||||
@ -27,6 +24,9 @@ import { WorkflowWorkspaceEntity } from 'src/modules/workflow/standard-objects/w
|
|||||||
icon: 'IconVersions',
|
icon: 'IconVersions',
|
||||||
labelIdentifierStandardId: WORKFLOW_VERSION_STANDARD_FIELD_IDS.name,
|
labelIdentifierStandardId: WORKFLOW_VERSION_STANDARD_FIELD_IDS.name,
|
||||||
})
|
})
|
||||||
|
@WorkspaceGate({
|
||||||
|
featureFlag: FeatureFlagKeys.IsWorkflowEnabled,
|
||||||
|
})
|
||||||
@WorkspaceIsSystem()
|
@WorkspaceIsSystem()
|
||||||
export class WorkflowVersionWorkspaceEntity extends BaseWorkspaceEntity {
|
export class WorkflowVersionWorkspaceEntity extends BaseWorkspaceEntity {
|
||||||
@WorkspaceField({
|
@WorkspaceField({
|
||||||
|
|||||||
@ -21,9 +21,6 @@ import { FavoriteWorkspaceEntity } from 'src/modules/favorite/standard-objects/f
|
|||||||
import { TimelineActivityWorkspaceEntity } from 'src/modules/timeline/standard-objects/timeline-activity.workspace-entity';
|
import { TimelineActivityWorkspaceEntity } from 'src/modules/timeline/standard-objects/timeline-activity.workspace-entity';
|
||||||
import { WorkflowVersionWorkspaceEntity } from 'src/modules/workflow/standard-objects/workflow-version.workspace-entity';
|
import { WorkflowVersionWorkspaceEntity } from 'src/modules/workflow/standard-objects/workflow-version.workspace-entity';
|
||||||
|
|
||||||
@WorkspaceGate({
|
|
||||||
featureFlag: FeatureFlagKeys.IsWorkflowEnabled,
|
|
||||||
})
|
|
||||||
@WorkspaceEntity({
|
@WorkspaceEntity({
|
||||||
standardId: STANDARD_OBJECT_IDS.workflow,
|
standardId: STANDARD_OBJECT_IDS.workflow,
|
||||||
namePlural: 'workflows',
|
namePlural: 'workflows',
|
||||||
@ -33,6 +30,9 @@ import { WorkflowVersionWorkspaceEntity } from 'src/modules/workflow/standard-ob
|
|||||||
icon: 'IconSettingsAutomation',
|
icon: 'IconSettingsAutomation',
|
||||||
labelIdentifierStandardId: WORKFLOW_STANDARD_FIELD_IDS.name,
|
labelIdentifierStandardId: WORKFLOW_STANDARD_FIELD_IDS.name,
|
||||||
})
|
})
|
||||||
|
@WorkspaceGate({
|
||||||
|
featureFlag: FeatureFlagKeys.IsWorkflowEnabled,
|
||||||
|
})
|
||||||
export class WorkflowWorkspaceEntity extends BaseWorkspaceEntity {
|
export class WorkflowWorkspaceEntity extends BaseWorkspaceEntity {
|
||||||
@WorkspaceField({
|
@WorkspaceField({
|
||||||
standardId: WORKFLOW_STANDARD_FIELD_IDS.name,
|
standardId: WORKFLOW_STANDARD_FIELD_IDS.name,
|
||||||
|
|||||||
Reference in New Issue
Block a user