From 07aeb53fa16aa084029726bf0a6775fe7e8604c6 Mon Sep 17 00:00:00 2001 From: schroda <50052685+schroda@users.noreply.github.com> Date: Sat, 11 Jan 2025 03:02:10 +0100 Subject: [PATCH] Commit metadata value migrations --- .../metadata/services/MetadataMigrations.ts | 45 ++++++++++++++++++- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/src/modules/metadata/services/MetadataMigrations.ts b/src/modules/metadata/services/MetadataMigrations.ts index 064fdcb1..54359c63 100644 --- a/src/modules/metadata/services/MetadataMigrations.ts +++ b/src/modules/metadata/services/MetadataMigrations.ts @@ -222,6 +222,40 @@ const getNewMetadataKeys = ( }); }; +const getMetadataKeysWithUpdatedValues = ( + metadata: Metadata | undefined, + newAndDeletedMetadataKeys: string[], +): string[] => { + if (!metadata) { + return []; + } + + const keysWithUpdatedValues = METADATA_MIGRATIONS.reduce((acc, migration) => { + const keysWithUpdatedValuesOfMigration = Object.keys(metadata).filter((metadataKey) => + migration.values?.some(({ key: migrationKey, oldValue }) => { + const isMigrationForAllKeys = !migrationKey; + const doesValueMatch = metadata[metadataKey] === oldValue; + + if (isMigrationForAllKeys) { + return doesValueMatch; + } + + return metadataKey.endsWith(migrationKey) && doesValueMatch; + }), + ); + + return [...acc, ...keysWithUpdatedValuesOfMigration]; + }, [] as string[]); + + return [ + ...new Set([ + ...keysWithUpdatedValues.filter( + (keyWithUpdatedValue) => !newAndDeletedMetadataKeys.includes(keyWithUpdatedValue), + ), + ]), + ]; +}; + /** * Prevent spamming requests due to frequent metadata reads while the migration hasn't been commited to the server yet */ @@ -241,8 +275,15 @@ const commitMigratedMetadata = ( const metadata = metadataHolder?.meta; const metadataKeysToDelete = getOutdatedMetadataKeys(metadata); - const metadataKeysToCommit = getNewMetadataKeys(metadata, migratedMetadata, metadataKeysToDelete); - const metadataToUpdate = metadataKeysToCommit.map((key) => [key, migratedMetadata[key]]) as MetadataKeyValuePair[]; + const newMetadataKeys = getNewMetadataKeys(metadata, migratedMetadata, metadataKeysToDelete); + const metadataKeysWithUpdatedValues = getMetadataKeysWithUpdatedValues(metadata, [ + ...metadataKeysToDelete, + ...newMetadataKeys, + ]); + const metadataToUpdate = [...newMetadataKeys, ...metadataKeysWithUpdatedValues].map((key) => [ + key, + migratedMetadata[key], + ]) as MetadataKeyValuePair[]; const updateMetadata = getMetadataUpdateFunction(type, metadataHolder ?? { id: -1, meta: {} }); const deleteMetadata = getMetadataDeleteFunction(type, metadataHolder ?? { id: -1, meta: {} });