feat: workspace:health nullable fix (#3882)
This commit is contained in:
@ -0,0 +1,73 @@
|
||||
import { Injectable } from '@nestjs/common';
|
||||
|
||||
import { WorkspaceSyncStorage } from 'src/workspace/workspace-sync-metadata/storage/workspace-sync.storage';
|
||||
import { WorkspaceMigrationEntity } from 'src/metadata/workspace-migration/workspace-migration.entity';
|
||||
import { CommandLogger } from 'src/commands/command-logger';
|
||||
|
||||
@Injectable()
|
||||
export class SyncWorkspaceLoggerService {
|
||||
private readonly commandLogger = new CommandLogger(
|
||||
SyncWorkspaceLoggerService.name,
|
||||
);
|
||||
|
||||
constructor() {}
|
||||
|
||||
async saveLogs(
|
||||
storage: WorkspaceSyncStorage,
|
||||
workspaceMigrations: WorkspaceMigrationEntity[],
|
||||
) {
|
||||
// Save workspace migrations
|
||||
await this.commandLogger.writeLog(
|
||||
'workspace-migrations',
|
||||
workspaceMigrations,
|
||||
);
|
||||
|
||||
// Save object metadata create collection
|
||||
await this.commandLogger.writeLog(
|
||||
'object-metadata-create-collection',
|
||||
storage.objectMetadataCreateCollection,
|
||||
);
|
||||
|
||||
// Save object metadata update collection
|
||||
await this.commandLogger.writeLog(
|
||||
'object-metadata-update-collection',
|
||||
storage.objectMetadataUpdateCollection,
|
||||
);
|
||||
|
||||
// Save object metadata delete collection
|
||||
await this.commandLogger.writeLog(
|
||||
'object-metadata-delete-collection',
|
||||
storage.objectMetadataDeleteCollection,
|
||||
);
|
||||
|
||||
// Save field metadata create collection
|
||||
await this.commandLogger.writeLog(
|
||||
'field-metadata-create-collection',
|
||||
storage.fieldMetadataCreateCollection,
|
||||
);
|
||||
|
||||
// Save field metadata update collection
|
||||
await this.commandLogger.writeLog(
|
||||
'field-metadata-update-collection',
|
||||
storage.fieldMetadataUpdateCollection,
|
||||
);
|
||||
|
||||
// Save field metadata delete collection
|
||||
await this.commandLogger.writeLog(
|
||||
'field-metadata-delete-collection',
|
||||
storage.fieldMetadataDeleteCollection,
|
||||
);
|
||||
|
||||
// Save relation metadata create collection
|
||||
await this.commandLogger.writeLog(
|
||||
'relation-metadata-create-collection',
|
||||
storage.relationMetadataCreateCollection,
|
||||
);
|
||||
|
||||
// Save relation metadata delete collection
|
||||
await this.commandLogger.writeLog(
|
||||
'relation-metadata-delete-collection',
|
||||
storage.relationMetadataDeleteCollection,
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -3,6 +3,8 @@ 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 { SyncWorkspaceLoggerService } from './services/sync-workspace-logger.service';
|
||||
|
||||
// TODO: implement dry-run
|
||||
interface RunWorkspaceMigrationsOptions {
|
||||
workspaceId: string;
|
||||
@ -17,6 +19,7 @@ export class SyncWorkspaceMetadataCommand extends CommandRunner {
|
||||
constructor(
|
||||
private readonly workspaceSyncMetadataService: WorkspaceSyncMetadataService,
|
||||
private readonly dataSourceService: DataSourceService,
|
||||
private readonly syncWorkspaceLoggerService: SyncWorkspaceLoggerService,
|
||||
) {
|
||||
super();
|
||||
}
|
||||
@ -31,13 +34,21 @@ export class SyncWorkspaceMetadataCommand extends CommandRunner {
|
||||
options.workspaceId,
|
||||
);
|
||||
|
||||
await this.workspaceSyncMetadataService.syncStandardObjectsAndFieldsMetadata(
|
||||
{
|
||||
workspaceId: options.workspaceId,
|
||||
dataSourceId: dataSourceMetadata.id,
|
||||
},
|
||||
{ dryRun: options.dryRun },
|
||||
);
|
||||
const { storage, workspaceMigrations } =
|
||||
await this.workspaceSyncMetadataService.syncStandardObjectsAndFieldsMetadata(
|
||||
{
|
||||
workspaceId: options.workspaceId,
|
||||
dataSourceId: dataSourceMetadata.id,
|
||||
},
|
||||
{ applyChanges: !options.dryRun },
|
||||
);
|
||||
|
||||
if (options.dryRun) {
|
||||
await this.syncWorkspaceLoggerService.saveLogs(
|
||||
storage,
|
||||
workspaceMigrations,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@Option({
|
||||
|
||||
@ -5,8 +5,10 @@ import { WorkspaceSyncMetadataModule } from 'src/workspace/workspace-sync-metada
|
||||
|
||||
import { SyncWorkspaceMetadataCommand } from './sync-workspace-metadata.command';
|
||||
|
||||
import { SyncWorkspaceLoggerService } from './services/sync-workspace-logger.service';
|
||||
|
||||
@Module({
|
||||
imports: [WorkspaceSyncMetadataModule, DataSourceModule],
|
||||
providers: [SyncWorkspaceMetadataCommand],
|
||||
providers: [SyncWorkspaceMetadataCommand, SyncWorkspaceLoggerService],
|
||||
})
|
||||
export class WorkspaceSyncMetadataCommandsModule {}
|
||||
|
||||
@ -1,76 +0,0 @@
|
||||
import { Injectable } from '@nestjs/common';
|
||||
|
||||
import { existsSync } from 'fs';
|
||||
import fs from 'fs/promises';
|
||||
|
||||
import { WorkspaceSyncStorage } from 'src/workspace/workspace-sync-metadata/storage/workspace-sync.storage';
|
||||
import { WorkspaceMigrationEntity } from 'src/metadata/workspace-migration/workspace-migration.entity';
|
||||
|
||||
@Injectable()
|
||||
export class WorkspaceLogsService {
|
||||
constructor() {}
|
||||
|
||||
async saveLogs(
|
||||
storage: WorkspaceSyncStorage,
|
||||
workspaceMigrations: WorkspaceMigrationEntity[],
|
||||
) {
|
||||
// Check if `logs` folder exists
|
||||
if (existsSync('./logs') === false) {
|
||||
await fs.mkdir('./logs', { recursive: true });
|
||||
}
|
||||
|
||||
// Save workspace migrations
|
||||
await fs.writeFile(
|
||||
'./logs/workspace-migrations.json',
|
||||
JSON.stringify(workspaceMigrations, null, 2),
|
||||
);
|
||||
|
||||
// Save object metadata create collection
|
||||
await fs.writeFile(
|
||||
'./logs/object-metadata-create-collection.json',
|
||||
JSON.stringify(storage.objectMetadataCreateCollection, null, 2),
|
||||
);
|
||||
|
||||
// Save object metadata update collection
|
||||
await fs.writeFile(
|
||||
'./logs/object-metadata-update-collection.json',
|
||||
JSON.stringify(storage.objectMetadataUpdateCollection, null, 2),
|
||||
);
|
||||
|
||||
// Save object metadata delete collection
|
||||
await fs.writeFile(
|
||||
'./logs/object-metadata-delete-collection.json',
|
||||
JSON.stringify(storage.objectMetadataDeleteCollection, null, 2),
|
||||
);
|
||||
|
||||
// Save field metadata create collection
|
||||
await fs.writeFile(
|
||||
'./logs/field-metadata-create-collection.json',
|
||||
JSON.stringify(storage.fieldMetadataCreateCollection, null, 2),
|
||||
);
|
||||
|
||||
// Save field metadata update collection
|
||||
await fs.writeFile(
|
||||
'./logs/field-metadata-update-collection.json',
|
||||
JSON.stringify(storage.fieldMetadataUpdateCollection, null, 2),
|
||||
);
|
||||
|
||||
// Save field metadata delete collection
|
||||
await fs.writeFile(
|
||||
'./logs/field-metadata-delete-collection.json',
|
||||
JSON.stringify(storage.fieldMetadataDeleteCollection, null, 2),
|
||||
);
|
||||
|
||||
// Save relation metadata create collection
|
||||
await fs.writeFile(
|
||||
'./logs/relation-metadata-create-collection.json',
|
||||
JSON.stringify(storage.relationMetadataCreateCollection, null, 2),
|
||||
);
|
||||
|
||||
// Save relation metadata delete collection
|
||||
await fs.writeFile(
|
||||
'./logs/relation-metadata-delete-collection.json',
|
||||
JSON.stringify(storage.relationMetadataDeleteCollection, null, 2),
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -13,7 +13,6 @@ import { workspaceSyncMetadataComparators } from 'src/workspace/workspace-sync-m
|
||||
import { WorkspaceMetadataUpdaterService } from 'src/workspace/workspace-sync-metadata/services/workspace-metadata-updater.service';
|
||||
import { WorkspaceSyncObjectMetadataService } from 'src/workspace/workspace-sync-metadata/services/workspace-sync-object-metadata.service';
|
||||
import { WorkspaceSyncRelationMetadataService } from 'src/workspace/workspace-sync-metadata/services/workspace-sync-relation-metadata.service';
|
||||
import { WorkspaceLogsService } from 'src/workspace/workspace-sync-metadata/services/workspace-logs.service';
|
||||
import { WorkspaceMigrationBuilderModule } from 'src/workspace/workspace-migration-builder/workspace-migration-builder.module';
|
||||
|
||||
@Module({
|
||||
@ -38,7 +37,6 @@ import { WorkspaceMigrationBuilderModule } from 'src/workspace/workspace-migrati
|
||||
WorkspaceSyncObjectMetadataService,
|
||||
WorkspaceSyncRelationMetadataService,
|
||||
WorkspaceSyncMetadataService,
|
||||
WorkspaceLogsService,
|
||||
],
|
||||
exports: [WorkspaceSyncMetadataService],
|
||||
})
|
||||
|
||||
@ -10,7 +10,6 @@ import { FeatureFlagFactory } from 'src/workspace/workspace-sync-metadata/factor
|
||||
import { WorkspaceSyncObjectMetadataService } from 'src/workspace/workspace-sync-metadata/services/workspace-sync-object-metadata.service';
|
||||
import { WorkspaceSyncRelationMetadataService } from 'src/workspace/workspace-sync-metadata/services/workspace-sync-relation-metadata.service';
|
||||
import { WorkspaceSyncStorage } from 'src/workspace/workspace-sync-metadata/storage/workspace-sync.storage';
|
||||
import { WorkspaceLogsService } from 'src/workspace/workspace-sync-metadata/services/workspace-logs.service';
|
||||
import { WorkspaceMigrationEntity } from 'src/metadata/workspace-migration/workspace-migration.entity';
|
||||
|
||||
@Injectable()
|
||||
@ -24,7 +23,6 @@ export class WorkspaceSyncMetadataService {
|
||||
private readonly workspaceMigrationRunnerService: WorkspaceMigrationRunnerService,
|
||||
private readonly workspaceSyncObjectMetadataService: WorkspaceSyncObjectMetadataService,
|
||||
private readonly workspaceSyncRelationMetadataService: WorkspaceSyncRelationMetadataService,
|
||||
private readonly workspaceLogsService: WorkspaceLogsService,
|
||||
) {}
|
||||
|
||||
/**
|
||||
@ -37,18 +35,23 @@ export class WorkspaceSyncMetadataService {
|
||||
*/
|
||||
public async syncStandardObjectsAndFieldsMetadata(
|
||||
context: WorkspaceSyncContext,
|
||||
options?: { dryRun?: boolean },
|
||||
) {
|
||||
this.logger.log('Syncing standard objects and fields metadata');
|
||||
options: { applyChanges?: boolean } = { applyChanges: true },
|
||||
): Promise<{
|
||||
workspaceMigrations: WorkspaceMigrationEntity[];
|
||||
storage: WorkspaceSyncStorage;
|
||||
}> {
|
||||
let workspaceMigrations: WorkspaceMigrationEntity[] = [];
|
||||
const storage = new WorkspaceSyncStorage();
|
||||
const queryRunner = this.metadataDataSource.createQueryRunner();
|
||||
|
||||
this.logger.log('Syncing standard objects and fields metadata');
|
||||
|
||||
await queryRunner.connect();
|
||||
await queryRunner.startTransaction();
|
||||
|
||||
const manager = queryRunner.manager;
|
||||
|
||||
try {
|
||||
const storage = new WorkspaceSyncStorage();
|
||||
const workspaceMigrationRepository = manager.getRepository(
|
||||
WorkspaceMigrationEntity,
|
||||
);
|
||||
@ -76,20 +79,23 @@ export class WorkspaceSyncMetadataService {
|
||||
);
|
||||
|
||||
// Save workspace migrations into the database
|
||||
const workspaceMigrations = await workspaceMigrationRepository.save([
|
||||
workspaceMigrations = await workspaceMigrationRepository.save([
|
||||
...workspaceObjectMigrations,
|
||||
...workspaceRelationMigrations,
|
||||
]);
|
||||
|
||||
// If we're running a dry run, rollback the transaction and do not execute migrations
|
||||
if (options?.dryRun) {
|
||||
if (!options.applyChanges) {
|
||||
this.logger.log('Running in dry run mode, rolling back transaction');
|
||||
|
||||
await queryRunner.rollbackTransaction();
|
||||
|
||||
await this.workspaceLogsService.saveLogs(storage, workspaceMigrations);
|
||||
await queryRunner.release();
|
||||
|
||||
return;
|
||||
return {
|
||||
workspaceMigrations,
|
||||
storage,
|
||||
};
|
||||
}
|
||||
|
||||
await queryRunner.commitTransaction();
|
||||
@ -104,5 +110,10 @@ export class WorkspaceSyncMetadataService {
|
||||
} finally {
|
||||
await queryRunner.release();
|
||||
}
|
||||
|
||||
return {
|
||||
workspaceMigrations,
|
||||
storage,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user