[Codegen] Check cache before executing query for a single item (#513)
E.g. in case a manga was already loaded through the category mangas query, the query for that specific manga should not run against the server if it hasn't been executed before
This commit is contained in:
@@ -1,5 +1,10 @@
|
|||||||
import { FieldPolicy, FieldReadFunction, TypePolicies, TypePolicy } from '@apollo/client/cache';
|
import {FieldPolicy, FieldReadFunction, Reference, TypePolicies, TypePolicy} from '@apollo/client/cache';
|
||||||
import { GetChaptersQuery } from "@/lib/graphql/generated/graphql.ts";
|
import {
|
||||||
|
GetCategoryQueryVariables, GetChapterQueryVariables,
|
||||||
|
GetChaptersQuery, GetExtensionQueryVariables, GetGlobalMetadataQueryVariables,
|
||||||
|
GetMangaQueryVariables, GetSourceQueryVariables,
|
||||||
|
} from "@/lib/graphql/generated/graphql.ts";
|
||||||
|
import {FieldFunctionOptions} from "@apollo/client/cache/inmemory/policies";
|
||||||
export type AboutServerPayloadKeySpecifier = ('buildTime' | 'buildType' | 'discord' | 'github' | 'name' | 'revision' | 'version' | AboutServerPayloadKeySpecifier)[];
|
export type AboutServerPayloadKeySpecifier = ('buildTime' | 'buildType' | 'discord' | 'github' | 'name' | 'revision' | 'version' | AboutServerPayloadKeySpecifier)[];
|
||||||
export type AboutServerPayloadFieldPolicy = {
|
export type AboutServerPayloadFieldPolicy = {
|
||||||
buildTime?: FieldPolicy<any> | FieldReadFunction<any>,
|
buildTime?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||||
@@ -508,23 +513,23 @@ export type QueryKeySpecifier = ('aboutServer' | 'aboutWebUI' | 'categories' | '
|
|||||||
export type QueryFieldPolicy = {
|
export type QueryFieldPolicy = {
|
||||||
about?: FieldPolicy<any> | FieldReadFunction<any>,
|
about?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||||
categories?: FieldPolicy<any> | FieldReadFunction<any>,
|
categories?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||||
category?: FieldPolicy<any> | FieldReadFunction<any>,
|
category?: FieldPolicy<Reference, Reference, Reference, FieldFunctionOptions<GetCategoryQueryVariables>> | FieldReadFunction<Reference, Reference, FieldFunctionOptions<GetCategoryQueryVariables>>,
|
||||||
chapter?: FieldPolicy<any> | FieldReadFunction<any>,
|
chapter?: FieldPolicy<Reference, Reference, Reference, FieldFunctionOptions<GetChapterQueryVariables>> | FieldReadFunction<Reference, Reference, FieldFunctionOptions<GetChapterQueryVariables>>,
|
||||||
chapters?: FieldPolicy<GetChaptersQuery['chapters']> | FieldReadFunction<GetChaptersQuery['chapters']>,
|
chapters?: FieldPolicy<GetChaptersQuery['chapters']> | FieldReadFunction<GetChaptersQuery['chapters']>,
|
||||||
checkForServerUpdates?: FieldPolicy<any> | FieldReadFunction<any>,
|
checkForServerUpdates?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||||
checkForWebUIUpdate?: FieldPolicy<any> | FieldReadFunction<any>,
|
checkForWebUIUpdate?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||||
downloadStatus?: FieldPolicy<any> | FieldReadFunction<any>,
|
downloadStatus?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||||
extension?: FieldPolicy<any> | FieldReadFunction<any>,
|
extension?: FieldPolicy<Reference, Reference, Reference, FieldFunctionOptions<GetExtensionQueryVariables>> | FieldReadFunction<Reference, Reference, FieldFunctionOptions<GetExtensionQueryVariables>>,
|
||||||
extensions?: FieldPolicy<any> | FieldReadFunction<any>,
|
extensions?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||||
getWebUIUpdateStatus?: FieldPolicy<any> | FieldReadFunction<any>,
|
getWebUIUpdateStatus?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||||
lastUpdateTimestamp?: FieldPolicy<any> | FieldReadFunction<any>,
|
lastUpdateTimestamp?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||||
manga?: FieldPolicy<any> | FieldReadFunction<any>,
|
manga?: FieldPolicy<Reference, Reference, Reference, FieldFunctionOptions<GetMangaQueryVariables>> | FieldReadFunction<Reference, Reference, FieldFunctionOptions<GetMangaQueryVariables>>,
|
||||||
mangas?: FieldPolicy<any> | FieldReadFunction<any>,
|
mangas?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||||
meta?: FieldPolicy<any> | FieldReadFunction<any>,
|
meta?: FieldPolicy<Reference, Reference, Reference, FieldFunctionOptions<GetGlobalMetadataQueryVariables>> | FieldReadFunction<Reference, Reference, FieldFunctionOptions<GetGlobalMetadataQueryVariables>>,
|
||||||
metas?: FieldPolicy<any> | FieldReadFunction<any>,
|
metas?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||||
restoreStatus?: FieldPolicy<any> | FieldReadFunction<any>,
|
restoreStatus?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||||
settings?: FieldPolicy<any> | FieldReadFunction<any>,
|
settings?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||||
source?: FieldPolicy<any> | FieldReadFunction<any>,
|
source?: FieldPolicy<Reference, Reference, Reference, FieldFunctionOptions<GetSourceQueryVariables>> | FieldReadFunction<Reference, Reference, FieldFunctionOptions<GetSourceQueryVariables>>,
|
||||||
sources?: FieldPolicy<any> | FieldReadFunction<any>,
|
sources?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||||
updateStatus?: FieldPolicy<any> | FieldReadFunction<any>,
|
updateStatus?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||||
validateBackup?: FieldPolicy<any> | FieldReadFunction<any>
|
validateBackup?: FieldPolicy<any> | FieldReadFunction<any>
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import { createUploadLink } from 'apollo-upload-client';
|
|||||||
import { GraphQLWsLink } from '@apollo/client/link/subscriptions';
|
import { GraphQLWsLink } from '@apollo/client/link/subscriptions';
|
||||||
import { Client, createClient } from 'graphql-ws';
|
import { Client, createClient } from 'graphql-ws';
|
||||||
import { getMainDefinition } from '@apollo/client/utilities';
|
import { getMainDefinition } from '@apollo/client/utilities';
|
||||||
|
import { TypePolicies } from '@apollo/client/cache';
|
||||||
import { BaseClient } from '@/lib/requests/client/BaseClient.ts';
|
import { BaseClient } from '@/lib/requests/client/BaseClient.ts';
|
||||||
import { StrictTypedTypePolicies } from '@/lib/graphql/generated/apollo-helpers.ts';
|
import { StrictTypedTypePolicies } from '@/lib/graphql/generated/apollo-helpers.ts';
|
||||||
|
|
||||||
@@ -27,9 +28,40 @@ const typePolicies: StrictTypedTypePolicies = {
|
|||||||
DownloadType: { keyFields: ['chapter'] },
|
DownloadType: { keyFields: ['chapter'] },
|
||||||
Query: {
|
Query: {
|
||||||
fields: {
|
fields: {
|
||||||
|
manga(_, { args, toReference }) {
|
||||||
|
return toReference({
|
||||||
|
__typename: 'MangaType',
|
||||||
|
id: args?.id,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
category(_, { args, toReference }) {
|
||||||
|
return toReference({
|
||||||
|
__typename: 'CategoryType',
|
||||||
|
id: args?.id,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
source(_, { args, toReference }) {
|
||||||
|
return toReference({
|
||||||
|
__typename: 'SourceType',
|
||||||
|
id: args?.id,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
extension(_, { args, toReference }) {
|
||||||
|
return toReference({
|
||||||
|
__typename: 'ExtensionType',
|
||||||
|
apkName: args?.pkgName,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
meta(_, { args, toReference }) {
|
||||||
|
return toReference({
|
||||||
|
__typename: 'GlobalMetaType',
|
||||||
|
key: args?.key,
|
||||||
|
});
|
||||||
|
},
|
||||||
chapters: {
|
chapters: {
|
||||||
keyArgs: ['condition', 'filter', 'orderBy', 'orderByType'],
|
keyArgs: ['condition', 'filter', 'orderBy', 'orderByType'],
|
||||||
merge(existing, incoming) {
|
merge(existing, incoming) {
|
||||||
|
console.log('merge chapters', { ...existing }, { ...incoming });
|
||||||
if (existing == null) {
|
if (existing == null) {
|
||||||
return incoming;
|
return incoming;
|
||||||
}
|
}
|
||||||
@@ -116,7 +148,12 @@ export class GraphQLClient extends BaseClient<
|
|||||||
|
|
||||||
this.client = new ApolloClient({
|
this.client = new ApolloClient({
|
||||||
cache: new InMemoryCache({
|
cache: new InMemoryCache({
|
||||||
typePolicies,
|
// for whatever reason there is some weird TypeError complaining that
|
||||||
|
// "FieldReadFunction<Reference, Reference, FieldFunctionOptions<SomeObject, Record<string, any>>"
|
||||||
|
// is not compatible with "FieldReadFunction<any, any, FieldFunctionOptions<Record<string, any, Record<string, any>>"
|
||||||
|
// Since "typePolicies" is correctly typed as StrictTypedTypePolicies, and it is working as expected,
|
||||||
|
// the TypeError can just be ignored
|
||||||
|
typePolicies: typePolicies as TypePolicies,
|
||||||
}),
|
}),
|
||||||
connectToDevTools: true,
|
connectToDevTools: true,
|
||||||
link: this.createLink(),
|
link: this.createLink(),
|
||||||
|
|||||||
@@ -51,8 +51,13 @@ generatedGraphQLFile = fs.readFileSync(generatedGraphQLFilePath, 'utf8');
|
|||||||
const addImports = format(
|
const addImports = format(
|
||||||
generatedGraphQLFile,
|
generatedGraphQLFile,
|
||||||
`import { FieldPolicy, FieldReadFunction, TypePolicies, TypePolicy } from '@apollo/client/cache';`,
|
`import { FieldPolicy, FieldReadFunction, TypePolicies, TypePolicy } from '@apollo/client/cache';`,
|
||||||
`import { FieldPolicy, FieldReadFunction, TypePolicies, TypePolicy } from '@apollo/client/cache';
|
`import {FieldPolicy, FieldReadFunction, Reference, TypePolicies, TypePolicy} from '@apollo/client/cache';
|
||||||
import { GetChaptersQuery } from "@/lib/graphql/generated/graphql.ts";`,
|
import {
|
||||||
|
\tGetCategoryQueryVariables, GetChapterQueryVariables,
|
||||||
|
\tGetChaptersQuery, GetExtensionQueryVariables, GetGlobalMetadataQueryVariables,
|
||||||
|
\tGetMangaQueryVariables, GetSourceQueryVariables,
|
||||||
|
} from "@/lib/graphql/generated/graphql.ts";
|
||||||
|
import {FieldFunctionOptions} from "@apollo/client/cache/inmemory/policies";`,
|
||||||
);
|
);
|
||||||
|
|
||||||
const fixTypingOfQueryTypePolicies = format(
|
const fixTypingOfQueryTypePolicies = format(
|
||||||
@@ -85,23 +90,23 @@ const fixTypingOfQueryTypePolicies = format(
|
|||||||
`export type QueryFieldPolicy = {
|
`export type QueryFieldPolicy = {
|
||||||
\tabout?: FieldPolicy<any> | FieldReadFunction<any>,
|
\tabout?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||||
\tcategories?: FieldPolicy<any> | FieldReadFunction<any>,
|
\tcategories?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||||
\tcategory?: FieldPolicy<any> | FieldReadFunction<any>,
|
\tcategory?: FieldPolicy<Reference, Reference, Reference, FieldFunctionOptions<GetCategoryQueryVariables>> | FieldReadFunction<Reference, Reference, FieldFunctionOptions<GetCategoryQueryVariables>>,
|
||||||
\tchapter?: FieldPolicy<any> | FieldReadFunction<any>,
|
\tchapter?: FieldPolicy<Reference, Reference, Reference, FieldFunctionOptions<GetChapterQueryVariables>> | FieldReadFunction<Reference, Reference, FieldFunctionOptions<GetChapterQueryVariables>>,
|
||||||
\tchapters?: FieldPolicy<GetChaptersQuery['chapters']> | FieldReadFunction<GetChaptersQuery['chapters']>,
|
\tchapters?: FieldPolicy<GetChaptersQuery['chapters']> | FieldReadFunction<GetChaptersQuery['chapters']>,
|
||||||
\tcheckForServerUpdates?: FieldPolicy<any> | FieldReadFunction<any>,
|
\tcheckForServerUpdates?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||||
\tcheckForWebUIUpdate?: FieldPolicy<any> | FieldReadFunction<any>,
|
\tcheckForWebUIUpdate?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||||
\tdownloadStatus?: FieldPolicy<any> | FieldReadFunction<any>,
|
\tdownloadStatus?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||||
\textension?: FieldPolicy<any> | FieldReadFunction<any>,
|
\textension?: FieldPolicy<Reference, Reference, Reference, FieldFunctionOptions<GetExtensionQueryVariables>> | FieldReadFunction<Reference, Reference, FieldFunctionOptions<GetExtensionQueryVariables>>,
|
||||||
\textensions?: FieldPolicy<any> | FieldReadFunction<any>,
|
\textensions?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||||
\tgetWebUIUpdateStatus?: FieldPolicy<any> | FieldReadFunction<any>,
|
\tgetWebUIUpdateStatus?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||||
\tlastUpdateTimestamp?: FieldPolicy<any> | FieldReadFunction<any>,
|
\tlastUpdateTimestamp?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||||
\tmanga?: FieldPolicy<any> | FieldReadFunction<any>,
|
\tmanga?: FieldPolicy<Reference, Reference, Reference, FieldFunctionOptions<GetMangaQueryVariables>> | FieldReadFunction<Reference, Reference, FieldFunctionOptions<GetMangaQueryVariables>>,
|
||||||
\tmangas?: FieldPolicy<any> | FieldReadFunction<any>,
|
\tmangas?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||||
\tmeta?: FieldPolicy<any> | FieldReadFunction<any>,
|
\tmeta?: FieldPolicy<Reference, Reference, Reference, FieldFunctionOptions<GetGlobalMetadataQueryVariables>> | FieldReadFunction<Reference, Reference, FieldFunctionOptions<GetGlobalMetadataQueryVariables>>,
|
||||||
\tmetas?: FieldPolicy<any> | FieldReadFunction<any>,
|
\tmetas?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||||
\trestoreStatus?: FieldPolicy<any> | FieldReadFunction<any>,
|
\trestoreStatus?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||||
\tsettings?: FieldPolicy<any> | FieldReadFunction<any>,
|
\tsettings?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||||
\tsource?: FieldPolicy<any> | FieldReadFunction<any>,
|
\tsource?: FieldPolicy<Reference, Reference, Reference, FieldFunctionOptions<GetSourceQueryVariables>> | FieldReadFunction<Reference, Reference, FieldFunctionOptions<GetSourceQueryVariables>>,
|
||||||
\tsources?: FieldPolicy<any> | FieldReadFunction<any>,
|
\tsources?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||||
\tupdateStatus?: FieldPolicy<any> | FieldReadFunction<any>,
|
\tupdateStatus?: FieldPolicy<any> | FieldReadFunction<any>,
|
||||||
\tvalidateBackup?: FieldPolicy<any> | FieldReadFunction<any>
|
\tvalidateBackup?: FieldPolicy<any> | FieldReadFunction<any>
|
||||||
|
|||||||
Reference in New Issue
Block a user