Add logic to delete metadata on migration

This commit is contained in:
schroda
2025-01-05 14:15:29 +01:00
parent bb473276a7
commit 05ce572c67
3 changed files with 46 additions and 2 deletions

View File

@@ -160,6 +160,7 @@ export const GLOBAL_METADATA_KEYS: AppMetadataKeys[] = [
* 1. app metadata key prefix
* 2. app metadata values
* 3. app metadata keys
* 4. app metadata keys deletion
*
* @example
* // changes:

View File

@@ -24,6 +24,7 @@ export interface IMetadataMigration {
newValue: string | ((oldValue: string) => string);
}[];
keys?: { oldKey: string; newKey: string }[];
deleteKeys?: string[];
}
export type Metadata<Keys extends string = string, Values = string> = {

View File

@@ -132,6 +132,32 @@ const applyMetadataKeyMigration = (meta: Metadata, migration: IMetadataMigration
return migratedMetadata;
};
const applyMetadataDeleteKeysMigration = (
meta: Metadata,
migration: IMetadataMigration,
appKeyPrefix: string,
): Metadata => {
const migratedMetadata: Metadata = {};
if (!migration.deleteKeys) {
return migratedMetadata;
}
const appMetadata = getAppMetadataFrom(meta, undefined, appKeyPrefix);
migration.deleteKeys.forEach((keyToDelete) => {
Object.keys(appMetadata).forEach((key) => {
if (key.endsWith(keyToDelete)) {
return;
}
migratedMetadata[key] = appMetadata[key];
});
});
return migratedMetadata;
};
const getOutdatedMetadataKeys = (metadata?: Metadata): AppMetadataKeys[] => {
if (!metadata) {
return [];
@@ -146,6 +172,11 @@ const getOutdatedMetadataKeys = (metadata?: Metadata): AppMetadataKeys[] => {
return [...acc, oldPrefix];
}, [] as string[]);
const keyToDeleteInMigrations = METADATA_MIGRATIONS.reduce(
(acc, migration) => [...acc, ...(migration.deleteKeys ?? [])],
[] as string[],
);
return Object.keys(metadata).filter((key) => {
const appKeyPrefixOfKey = key.split('_')[0];
@@ -159,7 +190,13 @@ const getOutdatedMetadataKeys = (metadata?: Metadata): AppMetadataKeys[] => {
return true;
}
return !VALID_APP_METADATA_KEYS.includes(extractOriginalKey(key));
const extractedKey = extractOriginalKey(key);
if (keyToDeleteInMigrations.includes(extractedKey)) {
return true;
}
return !VALID_APP_METADATA_KEYS.includes(extractedKey);
}) as AppMetadataKeys[];
};
@@ -297,8 +334,13 @@ export const applyMetadataMigrations = (
migration,
appKeyPrefixForMigration,
);
const metadataKeysDeletedMigrated = applyMetadataDeleteKeysMigration(
metadataKeysMigrated,
migration,
appKeyPrefixForMigration,
);
migrationToMetadata.push([migrationId, metadataKeysMigrated]);
migrationToMetadata.push([migrationId, metadataKeysDeletedMigrated]);
});
const migratedMetadata = migrationToMetadata.pop()?.[1] ?? meta;