/* * Copyright (C) Contributors to the Suwayomi project * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ import { requestManager } from '@/lib/requests/RequestManager.ts'; import { SourceType } from '@/lib/graphql/generated/graphql.ts'; import { ChapterIdInfo } from '@/modules/chapter/services/Chapters.ts'; import { CategoryIdInfo } from '@/modules/category/Category.types.ts'; import { AllowedMetadataValueTypes, AppMetadataKeys, GqlMetaHolder, MetadataHolderType, MetadataKeyValuePair, } from '@/modules/metadata/Metadata.types.ts'; import { MangaIdInfo } from '@/modules/manga/Manga.types.ts'; import { getMetadataKey } from '@/modules/metadata/Metadata.utils.ts'; export const requestUpdateMetadataValue = async ( metadataHolder: GqlMetaHolder, holderType: MetadataHolderType, key: AppMetadataKeys, value: AllowedMetadataValueTypes, keyPrefixes?: string[], ): Promise => { const metadataKey = getMetadataKey(key, keyPrefixes); switch (holderType) { case 'category': await requestManager.setCategoryMeta((metadataHolder as CategoryIdInfo).id, metadataKey, value).response; break; case 'chapter': await requestManager.setChapterMeta((metadataHolder as ChapterIdInfo).id, metadataKey, value).response; break; case 'global': await requestManager.setGlobalMetadata(metadataKey, value).response; break; case 'manga': await requestManager.setMangaMeta((metadataHolder as MangaIdInfo).id, metadataKey, value).response; break; case 'source': await requestManager.setSourceMeta((metadataHolder as Pick).id, metadataKey, value) .response; break; default: throw new Error(`requestUpdateMetadataValue: unknown holderType "${holderType}"`); } }; export const requestUpdateMetadata = async ( metadataHolder: GqlMetaHolder, holderType: MetadataHolderType, keysToValues: MetadataKeyValuePair[], keyPrefixes?: string[], ): Promise => Promise.all( keysToValues.map(([key, value]) => requestUpdateMetadataValue(metadataHolder, holderType, key, value, keyPrefixes), ), ); export const requestUpdateServerMetadata = async ( keysToValues: MetadataKeyValuePair[], keyPrefixes?: string[], ): Promise => requestUpdateMetadata({}, 'global', keysToValues, keyPrefixes); export const requestUpdateMangaMetadata = async ( manga: MangaIdInfo & GqlMetaHolder, keysToValues: MetadataKeyValuePair[], keyPrefixes?: string[], ): Promise => requestUpdateMetadata(manga, 'manga', keysToValues, keyPrefixes); export const requestUpdateChapterMetadata = async ( chapter: ChapterIdInfo & GqlMetaHolder, keysToValues: MetadataKeyValuePair[], keyPrefixes?: string[], ): Promise => requestUpdateMetadata(chapter, 'chapter', keysToValues, keyPrefixes); export const requestUpdateCategoryMetadata = async ( category: CategoryIdInfo & GqlMetaHolder, keysToValues: MetadataKeyValuePair[], keyPrefixes?: string[], ): Promise => requestUpdateMetadata(category, 'category', keysToValues, keyPrefixes); export const requestUpdateSourceMetadata = async ( source: Pick & GqlMetaHolder, keysToValue: MetadataKeyValuePair[], keyPrefixes?: string[], ): Promise => requestUpdateMetadata(source, 'source', keysToValue, keyPrefixes); export const requestDeleteMetadataValue = async ( metadataHolder: GqlMetaHolder, holderType: MetadataHolderType, key: AppMetadataKeys, keyPrefixes?: string[], ): Promise => { const metadataKey = getMetadataKey(key, keyPrefixes); switch (holderType) { case 'category': await requestManager.deleteCategoryMeta((metadataHolder as CategoryIdInfo).id, metadataKey).response; break; case 'chapter': await requestManager.deleteChapterMeta((metadataHolder as ChapterIdInfo).id, metadataKey).response; break; case 'global': await requestManager.deleteGlobalMeta(metadataKey).response; break; case 'manga': await requestManager.deleteMangaMeta((metadataHolder as MangaIdInfo).id, metadataKey).response; break; case 'source': await requestManager.deleteSourceMeta((metadataHolder as Pick).id, metadataKey).response; break; default: throw new Error(`requestDeleteMetadataValue: unknown holderType "${holderType}"`); } }; export async function requestDeleteMetadata( metadataHolder: GqlMetaHolder, holderType: MetadataHolderType, keys: AppMetadataKeys[], keyPrefixes?: string[], ): Promise { return Promise.all(keys.map((key) => requestDeleteMetadataValue(metadataHolder, holderType, key, keyPrefixes))); } export const requestDeleteServerMetadata = async (keys: AppMetadataKeys[], keyPrefixes?: string[]): Promise => requestDeleteMetadata({}, 'global', keys, keyPrefixes); export const requestDeleteMangaMetadata = async ( manga: MangaIdInfo & GqlMetaHolder, keys: AppMetadataKeys[], keyPrefixes?: string[], ): Promise => requestDeleteMetadata(manga, 'manga', keys, keyPrefixes); export const requestDeleteChapterMetadata = async ( chapter: ChapterIdInfo & GqlMetaHolder, keys: AppMetadataKeys[], keyPrefixes?: string[], ): Promise => requestDeleteMetadata(chapter, 'chapter', keys, keyPrefixes); export const requestDeleteCategoryMetadata = async ( category: CategoryIdInfo & GqlMetaHolder, keys: AppMetadataKeys[], keyPrefixes?: string[], ): Promise => requestDeleteMetadata(category, 'category', keys, keyPrefixes); export const requestDeleteSourceMetadata = async ( source: Pick & GqlMetaHolder, keys: AppMetadataKeys[], keyPrefixes?: string[], ): Promise => requestDeleteMetadata(source, 'source', keys, keyPrefixes);