feat: workspace health target column map fix (#3932)

* feat: workspace health fix target column map

* fix: remove log

* feat: refactor health fixer

* fix: default-value issue and health check not working with composite

* fix: enhance target column map fix

* feat: create workspace migrations for target-column-map issues

* feat: enhance workspace-health issue detection
This commit is contained in:
Jérémy M
2024-02-15 18:04:12 +01:00
committed by GitHub
parent 0b93a6785b
commit 990cb107a1
25 changed files with 625 additions and 246 deletions

View File

@ -1,7 +1,10 @@
import { Logger } from '@nestjs/common';
import { Command, CommandRunner, Option } from 'nest-commander';
import { DataSourceService } from 'src/metadata/data-source/data-source.service';
import { WorkspaceSyncMetadataService } from 'src/workspace/workspace-sync-metadata/workspace-sync-metadata.service';
import { WorkspaceHealthService } from 'src/workspace/workspace-health/workspace-health.service';
import { SyncWorkspaceLoggerService } from './services/sync-workspace-logger.service';
@ -9,6 +12,7 @@ import { SyncWorkspaceLoggerService } from './services/sync-workspace-logger.ser
interface RunWorkspaceMigrationsOptions {
workspaceId: string;
dryRun?: boolean;
force?: boolean;
}
@Command({
@ -16,8 +20,11 @@ interface RunWorkspaceMigrationsOptions {
description: 'Sync metadata',
})
export class SyncWorkspaceMetadataCommand extends CommandRunner {
private readonly logger = new Logger(SyncWorkspaceMetadataCommand.name);
constructor(
private readonly workspaceSyncMetadataService: WorkspaceSyncMetadataService,
private readonly workspaceHealthService: WorkspaceHealthService,
private readonly dataSourceService: DataSourceService,
private readonly syncWorkspaceLoggerService: SyncWorkspaceLoggerService,
) {
@ -28,7 +35,30 @@ export class SyncWorkspaceMetadataCommand extends CommandRunner {
_passedParam: string[],
options: RunWorkspaceMigrationsOptions,
): Promise<void> {
// TODO: run in a dedicated job + run queries in a transaction.
const issues = await this.workspaceHealthService.healthCheck(
options.workspaceId,
);
// Security: abort if there are issues.
if (issues.length > 0) {
if (!options.force) {
this.logger.error(
`Workspace contains ${issues.length} issues, aborting.`,
);
this.logger.log('If you want to force the migration, use --force flag');
this.logger.log(
'Please use `workspace:health` command to check issues and fix them before running this command.',
);
return;
}
this.logger.warn(
`Workspace contains ${issues.length} issues, sync has been forced.`,
);
}
const dataSourceMetadata =
await this.dataSourceService.getLastDataSourceMetadataFromWorkspaceIdOrFail(
options.workspaceId,
@ -68,4 +98,13 @@ export class SyncWorkspaceMetadataCommand extends CommandRunner {
dryRun(): boolean {
return true;
}
@Option({
flags: '-f, --force',
description: 'Force migration',
required: false,
})
force(): boolean {
return true;
}
}

View File

@ -2,13 +2,18 @@ import { Module } from '@nestjs/common';
import { DataSourceModule } from 'src/metadata/data-source/data-source.module';
import { WorkspaceSyncMetadataModule } from 'src/workspace/workspace-sync-metadata/workspace-sync-metadata.module';
import { WorkspaceHealthModule } from 'src/workspace/workspace-health/workspace-health.module';
import { SyncWorkspaceMetadataCommand } from './sync-workspace-metadata.command';
import { SyncWorkspaceLoggerService } from './services/sync-workspace-logger.service';
@Module({
imports: [WorkspaceSyncMetadataModule, DataSourceModule],
imports: [
WorkspaceSyncMetadataModule,
WorkspaceHealthModule,
DataSourceModule,
],
providers: [SyncWorkspaceMetadataCommand, SyncWorkspaceLoggerService],
})
export class WorkspaceSyncMetadataCommandsModule {}