fix: workspace health (#3916)

* fix: workspace health applying migrations multiple times

* fix: remove log

* fix: use logger
This commit is contained in:
Jérémy M
2024-02-12 16:17:17 +01:00
committed by GitHub
parent c13e55a753
commit b0b033aec9
4 changed files with 47 additions and 57 deletions

View File

@ -1,3 +1,5 @@
import { Logger } from '@nestjs/common';
import { Command, CommandRunner, Option } from 'nest-commander';
import chalk from 'chalk';
@ -20,6 +22,7 @@ interface WorkspaceHealthCommandOptions {
description: 'Check health of the given workspace.',
})
export class WorkspaceHealthCommand extends CommandRunner {
private readonly logger = new Logger(WorkspaceHealthCommand.name);
private readonly commandLogger = new CommandLogger(
WorkspaceHealthCommand.name,
);
@ -40,21 +43,23 @@ export class WorkspaceHealthCommand extends CommandRunner {
);
if (issues.length === 0) {
console.log(chalk.green('Workspace is healthy'));
this.logger.log(chalk.green('Workspace is healthy'));
} else {
console.log(chalk.red('Workspace is not healthy'));
this.logger.log(
chalk.red(`Workspace is not healthy, found ${issues.length} issues`),
);
if (options.verbose) {
console.group(chalk.red('Issues'));
issues.forEach((issue) => {
console.log(chalk.yellow(JSON.stringify(issue, null, 2)));
});
console.groupEnd();
await this.commandLogger.writeLog(
`workspace-health-issues-${options.workspaceId}`,
issues,
);
this.logger.log(chalk.yellow('Issues written to log'));
}
}
if (options.fix) {
console.log(chalk.yellow('Fixing issues'));
this.logger.log(chalk.yellow('Fixing issues'));
const workspaceMigrations = await this.workspaceHealthService.fixIssues(
options.workspaceId,
@ -71,7 +76,7 @@ export class WorkspaceHealthCommand extends CommandRunner {
workspaceMigrations,
);
} else {
console.log(
this.logger.log(
chalk.green(
`Fixed ${workspaceMigrations.length}/${issues.length} issues`,
),

View File

@ -28,24 +28,19 @@ export class WorkspaceFixDefaultValueService {
issues: WorkspaceHealthDefaultValueIssue[],
): Promise<Partial<WorkspaceMigrationEntity>[]> {
const workspaceMigrations: Partial<WorkspaceMigrationEntity>[] = [];
const defaultValueIssues = issues.filter(
(issue) =>
issue.type === WorkspaceHealthIssueType.COLUMN_DEFAULT_VALUE_CONFLICT,
) as WorkspaceHealthColumnIssue<WorkspaceHealthIssueType.COLUMN_DEFAULT_VALUE_CONFLICT>[];
for (const issue of issues) {
switch (issue.type) {
case WorkspaceHealthIssueType.COLUMN_DEFAULT_VALUE_CONFLICT: {
const columnNullabilityWorkspaceMigrations =
await this.fixColumnDefaultValueIssues(
objectMetadataCollection,
issues.filter(
(issue) =>
issue.type ===
WorkspaceHealthIssueType.COLUMN_DEFAULT_VALUE_CONFLICT,
) as WorkspaceHealthColumnIssue<WorkspaceHealthIssueType.COLUMN_DEFAULT_VALUE_CONFLICT>[],
);
if (defaultValueIssues.length > 0) {
const columnDefaultValueWorkspaceMigrations =
await this.fixColumnDefaultValueIssues(
objectMetadataCollection,
defaultValueIssues,
);
workspaceMigrations.push(...columnNullabilityWorkspaceMigrations);
break;
}
}
workspaceMigrations.push(...columnDefaultValueWorkspaceMigrations);
}
return workspaceMigrations;

View File

@ -27,24 +27,19 @@ export class WorkspaceFixNullableService {
issues: WorkspaceHealthNullableIssue[],
): Promise<Partial<WorkspaceMigrationEntity>[]> {
const workspaceMigrations: Partial<WorkspaceMigrationEntity>[] = [];
const nullabilityIssues = issues.filter(
(issue) =>
issue.type === WorkspaceHealthIssueType.COLUMN_NULLABILITY_CONFLICT,
) as WorkspaceHealthColumnIssue<WorkspaceHealthIssueType.COLUMN_NULLABILITY_CONFLICT>[];
for (const issue of issues) {
switch (issue.type) {
case WorkspaceHealthIssueType.COLUMN_NULLABILITY_CONFLICT: {
const columnNullabilityWorkspaceMigrations =
await this.fixColumnNullabilityIssues(
objectMetadataCollection,
issues.filter(
(issue) =>
issue.type ===
WorkspaceHealthIssueType.COLUMN_NULLABILITY_CONFLICT,
) as WorkspaceHealthColumnIssue<WorkspaceHealthIssueType.COLUMN_NULLABILITY_CONFLICT>[],
);
if (nullabilityIssues.length > 0) {
const columnNullabilityWorkspaceMigrations =
await this.fixColumnNullabilityIssues(
objectMetadataCollection,
nullabilityIssues,
);
workspaceMigrations.push(...columnNullabilityWorkspaceMigrations);
break;
}
}
workspaceMigrations.push(...columnNullabilityWorkspaceMigrations);
}
return workspaceMigrations;

View File

@ -30,24 +30,19 @@ export class WorkspaceFixTypeService {
issues: WorkspaceHealthTypeIssue[],
): Promise<Partial<WorkspaceMigrationEntity>[]> {
const workspaceMigrations: Partial<WorkspaceMigrationEntity>[] = [];
const columnTypeIssues = issues.filter(
(issue) =>
issue.type === WorkspaceHealthIssueType.COLUMN_DATA_TYPE_CONFLICT,
) as WorkspaceHealthColumnIssue<WorkspaceHealthIssueType.COLUMN_DATA_TYPE_CONFLICT>[];
for (const issue of issues) {
switch (issue.type) {
case WorkspaceHealthIssueType.COLUMN_DATA_TYPE_CONFLICT: {
const columnNullabilityWorkspaceMigrations =
await this.fixColumnTypeIssues(
objectMetadataCollection,
issues.filter(
(issue) =>
issue.type ===
WorkspaceHealthIssueType.COLUMN_DATA_TYPE_CONFLICT,
) as WorkspaceHealthColumnIssue<WorkspaceHealthIssueType.COLUMN_DATA_TYPE_CONFLICT>[],
);
if (columnTypeIssues.length > 0) {
const columnNullabilityWorkspaceMigrations =
await this.fixColumnTypeIssues(
objectMetadataCollection,
columnTypeIssues,
);
workspaceMigrations.push(...columnNullabilityWorkspaceMigrations);
break;
}
}
workspaceMigrations.push(...columnNullabilityWorkspaceMigrations);
}
return workspaceMigrations;