Reduce requested manga data in queries

This commit is contained in:
schroda
2024-07-08 18:02:50 +02:00
parent 4b30e9bc48
commit 3d21266f92
47 changed files with 759 additions and 471 deletions

View File

@@ -9,12 +9,13 @@
import { t as translate } from 'i18next';
import gql from 'graphql-tag';
import { DocumentNode } from '@apollo/client';
import { ChapterOffset, TManga, TranslationKey } from '@/typings.ts';
import { ChapterOffset, TranslationKey } from '@/typings.ts';
import { makeToast } from '@/components/util/Toast.tsx';
import { requestManager } from '@/lib/requests/RequestManager.ts';
import { getMetadataServerSettings } from '@/lib/metadata/metadataServerSettings.ts';
import { ChapterListFieldsFragment, ChapterType } from '@/lib/graphql/generated/graphql.ts';
import { CHAPTER_LIST_FIELDS } from '@/lib/graphql/fragments/ChapterFragments.ts';
import { MangaIdInfo } from '@/lib/data/Mangas.ts';
export type ChapterAction = 'download' | 'delete' | 'bookmark' | 'unbookmark' | 'mark_as_read' | 'mark_as_unread';
@@ -209,7 +210,7 @@ export class Chapters {
static async markAsRead(
chapters: (ChapterDownloadInfo & ChapterBookmarkInfo)[],
wasManuallyMarkedAsRead: boolean = false,
trackProgressMangaId?: TManga['id'],
trackProgressMangaId?: MangaIdInfo['id'],
): Promise<void> {
const { deleteChaptersManuallyMarkedRead, deleteChaptersWithBookmark, updateProgressManualMarkRead } =
await getMetadataServerSettings();
@@ -279,7 +280,7 @@ export class Chapters {
}: Action extends 'mark_as_read'
? {
wasManuallyMarkedAsRead: boolean;
trackProgressMangaId?: TManga['id'];
trackProgressMangaId?: MangaIdInfo['id'];
chapters: (ChapterDownloadInfo & ChapterBookmarkInfo & ChapterReadInfo)[];
}
: {

View File

@@ -8,19 +8,26 @@
import { t as translate } from 'i18next';
import { DocumentNode } from '@apollo/client/core';
import { MetadataMigrationSettings, TManga, TranslationKey } from '@/typings.ts';
import { MetadataMigrationSettings, TranslationKey } from '@/typings.ts';
import { requestManager } from '@/lib/requests/RequestManager.ts';
import {
ChapterConditionInput,
GetMangasBaseQuery,
GetMangasBaseQueryVariables,
GetMangasChapterIdsWithStateQuery,
GetMangaToMigrateQuery,
GetMangaToMigrateToFetchMutation,
MangaBaseFieldsFragment,
MangaReaderFieldsFragment,
MangaType,
TrackRecordType,
UpdateMangaCategoriesPatchInput,
} from '@/lib/graphql/generated/graphql.ts';
import { Chapters } from '@/lib/data/Chapters.ts';
import { makeToast } from '@/components/util/Toast.tsx';
import { getMetadataServerSettings } from '@/lib/metadata/metadataServerSettings.ts';
import { FULL_MANGA_FIELDS } from '@/lib/graphql/Fragments.ts';
import { GET_MANGAS_BASE } from '@/lib/graphql/queries/MangaQuery.ts';
import { MANGA_BASE_FIELDS } from '@/lib/graphql/fragments/MangaFragments.ts';
export type MangaAction =
| 'download'
@@ -108,10 +115,16 @@ export const actionToTranslationKey: {
},
};
export type MangaChapterCountInfo = { chapters: Pick<TManga['chapters'], 'totalCount'> };
export type MangaDownloadInfo = Pick<TManga, 'downloadCount'> & MangaChapterCountInfo;
export type MangaUnreadInfo = Pick<TManga, 'unreadCount'> & MangaChapterCountInfo;
export type MangaThumbnailInfo = Pick<TManga, 'thumbnailUrl' | 'thumbnailUrlLastFetched'>;
export type TMangaReader = MangaReaderFieldsFragment;
export type MangaIdInfo = Pick<MangaType, 'id'>;
export type MangaChapterCountInfo = { chapters: Pick<MangaType['chapters'], 'totalCount'> };
export type MangaDownloadInfo = Pick<MangaType, 'downloadCount'> & MangaChapterCountInfo;
export type MangaUnreadInfo = Pick<MangaType, 'unreadCount'> & MangaChapterCountInfo;
export type MangaThumbnailInfo = Pick<MangaType, 'thumbnailUrl' | 'thumbnailUrlLastFetched'>;
export type MangaTrackRecordInfo = MangaIdInfo & {
trackRecords: { nodes: Pick<TrackRecordType, 'id' | 'trackerId'>[] };
};
export type MigrateMode = 'copy' | 'migrate';
@@ -162,14 +175,14 @@ type PerformActionOptions<Action extends MangaAction> = Action extends 'mark_as_
: DefaultActionOption;
export class Mangas {
static getIds(mangas: { id: number }[]): number[] {
static getIds(mangas: MangaIdInfo[]): number[] {
return mangas.map((manga) => manga.id);
}
static getFromCache<T>(
id: number,
fragment: DocumentNode = FULL_MANGA_FIELDS,
fragmentName: string = 'FULL_MANGA_FIELDS',
static getFromCache<T = MangaBaseFieldsFragment>(
id: MangaIdInfo['id'],
fragment: DocumentNode = MANGA_BASE_FIELDS,
fragmentName: string = 'MANGA_BASE_FIELDS',
): T | null {
return requestManager.graphQLClient.client.cache.readFragment<T>({
id: requestManager.graphQLClient.client.cache.identify({
@@ -236,8 +249,10 @@ export class Mangas {
return requestManager.getValidImgUrlFor(thumbnailUrl);
}
static getDuplicateLibraryMangas(title: string): ReturnType<typeof requestManager.getMangas> {
return requestManager.getMangas({
static getDuplicateLibraryMangas(
title: string,
): ReturnType<typeof requestManager.getMangas<GetMangasBaseQuery, GetMangasBaseQueryVariables>> {
return requestManager.getMangas<GetMangasBaseQuery, GetMangasBaseQueryVariables>(GET_MANGAS_BASE, {
condition: { inLibrary: true },
filter: { title: { likeInsensitive: title } },
});
@@ -429,7 +444,7 @@ export class Mangas {
}
static async migrate(
mangaId: number,
mangaId: MangaIdInfo['id'],
mangaIdToMigrateTo: number,
{
mode,

View File

@@ -49,12 +49,13 @@ export type TTrackerSearch = TTrackerBase & Pick<TrackerType, 'authUrl'>;
export type TTrackerBind = TTrackerBase & Pick<TrackerType, 'icon' | 'supportsTrackDeletion' | 'scores' | 'statuses'>;
type TrackerIdInfo = Pick<TrackerType, 'id'>;
type LoggedInInfo = Pick<TrackerType, 'isLoggedIn' | 'isTokenExpired'>;
type TrackRecordTrackerInfo = { tracker: TTrackerBind };
type TrackRecordTrackerInfo = Pick<TrackRecordType, 'trackerId'>;
export class Trackers {
static getIds(trackers: { id: number }[]): number[] {
static getIds(trackers: TrackerIdInfo[]): number[] {
return trackers.map((tracker) => tracker.id);
}
@@ -74,16 +75,19 @@ export class Trackers {
return trackers.filter(this.isLoggedIn);
}
static getTrackers<TrackRecord extends TrackRecordTrackerInfo>(
static getTrackers<TrackRecord extends TrackRecordTrackerInfo, Tracker extends TrackerIdInfo>(
trackRecords: TrackRecord[],
): TrackRecord['tracker'][] {
return trackRecords.map((trackRecord) => trackRecord.tracker);
trackers: Tracker[],
): Tracker[] {
return trackRecords
.map((trackRecord) => trackers.find((tracker) => tracker.id === trackRecord.trackerId))
.filter((tracker) => !!tracker);
}
static getTrackRecordFor<TrackRecord extends TrackRecordTrackerInfo>(
tracker: { id: number },
tracker: TrackerIdInfo,
trackRecords: TrackRecord[],
): TrackRecord | undefined {
return trackRecords.find((trackRecord) => trackRecord.tracker.id === tracker.id);
return trackRecords.find((trackRecord) => trackRecord.trackerId === tracker.id);
}
}