Remove DataSourceService and clean up datasource migration logic (#19532)

## Summary

- **Drop the `objectMetadata.dataSourceId` foreign key and index** via a
1-22 fast instance command — column kept nullable for data preservation
- **Delete `DataSourceService`, `DataSourceModule`, and
`DataSourceException`** — all code now uses `workspace.databaseSchema`
directly
- **Remove `IS_DATASOURCE_MIGRATED` feature flag** from default flags
and all branching logic
- **Simplify workspace/object creation pipelines** —
`WorkspaceManagerService`, `DevSeederService`, and the object creation
action handler no longer route through `DataSourceService`
- **Keep `DataSourceEntity` and the `dataSource` table** for historical
data — entity stripped of all ORM relations
This commit is contained in:
Charles Bochet
2026-04-10 09:34:05 +02:00
committed by GitHub
parent 4fd721a3c9
commit f6423f5925
55 changed files with 75 additions and 388 deletions
@@ -1,5 +1,3 @@
import { FeatureFlagKey } from 'twenty-shared/types';
export const DEFAULT_FEATURE_FLAGS = [
FeatureFlagKey.IS_DATASOURCE_MIGRATED,
] as const satisfies FeatureFlagKey[];
export const DEFAULT_FEATURE_FLAGS = [] as const satisfies FeatureFlagKey[];
@@ -4,7 +4,6 @@ import { v4 } from 'uuid';
import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/interfaces/workspace-migration-runner-action-handler-service.interface';
import { DataSourceEntity } from 'src/engine/metadata-modules/data-source/data-source.entity';
import { ALL_METADATA_ENTITY_BY_METADATA_NAME } from 'src/engine/metadata-modules/flat-entity/constant/all-metadata-entity-by-metadata-name.constant';
import { isCompositeFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-composite-flat-field-metadata.util';
import { isEnumFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-enum-flat-field-metadata.util';
@@ -42,19 +41,9 @@ export class CreateObjectActionHandlerService extends WorkspaceMigrationRunnerAc
override async transpileUniversalActionToFlatAction(
context: WorkspaceMigrationActionRunnerArgs<UniversalCreateObjectAction>,
): Promise<FlatCreateObjectAction> {
const { action, queryRunner, workspaceId, allFlatEntityMaps } = context;
const { action, workspaceId, allFlatEntityMaps } = context;
const { fieldIdByUniversalIdentifier, id: providedObjectId } = action;
const dataSourceRepository =
queryRunner.manager.getRepository<DataSourceEntity>(DataSourceEntity);
const lastDataSourceMetadata = await dataSourceRepository.findOneOrFail({
where: {
workspaceId,
},
order: { createdAt: 'DESC' },
});
const allFieldIdToBeCreatedInActionByUniversalIdentifierMap = new Map<
string,
string
@@ -77,7 +66,6 @@ export class CreateObjectActionHandlerService extends WorkspaceMigrationRunnerAc
allFieldIdToBeCreatedInActionByUniversalIdentifierMap,
allFlatEntityMaps,
context,
dataSourceId: lastDataSourceMetadata.id,
generatedId: providedObjectId ?? v4(),
universalFlatObjectMetadata: action.flatEntity,
});
@@ -20,7 +20,6 @@ export type FromUniversalFlatObjectMetadataToFlatObjectMetadataArgs = {
WorkspaceMigrationActionRunnerArgs<AllUniversalWorkspaceMigrationAction>,
'workspaceId' | 'flatApplication'
>;
dataSourceId: string;
};
const findFieldMetadataIdInCreateObjectContext = ({
@@ -49,7 +48,6 @@ const findFieldMetadataIdInCreateObjectContext = ({
export const fromUniversalFlatObjectMetadataToFlatObjectMetadata = ({
universalFlatObjectMetadata,
dataSourceId,
generatedId,
allFlatEntityMaps,
allFieldIdToBeCreatedInActionByUniversalIdentifierMap,
@@ -57,9 +55,7 @@ export const fromUniversalFlatObjectMetadataToFlatObjectMetadata = ({
flatApplication: { id: applicationId },
workspaceId,
},
}: FromUniversalFlatObjectMetadataToFlatObjectMetadataArgs): FlatObjectMetadata & {
dataSourceId: string;
} => {
}: FromUniversalFlatObjectMetadataToFlatObjectMetadataArgs): FlatObjectMetadata => {
const {
universalIdentifier,
applicationUniversalIdentifier,
@@ -107,7 +103,6 @@ export const fromUniversalFlatObjectMetadataToFlatObjectMetadata = ({
return {
...restProperties,
dataSourceId,
id: generatedId,
workspaceId,
applicationId,
@@ -6,7 +6,6 @@ import { WorkspaceIteratorModule } from 'src/database/commands/command-runners/w
import { TypeORMModule } from 'src/database/typeorm/typeorm.module';
import { FeatureFlagModule } from 'src/engine/core-modules/feature-flag/feature-flag.module';
import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity';
import { DataSourceModule } from 'src/engine/metadata-modules/data-source/data-source.module';
import { WorkspaceManyOrAllFlatEntityMapsCacheModule } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.module';
import { WorkspaceMetadataVersionModule } from 'src/engine/metadata-modules/workspace-metadata-version/workspace-metadata-version.module';
import { WorkspaceCacheStorageModule } from 'src/engine/workspace-cache-storage/workspace-cache-storage.module';
@@ -20,7 +19,6 @@ import { WorkspaceMigrationRunnerService } from 'src/engine/workspace-manager/wo
imports: [
FeatureFlagModule,
TypeORMModule,
DataSourceModule,
WorkspaceMetadataVersionModule,
WorkspaceSchemaMigrationRunnerActionHandlersModule,
WorkspaceManyOrAllFlatEntityMapsCacheModule,