Migrate metadata once instead of when reading a value

This commit is contained in:
schroda
2025-01-04 21:42:41 +01:00
parent 258b26f837
commit 040584989e

View File

@@ -8,7 +8,6 @@
import { useEffect } from 'react'; import { useEffect } from 'react';
import { METADATA_MIGRATIONS, VALID_APP_METADATA_KEYS } from '@/modules/metadata/Metadata.constants.ts'; import { METADATA_MIGRATIONS, VALID_APP_METADATA_KEYS } from '@/modules/metadata/Metadata.constants.ts';
import { applyMetadataMigrations } from '@/modules/metadata/services/MetadataMigrations.ts';
import { convertToGqlMeta, convertValueFromMetadata } from '@/modules/metadata/services/MetadataConverter.ts'; import { convertToGqlMeta, convertValueFromMetadata } from '@/modules/metadata/services/MetadataConverter.ts';
import { import {
AllowedMetadataValueTypes, AllowedMetadataValueTypes,
@@ -36,16 +35,14 @@ import { ChapterIdInfo } from '@/modules/chapter/services/Chapters.ts';
import { CategoryIdInfo } from '@/modules/category/Category.types.ts'; import { CategoryIdInfo } from '@/modules/category/Category.types.ts';
import { SourceType } from '@/lib/graphql/generated/graphql.ts'; import { SourceType } from '@/lib/graphql/generated/graphql.ts';
import { doesMetadataKeyExistIn, extractOriginalKey, getMetadataKey } from '@/modules/metadata/Metadata.utils.ts'; import { doesMetadataKeyExistIn, extractOriginalKey, getMetadataKey } from '@/modules/metadata/Metadata.utils.ts';
import { applyMetadataMigrations } from '@/modules/metadata/services/MetadataMigrations.ts';
const getMetadataValueFrom = <Key extends AppMetadataKeys, Value extends AllowedMetadataValueTypes>( const getMetadataValueFrom = <Key extends AppMetadataKeys, Value extends AllowedMetadataValueTypes>(
{ meta }: MetadataHolder, metadata: Metadata | undefined,
key: Key, key: Key,
defaultValue?: Value, defaultValue?: Value,
prefixes?: string[], prefixes?: string[],
): Value | undefined => { ): Value | undefined => {
const requiresMigration = Number(meta?.migration) !== METADATA_MIGRATIONS.length;
const metadata = requiresMigration ? applyMetadataMigrations(meta) : meta;
if ( if (
metadata === undefined || metadata === undefined ||
!doesMetadataKeyExistIn(metadata, key, prefixes) || !doesMetadataKeyExistIn(metadata, key, prefixes) ||
@@ -199,12 +196,14 @@ export function getMetadataFrom<METADATA extends Partial<Metadata<AppMetadataKey
): METADATA { ): METADATA {
const wasMigrated = const wasMigrated =
!!metadataHolder?.meta && !!metadataHolder?.meta &&
Number(getMetadataValueFrom(metadataHolder, 'migration', 0)) !== METADATA_MIGRATIONS.length; Number(getMetadataValueFrom(metadataHolder.meta, 'migration', 0)) !== METADATA_MIGRATIONS.length;
const migratedMetadata = applyMetadataMigrations(metadataHolder.meta);
const appMetadata = {} as METADATA; const appMetadata = {} as METADATA;
Object.entries(metadataWithDefaultValues).forEach(([key, defaultValue]) => { Object.entries(metadataWithDefaultValues).forEach(([key, defaultValue]) => {
appMetadata[key as AppMetadataKeys] = getMetadataValueFrom( appMetadata[key as AppMetadataKeys] = getMetadataValueFrom(
metadataHolder, migratedMetadata,
key as AppMetadataKeys, key as AppMetadataKeys,
defaultValue, defaultValue,
prefixes, prefixes,