feat: sync metadata can alter and update a field (#3944)

This commit is contained in:
Jérémy M
2024-02-13 19:36:58 +01:00
committed by GitHub
parent 87fafae9be
commit 8ce7020b12
4 changed files with 44 additions and 6 deletions

View File

@ -55,7 +55,7 @@ export class WorkspaceFieldComparator {
const standardFieldMetadataMap = transformMetadataForComparison(
standardObjectMetadata.fields,
{
propertiesToIgnore: fieldPropertiesToStringify,
propertiesToStringify: fieldPropertiesToStringify,
keyFactory(datum) {
return datum.name;
},

View File

@ -108,7 +108,10 @@ export class WorkspaceMetadataUpdaterService {
storage: WorkspaceSyncStorage,
): Promise<{
createdFieldMetadataCollection: FieldMetadataEntity[];
updatedFieldMetadataCollection: FieldMetadataEntity[];
updatedFieldMetadataCollection: {
current: FieldMetadataEntity;
altered: FieldMetadataEntity;
}[];
}> {
const fieldMetadataRepository = manager.getRepository(FieldMetadataEntity);
@ -124,6 +127,11 @@ export class WorkspaceMetadataUpdaterService {
/**
* Update field metadata
*/
const oldFieldMetadataCollection = await fieldMetadataRepository.find({
where: {
id: In(storage.fieldMetadataUpdateCollection.map((field) => field.id)),
},
});
const updatedFieldMetadataCollection = await fieldMetadataRepository.save(
storage.fieldMetadataUpdateCollection as DeepPartial<FieldMetadataEntity>[],
);
@ -148,8 +156,29 @@ export class WorkspaceMetadataUpdaterService {
return {
createdFieldMetadataCollection:
createdFieldMetadataCollection as FieldMetadataEntity[],
updatedFieldMetadataCollection:
updatedFieldMetadataCollection as FieldMetadataEntity[],
updatedFieldMetadataCollection: oldFieldMetadataCollection.map(
(oldFieldMetadata) => {
const alteredFieldMetadata = updatedFieldMetadataCollection.find(
(field) => field.id === oldFieldMetadata.id,
);
if (!alteredFieldMetadata) {
throw new Error(
`Field ${oldFieldMetadata.id} not found in updatedFieldMetadataCollection`,
);
}
return {
current: oldFieldMetadata as FieldMetadataEntity,
// TypeORM save method doesn't return the whole entity...
// https://github.com/typeorm/typeorm/issues/3490
altered: {
...oldFieldMetadata,
...alteredFieldMetadata,
} as FieldMetadataEntity,
};
},
),
};
}

View File

@ -160,6 +160,13 @@ export class WorkspaceSyncObjectMetadataService {
WorkspaceMigrationBuilderAction.CREATE,
);
const updateFieldWorkspaceMigrations =
await this.workspaceMigrationFieldFactory.create(
originalObjectMetadataCollection,
metadataFieldUpdaterResult.updatedFieldMetadataCollection,
WorkspaceMigrationBuilderAction.UPDATE,
);
const deleteFieldWorkspaceMigrations =
await this.workspaceMigrationFieldFactory.create(
originalObjectMetadataCollection,
@ -173,6 +180,7 @@ export class WorkspaceSyncObjectMetadataService {
...createObjectWorkspaceMigrations,
...deleteObjectWorkspaceMigrations,
...createFieldWorkspaceMigrations,
...updateFieldWorkspaceMigrations,
...deleteFieldWorkspaceMigrations,
];
}

View File

@ -15,8 +15,9 @@ export class WorkspaceSyncStorage {
// Field metadata
private readonly _fieldMetadataCreateCollection: PartialFieldMetadata[] = [];
private readonly _fieldMetadataUpdateCollection: Partial<PartialFieldMetadata>[] =
[];
private readonly _fieldMetadataUpdateCollection: Partial<
PartialFieldMetadata & { id: string }
>[] = [];
private readonly _fieldMetadataDeleteCollection: FieldMetadataEntity[] = [];
// Relation metadata