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:
@@ -9,7 +9,6 @@ import { FeatureFlagModule } from 'src/engine/core-modules/feature-flag/feature-
|
||||
import { SdkClientModule } from 'src/engine/core-modules/sdk-client/sdk-client.module';
|
||||
import { FileStorageModule } from 'src/engine/core-modules/file-storage/file-storage.module';
|
||||
import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity';
|
||||
import { DataSourceModule } from 'src/engine/metadata-modules/data-source/data-source.module';
|
||||
import { FieldMetadataModule } from 'src/engine/metadata-modules/field-metadata/field-metadata.module';
|
||||
import { WorkspaceManyOrAllFlatEntityMapsCacheModule } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.module';
|
||||
import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
|
||||
@@ -37,7 +36,6 @@ import { WorkspaceMigrationModule } from 'src/engine/workspace-manager/workspace
|
||||
WorkspaceDataSourceModule,
|
||||
WorkspaceCacheStorageModule,
|
||||
TypeORMModule,
|
||||
DataSourceModule,
|
||||
RoleModule,
|
||||
RoleTargetModule,
|
||||
UserRoleModule,
|
||||
|
||||
+1
-10
@@ -3,7 +3,6 @@ import { Injectable } from '@nestjs/common';
|
||||
import { FieldMetadataType, RelationType } from 'twenty-shared/types';
|
||||
import { isDefined } from 'twenty-shared/utils';
|
||||
|
||||
import { type DataSourceEntity } from 'src/engine/metadata-modules/data-source/data-source.entity';
|
||||
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 { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type';
|
||||
@@ -195,11 +194,9 @@ export class DevSeederMetadataService {
|
||||
}
|
||||
|
||||
public async seed({
|
||||
dataSourceMetadata,
|
||||
workspaceId,
|
||||
light = false,
|
||||
}: {
|
||||
dataSourceMetadata: DataSourceEntity;
|
||||
workspaceId: string;
|
||||
light?: boolean;
|
||||
}) {
|
||||
@@ -207,7 +204,6 @@ export class DevSeederMetadataService {
|
||||
|
||||
for (const obj of config.objects) {
|
||||
await this.seedCustomObject({
|
||||
dataSourceId: dataSourceMetadata.id,
|
||||
workspaceId,
|
||||
objectMetadataSeed: obj.seed,
|
||||
});
|
||||
@@ -231,19 +227,14 @@ export class DevSeederMetadataService {
|
||||
}
|
||||
|
||||
private async seedCustomObject({
|
||||
dataSourceId,
|
||||
workspaceId,
|
||||
objectMetadataSeed,
|
||||
}: {
|
||||
dataSourceId: string;
|
||||
workspaceId: string;
|
||||
objectMetadataSeed: ObjectMetadataSeed;
|
||||
}): Promise<void> {
|
||||
await this.objectMetadataService.createOneObject({
|
||||
createObjectInput: {
|
||||
...objectMetadataSeed,
|
||||
dataSourceId,
|
||||
},
|
||||
createObjectInput: objectMetadataSeed,
|
||||
workspaceId,
|
||||
});
|
||||
}
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@ import { type CreateObjectInput } from 'src/engine/metadata-modules/object-metad
|
||||
|
||||
export type ObjectMetadataSeed = Omit<
|
||||
CreateObjectInput,
|
||||
'workspaceId' | 'dataSourceId' | 'fields'
|
||||
'workspaceId' | 'fields'
|
||||
> & {
|
||||
skipNameField?: boolean;
|
||||
};
|
||||
|
||||
+9
-11
@@ -1,14 +1,14 @@
|
||||
import { Injectable, Logger } from '@nestjs/common';
|
||||
import { InjectDataSource } from '@nestjs/typeorm';
|
||||
import { InjectDataSource, InjectRepository } from '@nestjs/typeorm';
|
||||
|
||||
import { ALL_METADATA_NAME } from 'twenty-shared/metadata';
|
||||
import { DataSource } from 'typeorm';
|
||||
import { DataSource, Repository } from 'typeorm';
|
||||
|
||||
import { ApplicationRegistrationService } from 'src/engine/core-modules/application/application-registration/application-registration.service';
|
||||
import { ApplicationService } from 'src/engine/core-modules/application/application.service';
|
||||
import { SdkClientGenerationService } from 'src/engine/core-modules/sdk-client/sdk-client-generation.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 { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity';
|
||||
import { getMetadataFlatEntityMapsKey } from 'src/engine/metadata-modules/flat-entity/utils/get-metadata-flat-entity-maps-key.util';
|
||||
import { getMetadataRelatedMetadataNames } from 'src/engine/metadata-modules/flat-entity/utils/get-metadata-related-metadata-names.util';
|
||||
import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
|
||||
@@ -33,7 +33,6 @@ export class DevSeederService {
|
||||
private readonly workspaceCacheStorageService: WorkspaceCacheStorageService,
|
||||
private readonly twentyConfigService: TwentyConfigService,
|
||||
private readonly workspaceDataSourceService: WorkspaceDataSourceService,
|
||||
private readonly dataSourceService: DataSourceService,
|
||||
private readonly twentyStandardApplicationService: TwentyStandardApplicationService,
|
||||
private readonly devSeederMetadataService: DevSeederMetadataService,
|
||||
private readonly devSeederPermissionsService: DevSeederPermissionsService,
|
||||
@@ -44,6 +43,8 @@ export class DevSeederService {
|
||||
private readonly sdkClientGenerationService: SdkClientGenerationService,
|
||||
@InjectDataSource()
|
||||
private readonly coreDataSource: DataSource,
|
||||
@InjectRepository(WorkspaceEntity)
|
||||
private readonly workspaceRepository: Repository<WorkspaceEntity>,
|
||||
) {}
|
||||
|
||||
public async seedDev(
|
||||
@@ -74,11 +75,9 @@ export class DevSeederService {
|
||||
['flatApplicationMaps', 'featureFlagsMap'],
|
||||
);
|
||||
|
||||
const dataSourceMetadata =
|
||||
await this.dataSourceService.createDataSourceMetadata(
|
||||
workspaceId,
|
||||
schemaName,
|
||||
);
|
||||
await this.workspaceRepository.update(workspaceId, {
|
||||
databaseSchema: schemaName,
|
||||
});
|
||||
|
||||
const { workspaceCustomFlatApplication, twentyStandardFlatApplication } =
|
||||
await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow(
|
||||
@@ -101,7 +100,6 @@ export class DevSeederService {
|
||||
});
|
||||
|
||||
await this.devSeederMetadataService.seed({
|
||||
dataSourceMetadata,
|
||||
workspaceId,
|
||||
light,
|
||||
});
|
||||
@@ -165,7 +163,7 @@ export class DevSeederService {
|
||||
);
|
||||
|
||||
await this.devSeederDataService.seed({
|
||||
schemaName: dataSourceMetadata.schema,
|
||||
schemaName,
|
||||
workspaceId,
|
||||
featureFlags: featureFlagsMap,
|
||||
light,
|
||||
|
||||
-2
@@ -10,7 +10,6 @@ import { UserVarsModule } from 'src/engine/core-modules/user/user-vars/user-vars
|
||||
import { UserModule } from 'src/engine/core-modules/user/user.module';
|
||||
import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity';
|
||||
import { WorkspaceModule } from 'src/engine/core-modules/workspace/workspace.module';
|
||||
import { DataSourceModule } from 'src/engine/metadata-modules/data-source/data-source.module';
|
||||
import { CleanOnboardingWorkspacesCommand } from 'src/engine/workspace-manager/workspace-cleaner/commands/clean-onboarding-workspaces.command';
|
||||
import { CleanOnboardingWorkspacesCronCommand } from 'src/engine/workspace-manager/workspace-cleaner/commands/clean-onboarding-workspaces.cron.command';
|
||||
import { CleanSuspendedWorkspacesCommand } from 'src/engine/workspace-manager/workspace-cleaner/commands/clean-suspended-workspaces.command';
|
||||
@@ -26,7 +25,6 @@ import { CleanerWorkspaceService } from 'src/engine/workspace-manager/workspace-
|
||||
BillingSubscriptionEntity,
|
||||
]),
|
||||
WorkspaceModule,
|
||||
DataSourceModule,
|
||||
UserVarsModule,
|
||||
UserModule,
|
||||
EmailModule,
|
||||
|
||||
@@ -6,7 +6,6 @@ import { FeatureFlagModule } from 'src/engine/core-modules/feature-flag/feature-
|
||||
import { UserWorkspaceEntity } from 'src/engine/core-modules/user-workspace/user-workspace.entity';
|
||||
import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity';
|
||||
import { AiAgentModule } from 'src/engine/metadata-modules/ai/ai-agent/ai-agent.module';
|
||||
import { DataSourceModule } from 'src/engine/metadata-modules/data-source/data-source.module';
|
||||
import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
|
||||
import { WorkspaceManyOrAllFlatEntityMapsCacheModule } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.module';
|
||||
import { LogicFunctionEntity } from 'src/engine/metadata-modules/logic-function/logic-function.entity';
|
||||
@@ -29,7 +28,6 @@ import { WorkspaceManagerService } from './workspace-manager.service';
|
||||
WorkspaceMigrationModule,
|
||||
ObjectMetadataModule,
|
||||
DevSeederModule,
|
||||
DataSourceModule,
|
||||
FeatureFlagModule,
|
||||
PermissionsModule,
|
||||
AiAgentModule,
|
||||
|
||||
@@ -14,7 +14,6 @@ import {
|
||||
} from 'src/engine/core-modules/sdk-client/jobs/generate-sdk-client.job';
|
||||
import { UserWorkspaceEntity } from 'src/engine/core-modules/user-workspace/user-workspace.entity';
|
||||
import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity';
|
||||
import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service';
|
||||
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';
|
||||
@@ -28,7 +27,6 @@ export class WorkspaceManagerService {
|
||||
|
||||
constructor(
|
||||
private readonly workspaceDataSourceService: WorkspaceDataSourceService,
|
||||
private readonly dataSourceService: DataSourceService,
|
||||
@InjectRepository(UserWorkspaceEntity)
|
||||
private readonly userWorkspaceRepository: Repository<UserWorkspaceEntity>,
|
||||
private readonly roleService: RoleService,
|
||||
@@ -65,10 +63,9 @@ export class WorkspaceManagerService {
|
||||
|
||||
const dataSourceMetadataCreationStart = performance.now();
|
||||
|
||||
await this.dataSourceService.createDataSourceMetadata(
|
||||
workspaceId,
|
||||
schemaName,
|
||||
);
|
||||
await this.workspaceRepository.update(workspaceId, {
|
||||
databaseSchema: schemaName,
|
||||
});
|
||||
|
||||
await this.applicationService.createTwentyStandardApplication({
|
||||
workspaceId,
|
||||
|
||||
+1
-3
@@ -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[];
|
||||
|
||||
+1
-13
@@ -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,
|
||||
});
|
||||
|
||||
+1
-6
@@ -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,
|
||||
|
||||
-2
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user