Update new "metas" mutations structure
This commit is contained in:
@@ -92,28 +92,50 @@ const requestMetadataUpdate = async (
|
|||||||
value: `${value}`,
|
value: `${value}`,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
const updateMetaInput = {
|
|
||||||
updateInput: { metas: allUpdateMetas },
|
|
||||||
deleteInput: { keys: uniqueDeleteKeys },
|
|
||||||
migrateInput: { metas: migrateMetas },
|
|
||||||
};
|
|
||||||
|
|
||||||
switch (holderType) {
|
switch (holderType) {
|
||||||
case 'category':
|
case 'category': {
|
||||||
await requestManager.updateCategoryMeta([(metadataHolder as CategoryIdInfo).id], updateMetaInput).response;
|
const categoryId = (metadataHolder as CategoryIdInfo).id;
|
||||||
|
await requestManager.updateCategoryMeta({
|
||||||
|
updateInput: { items: [{ categoryIds: [categoryId], metas: allUpdateMetas }] },
|
||||||
|
deleteInput: { items: [{ categoryIds: [categoryId], keys: uniqueDeleteKeys }] },
|
||||||
|
migrateInput: { items: [{ categoryIds: [categoryId], metas: migrateMetas }] },
|
||||||
|
}).response;
|
||||||
break;
|
break;
|
||||||
case 'chapter':
|
}
|
||||||
await requestManager.updateChapterMeta([(metadataHolder as ChapterIdInfo).id], updateMetaInput).response;
|
case 'chapter': {
|
||||||
|
const chapterId = (metadataHolder as ChapterIdInfo).id;
|
||||||
|
await requestManager.updateChapterMeta({
|
||||||
|
updateInput: { items: [{ chapterIds: [chapterId], metas: allUpdateMetas }] },
|
||||||
|
deleteInput: { items: [{ chapterIds: [chapterId], keys: uniqueDeleteKeys }] },
|
||||||
|
migrateInput: { items: [{ chapterIds: [chapterId], metas: migrateMetas }] },
|
||||||
|
}).response;
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case 'global':
|
case 'global':
|
||||||
await requestManager.updateGlobalMeta(updateMetaInput).response;
|
await requestManager.updateGlobalMeta({
|
||||||
|
updateInput: { metas: allUpdateMetas },
|
||||||
|
deleteInput: { keys: uniqueDeleteKeys },
|
||||||
|
migrateInput: { metas: migrateMetas },
|
||||||
|
}).response;
|
||||||
break;
|
break;
|
||||||
case 'manga':
|
case 'manga': {
|
||||||
await requestManager.updateMangaMeta([(metadataHolder as MangaIdInfo).id], updateMetaInput).response;
|
const mangaId = (metadataHolder as MangaIdInfo).id;
|
||||||
|
await requestManager.updateMangaMeta({
|
||||||
|
updateInput: { items: [{ mangaIds: [mangaId], metas: allUpdateMetas }] },
|
||||||
|
deleteInput: { items: [{ mangaIds: [mangaId], keys: uniqueDeleteKeys }] },
|
||||||
|
migrateInput: { items: [{ mangaIds: [mangaId], metas: migrateMetas }] },
|
||||||
|
}).response;
|
||||||
break;
|
break;
|
||||||
case 'source':
|
}
|
||||||
await requestManager.updateSourceMeta([(metadataHolder as SourceIdInfo).id], updateMetaInput).response;
|
case 'source': {
|
||||||
|
const sourceId = (metadataHolder as SourceIdInfo).id;
|
||||||
|
await requestManager.updateSourceMeta({
|
||||||
|
updateInput: { items: [{ sourceIds: [sourceId], metas: allUpdateMetas }] },
|
||||||
|
deleteInput: { items: [{ sourceIds: [sourceId], keys: uniqueDeleteKeys }] },
|
||||||
|
migrateInput: { items: [{ sourceIds: [sourceId], metas: migrateMetas }] },
|
||||||
|
}).response;
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
throw new Error(`requestMetadataUpdate: unknown holderType "${holderType}"`);
|
throw new Error(`requestMetadataUpdate: unknown holderType "${holderType}"`);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -220,14 +220,14 @@ import {
|
|||||||
UpdateCategoryMetadataMutationVariables,
|
UpdateCategoryMetadataMutationVariables,
|
||||||
UpdateSourceMetadataMutation,
|
UpdateSourceMetadataMutation,
|
||||||
UpdateSourceMetadataMutationVariables,
|
UpdateSourceMetadataMutationVariables,
|
||||||
SetCategoryMetasItemInput,
|
SetSourceMetasInput,
|
||||||
DeleteCategoryMetasItemInput,
|
DeleteSourceMetasInput,
|
||||||
SetSourceMetasItemInput,
|
SetMangaMetasInput,
|
||||||
DeleteSourceMetasItemInput,
|
DeleteMangaMetasInput,
|
||||||
SetMangaMetasItemInput,
|
SetChapterMetasInput,
|
||||||
DeleteMangaMetasItemInput,
|
DeleteChapterMetasInput,
|
||||||
SetChapterMetasItemInput,
|
SetCategoryMetasInput,
|
||||||
DeleteChapterMetasItemInput,
|
DeleteCategoryMetasInput,
|
||||||
} from '@/lib/graphql/generated/graphql.ts';
|
} from '@/lib/graphql/generated/graphql.ts';
|
||||||
import { GET_GLOBAL_METADATAS } from '@/lib/graphql/metadata/GlobalMetadataQuery.ts';
|
import { GET_GLOBAL_METADATAS } from '@/lib/graphql/metadata/GlobalMetadataQuery.ts';
|
||||||
import { UPDATE_GLOBAL_METADATA } from '@/lib/graphql/metadata/GlobalMetadataMutation.ts';
|
import { UPDATE_GLOBAL_METADATA } from '@/lib/graphql/metadata/GlobalMetadataMutation.ts';
|
||||||
@@ -339,8 +339,6 @@ import { SOURCE_META_FIELDS } from '@/lib/graphql/source/SourceFragments.ts';
|
|||||||
import { CHAPTER_META_FIELDS } from '@/lib/graphql/chapter/ChapterFragments.ts';
|
import { CHAPTER_META_FIELDS } from '@/lib/graphql/chapter/ChapterFragments.ts';
|
||||||
import { MetadataMigrationSettings } from '@/features/migration/Migration.types.ts';
|
import { MetadataMigrationSettings } from '@/features/migration/Migration.types.ts';
|
||||||
import { MangaIdInfo } from '@/features/manga/Manga.types.ts';
|
import { MangaIdInfo } from '@/features/manga/Manga.types.ts';
|
||||||
import { ChapterIdInfo } from '@/features/chapter/Chapter.types.ts';
|
|
||||||
import { CategoryIdInfo } from '@/features/category/Category.types.ts';
|
|
||||||
import { updateMetadataList } from '@/features/metadata/services/MetadataApolloCacheHandler.ts';
|
import { updateMetadataList } from '@/features/metadata/services/MetadataApolloCacheHandler.ts';
|
||||||
import { USER_LOGIN, USER_REFRESH } from '@/lib/graphql/user/UserMutation.ts';
|
import { USER_LOGIN, USER_REFRESH } from '@/lib/graphql/user/UserMutation.ts';
|
||||||
import { AuthManager } from '@/features/authentication/AuthManager.ts';
|
import { AuthManager } from '@/features/authentication/AuthManager.ts';
|
||||||
@@ -349,7 +347,6 @@ import { KO_SYNC_LOGIN, KO_SYNC_LOGOUT } from '@/lib/graphql/koreader/KoreaderSy
|
|||||||
import { GET_KO_SYNC_STATUS } from '@/lib/graphql/koreader/KoreaderSyncQuery.ts';
|
import { GET_KO_SYNC_STATUS } from '@/lib/graphql/koreader/KoreaderSyncQuery.ts';
|
||||||
import { ImageCache } from '@/lib/service-worker/ImageCache.ts';
|
import { ImageCache } from '@/lib/service-worker/ImageCache.ts';
|
||||||
import { Sources } from '@/features/source/services/Sources.ts';
|
import { Sources } from '@/features/source/services/Sources.ts';
|
||||||
import { SourceIdInfo } from '@/features/source/Source.types.ts';
|
|
||||||
|
|
||||||
enum GQLMethod {
|
enum GQLMethod {
|
||||||
QUERY = 'QUERY',
|
QUERY = 'QUERY',
|
||||||
@@ -1309,7 +1306,7 @@ export class RequestManager {
|
|||||||
deleteInput,
|
deleteInput,
|
||||||
hasDeletions: !!deleteInput.keys?.length || !!deleteInput.prefixes?.length,
|
hasDeletions: !!deleteInput.keys?.length || !!deleteInput.prefixes?.length,
|
||||||
migrateInput,
|
migrateInput,
|
||||||
isMigration: !!migrateInput.metas.length,
|
isMigration: !!updateInput.metas.length,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
optimisticResponse: {
|
optimisticResponse: {
|
||||||
@@ -1714,15 +1711,14 @@ export class RequestManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public updateSourceMeta(
|
public updateSourceMeta(
|
||||||
sourceIds: SourceIdInfo['id'][],
|
|
||||||
{
|
{
|
||||||
updateInput = { metas: [] },
|
updateInput = { items: [] },
|
||||||
deleteInput = { keys: [] },
|
deleteInput = { items: [] },
|
||||||
migrateInput = { metas: [] },
|
migrateInput = { items: [] },
|
||||||
}: {
|
}: {
|
||||||
updateInput?: Omit<SetSourceMetasItemInput, 'sourceIds'>;
|
updateInput?: SetSourceMetasInput;
|
||||||
deleteInput?: Omit<DeleteSourceMetasItemInput, 'sourceIds'>;
|
deleteInput?: DeleteSourceMetasInput;
|
||||||
migrateInput?: Omit<SetSourceMetasItemInput, 'sourceIds'>;
|
migrateInput?: SetSourceMetasInput;
|
||||||
},
|
},
|
||||||
options?: MutationOptions<UpdateSourceMetadataMutation, UpdateSourceMetadataMutationVariables>,
|
options?: MutationOptions<UpdateSourceMetadataMutation, UpdateSourceMetadataMutationVariables>,
|
||||||
): AbortableApolloMutationResponse<UpdateSourceMetadataMutation> {
|
): AbortableApolloMutationResponse<UpdateSourceMetadataMutation> {
|
||||||
@@ -1730,69 +1726,86 @@ export class RequestManager {
|
|||||||
GQLMethod.MUTATION,
|
GQLMethod.MUTATION,
|
||||||
UPDATE_SOURCE_METADATA,
|
UPDATE_SOURCE_METADATA,
|
||||||
{
|
{
|
||||||
updateInput: { items: [{ ...updateInput, sourceIds }] },
|
updateInput,
|
||||||
hasUpdates: !!updateInput.metas.length,
|
hasUpdates: updateInput.items.some((item) => !!item.metas?.length),
|
||||||
deleteInput: { items: [{ ...deleteInput, sourceIds }] },
|
deleteInput,
|
||||||
hasDeletions: !!deleteInput.keys?.length || !!deleteInput.prefixes?.length,
|
hasDeletions: deleteInput.items.some((item) => !!item.keys?.length || !!item.prefixes?.length),
|
||||||
migrateInput: { items: [{ ...migrateInput, sourceIds }] },
|
migrateInput,
|
||||||
isMigration: !!migrateInput.metas.length,
|
isMigration: migrateInput.items.some((item) => !!item.metas?.length),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
optimisticResponse: {
|
optimisticResponse: {
|
||||||
__typename: 'Mutation',
|
__typename: 'Mutation',
|
||||||
updatedMeta: {
|
updatedMeta: {
|
||||||
__typename: 'SetSourceMetasPayload',
|
__typename: 'SetSourceMetasPayload',
|
||||||
metas: sourceIds.flatMap((sourceId) =>
|
metas: (updateInput?.items ?? []).flatMap((item) =>
|
||||||
(updateInput?.metas ?? []).map((meta) => ({
|
item.sourceIds.flatMap((sourceId) =>
|
||||||
__typename: 'SourceMetaType' as const,
|
item.metas.map((meta) => ({
|
||||||
sourceId,
|
__typename: 'SourceMetaType' as const,
|
||||||
key: meta.key,
|
sourceId,
|
||||||
value: meta.value,
|
key: meta.key,
|
||||||
})),
|
value: meta.value,
|
||||||
|
})),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
deletedMeta: {
|
deletedMeta: {
|
||||||
__typename: 'DeleteSourceMetasPayload',
|
__typename: 'DeleteSourceMetasPayload',
|
||||||
metas: sourceIds.flatMap((sourceId) =>
|
metas: (deleteInput?.items ?? []).flatMap((item) =>
|
||||||
(deleteInput?.keys ?? []).map((key) => ({
|
item.sourceIds.flatMap((sourceId) =>
|
||||||
__typename: 'SourceMetaType' as const,
|
(item.keys ?? []).map((key) => ({
|
||||||
sourceId,
|
__typename: 'SourceMetaType' as const,
|
||||||
key,
|
sourceId,
|
||||||
value: '',
|
key,
|
||||||
})),
|
value: '',
|
||||||
|
})),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
migrationMeta: {
|
migrationMeta: {
|
||||||
__typename: 'SetSourceMetasPayload',
|
__typename: 'SetSourceMetasPayload',
|
||||||
metas: sourceIds.flatMap((sourceId) =>
|
metas: (migrateInput?.items ?? []).flatMap((item) =>
|
||||||
(migrateInput?.metas ?? []).map((meta) => ({
|
item.sourceIds.flatMap((sourceId) =>
|
||||||
__typename: 'SourceMetaType' as const,
|
item.metas.map((meta) => ({
|
||||||
sourceId,
|
__typename: 'SourceMetaType' as const,
|
||||||
key: meta.key,
|
sourceId,
|
||||||
value: meta.value,
|
key: meta.key,
|
||||||
})),
|
value: meta.value,
|
||||||
|
})),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
update(cache, { data }) {
|
update(cache, { data }) {
|
||||||
sourceIds?.forEach((sourceId) => {
|
deleteInput?.items.forEach((item) =>
|
||||||
deleteInput?.keys?.forEach((key) => {
|
item.sourceIds.forEach((sourceId) =>
|
||||||
cache.evict({ id: cache.identify({ __typename: 'SourceMetaType', sourceId, key }) });
|
item.keys?.forEach((key) => {
|
||||||
});
|
cache.evict({
|
||||||
});
|
id: cache.identify({ __typename: 'SourceMetaType', sourceId, key }),
|
||||||
|
});
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
if (!data?.updatedMeta && !data?.migrationMeta) {
|
if (!data?.updatedMeta && !data?.migrationMeta) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const sourceIds = [
|
||||||
|
...updateInput.items.flatMap((item) => item.sourceIds),
|
||||||
|
...migrateInput.items.flatMap((item) => item.sourceIds),
|
||||||
|
];
|
||||||
|
|
||||||
sourceIds.forEach((sourceId) => {
|
sourceIds.forEach((sourceId) => {
|
||||||
cache.modify({
|
cache.modify({
|
||||||
id: cache.identify({ __typename: 'SourceType', id: sourceId }),
|
id: cache.identify({ __typename: 'SourceType', id: sourceId }),
|
||||||
fields: {
|
fields: {
|
||||||
meta(existingMetas, { readField }) {
|
meta(existingMetas, { readField }) {
|
||||||
const updatedMeta = [
|
const updatedMeta = [
|
||||||
...(data?.updatedMeta?.metas ?? []),
|
...(data?.updatedMeta?.metas.filter((meta) => meta.sourceId === sourceId) ??
|
||||||
...(data?.migrationMeta?.metas ?? []),
|
[]),
|
||||||
|
...(data?.migrationMeta?.metas.filter((meta) => meta.sourceId === sourceId) ??
|
||||||
|
[]),
|
||||||
];
|
];
|
||||||
|
|
||||||
return updateMetadataList(updatedMeta, existingMetas, readField, (meta) =>
|
return updateMetadataList(updatedMeta, existingMetas, readField, (meta) =>
|
||||||
@@ -2261,15 +2274,14 @@ export class RequestManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public updateMangaMeta(
|
public updateMangaMeta(
|
||||||
mangaIds: MangaIdInfo['id'][],
|
|
||||||
{
|
{
|
||||||
updateInput = { metas: [] },
|
updateInput = { items: [] },
|
||||||
deleteInput = { keys: [] },
|
deleteInput = { items: [] },
|
||||||
migrateInput = { metas: [] },
|
migrateInput = { items: [] },
|
||||||
}: {
|
}: {
|
||||||
updateInput?: Omit<SetMangaMetasItemInput, 'mangaIds'>;
|
updateInput?: SetMangaMetasInput;
|
||||||
deleteInput?: Omit<DeleteMangaMetasItemInput, 'mangaIds'>;
|
deleteInput?: DeleteMangaMetasInput;
|
||||||
migrateInput?: Omit<SetMangaMetasItemInput, 'mangaIds'>;
|
migrateInput?: SetMangaMetasInput;
|
||||||
},
|
},
|
||||||
options?: MutationOptions<UpdateMangaMetadataMutation, UpdateMangaMetadataMutationVariables>,
|
options?: MutationOptions<UpdateMangaMetadataMutation, UpdateMangaMetadataMutationVariables>,
|
||||||
): AbortableApolloMutationResponse<UpdateMangaMetadataMutation> {
|
): AbortableApolloMutationResponse<UpdateMangaMetadataMutation> {
|
||||||
@@ -2277,69 +2289,85 @@ export class RequestManager {
|
|||||||
GQLMethod.MUTATION,
|
GQLMethod.MUTATION,
|
||||||
UPDATE_MANGA_METADATA,
|
UPDATE_MANGA_METADATA,
|
||||||
{
|
{
|
||||||
updateInput: { items: [{ ...updateInput, mangaIds }] },
|
updateInput,
|
||||||
hasUpdates: !!updateInput.metas.length,
|
hasUpdates: updateInput.items.some((item) => !!item.metas?.length),
|
||||||
deleteInput: { items: [{ ...deleteInput, mangaIds }] },
|
deleteInput,
|
||||||
hasDeletions: !!deleteInput.keys?.length || !!deleteInput.prefixes?.length,
|
hasDeletions: deleteInput.items.some((item) => !!item.keys?.length || !!item.prefixes?.length),
|
||||||
migrateInput: { items: [{ ...migrateInput, mangaIds }] },
|
migrateInput,
|
||||||
isMigration: !!migrateInput.metas.length,
|
isMigration: migrateInput.items.some((item) => !!item.metas?.length),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
optimisticResponse: {
|
optimisticResponse: {
|
||||||
__typename: 'Mutation',
|
__typename: 'Mutation',
|
||||||
updatedMeta: {
|
updatedMeta: {
|
||||||
__typename: 'SetMangaMetasPayload',
|
__typename: 'SetMangaMetasPayload',
|
||||||
metas: mangaIds.flatMap((mangaId) =>
|
metas: (updateInput?.items ?? []).flatMap((item) =>
|
||||||
(updateInput?.metas ?? []).map((meta) => ({
|
item.mangaIds.flatMap((mangaId) =>
|
||||||
__typename: 'MangaMetaType' as const,
|
item.metas.map((meta) => ({
|
||||||
mangaId,
|
__typename: 'MangaMetaType' as const,
|
||||||
key: meta.key,
|
mangaId,
|
||||||
value: meta.value,
|
key: meta.key,
|
||||||
})),
|
value: meta.value,
|
||||||
|
})),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
deletedMeta: {
|
deletedMeta: {
|
||||||
__typename: 'DeleteMangaMetasPayload',
|
__typename: 'DeleteMangaMetasPayload',
|
||||||
metas: mangaIds.flatMap((mangaId) =>
|
metas: (deleteInput?.items ?? []).flatMap((item) =>
|
||||||
(deleteInput?.keys ?? []).map((key) => ({
|
item.mangaIds.flatMap((mangaId) =>
|
||||||
__typename: 'MangaMetaType' as const,
|
(item.keys ?? []).map((key) => ({
|
||||||
mangaId,
|
__typename: 'MangaMetaType' as const,
|
||||||
key,
|
mangaId,
|
||||||
value: '',
|
key,
|
||||||
})),
|
value: '',
|
||||||
|
})),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
migrationMeta: {
|
migrationMeta: {
|
||||||
__typename: 'SetMangaMetasPayload',
|
__typename: 'SetMangaMetasPayload',
|
||||||
metas: mangaIds.flatMap((mangaId) =>
|
metas: (migrateInput?.items ?? []).flatMap((item) =>
|
||||||
(migrateInput?.metas ?? []).map((meta) => ({
|
item.mangaIds.flatMap((mangaId) =>
|
||||||
__typename: 'MangaMetaType' as const,
|
item.metas.map((meta) => ({
|
||||||
mangaId,
|
__typename: 'MangaMetaType' as const,
|
||||||
key: meta.key,
|
mangaId,
|
||||||
value: meta.value,
|
key: meta.key,
|
||||||
})),
|
value: meta.value,
|
||||||
|
})),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
update(cache, { data }) {
|
update(cache, { data }) {
|
||||||
mangaIds.forEach((mangaId) => {
|
deleteInput?.items.forEach((item) =>
|
||||||
deleteInput?.keys?.forEach((key) => {
|
item.mangaIds.forEach((mangaId) =>
|
||||||
cache.evict({ id: cache.identify({ __typename: 'MangaMetaType', mangaId, key }) });
|
item.keys?.forEach((key) => {
|
||||||
});
|
cache.evict({
|
||||||
});
|
id: cache.identify({ __typename: 'MangaMetaType', mangaId, key }),
|
||||||
|
});
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
if (!data?.updatedMeta && !data?.migrationMeta) {
|
if (!data?.updatedMeta && !data?.migrationMeta) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const mangaIds = [
|
||||||
|
...updateInput.items.flatMap((item) => item.mangaIds),
|
||||||
|
...migrateInput.items.flatMap((item) => item.mangaIds),
|
||||||
|
];
|
||||||
|
|
||||||
mangaIds.forEach((mangaId) => {
|
mangaIds.forEach((mangaId) => {
|
||||||
cache.modify({
|
cache.modify({
|
||||||
id: cache.identify({ __typename: 'MangaType', id: mangaId }),
|
id: cache.identify({ __typename: 'MangaType', id: mangaId }),
|
||||||
fields: {
|
fields: {
|
||||||
meta(existingMetas, { readField }) {
|
meta(existingMetas, { readField }) {
|
||||||
const updatedMeta = [
|
const updatedMeta = [
|
||||||
...(data?.updatedMeta?.metas ?? []),
|
...(data?.updatedMeta?.metas.filter((meta) => meta.mangaId === mangaId) ?? []),
|
||||||
...(data?.migrationMeta?.metas ?? []),
|
...(data?.migrationMeta?.metas.filter((meta) => meta.mangaId === mangaId) ??
|
||||||
|
[]),
|
||||||
];
|
];
|
||||||
|
|
||||||
return updateMetadataList(updatedMeta, existingMetas, readField, (meta) =>
|
return updateMetadataList(updatedMeta, existingMetas, readField, (meta) =>
|
||||||
@@ -2514,15 +2542,14 @@ export class RequestManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public updateChapterMeta(
|
public updateChapterMeta(
|
||||||
chapterIds: ChapterIdInfo['id'][],
|
|
||||||
{
|
{
|
||||||
updateInput = { metas: [] },
|
updateInput = { items: [] },
|
||||||
deleteInput = { keys: [] },
|
deleteInput = { items: [] },
|
||||||
migrateInput = { metas: [] },
|
migrateInput = { items: [] },
|
||||||
}: {
|
}: {
|
||||||
updateInput?: Omit<SetChapterMetasItemInput, 'chapterIds'>;
|
updateInput?: SetChapterMetasInput;
|
||||||
deleteInput?: Omit<DeleteChapterMetasItemInput, 'chapterIds'>;
|
deleteInput?: DeleteChapterMetasInput;
|
||||||
migrateInput?: Omit<SetChapterMetasItemInput, 'chapterIds'>;
|
migrateInput?: SetChapterMetasInput;
|
||||||
},
|
},
|
||||||
options?: MutationOptions<UpdateChapterMetadataMutation, UpdateChapterMetadataMutationVariables>,
|
options?: MutationOptions<UpdateChapterMetadataMutation, UpdateChapterMetadataMutationVariables>,
|
||||||
): AbortableApolloMutationResponse<UpdateChapterMetadataMutation> {
|
): AbortableApolloMutationResponse<UpdateChapterMetadataMutation> {
|
||||||
@@ -2530,69 +2557,86 @@ export class RequestManager {
|
|||||||
GQLMethod.MUTATION,
|
GQLMethod.MUTATION,
|
||||||
UPDATE_CHAPTER_METADATA,
|
UPDATE_CHAPTER_METADATA,
|
||||||
{
|
{
|
||||||
updateInput: { items: [{ ...updateInput, chapterIds }] },
|
updateInput,
|
||||||
hasUpdates: !!updateInput.metas.length,
|
hasUpdates: updateInput.items.some((item) => !!item.metas?.length),
|
||||||
deleteInput: { items: [{ ...deleteInput, chapterIds }] },
|
deleteInput,
|
||||||
hasDeletions: !!deleteInput.keys?.length || !!deleteInput.prefixes?.length,
|
hasDeletions: deleteInput.items.some((item) => !!item.keys?.length || !!item.prefixes?.length),
|
||||||
migrateInput: { items: [{ ...migrateInput, chapterIds }] },
|
migrateInput,
|
||||||
isMigration: !!migrateInput.metas.length,
|
isMigration: migrateInput.items.some((item) => !!item.metas?.length),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
optimisticResponse: {
|
optimisticResponse: {
|
||||||
__typename: 'Mutation',
|
__typename: 'Mutation',
|
||||||
updatedMeta: {
|
updatedMeta: {
|
||||||
__typename: 'SetChapterMetasPayload',
|
__typename: 'SetChapterMetasPayload',
|
||||||
metas: chapterIds.flatMap((chapterId) =>
|
metas: (updateInput?.items ?? []).flatMap((item) =>
|
||||||
(updateInput?.metas ?? []).map((meta) => ({
|
item.chapterIds.flatMap((chapterId) =>
|
||||||
__typename: 'ChapterMetaType' as const,
|
item.metas.map((meta) => ({
|
||||||
chapterId,
|
__typename: 'ChapterMetaType' as const,
|
||||||
key: meta.key,
|
chapterId,
|
||||||
value: meta.value,
|
key: meta.key,
|
||||||
})),
|
value: meta.value,
|
||||||
|
})),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
deletedMeta: {
|
deletedMeta: {
|
||||||
__typename: 'DeleteChapterMetasPayload',
|
__typename: 'DeleteChapterMetasPayload',
|
||||||
metas: chapterIds.flatMap((chapterId) =>
|
metas: (deleteInput?.items ?? []).flatMap((item) =>
|
||||||
(deleteInput?.keys ?? []).map((key) => ({
|
item.chapterIds.flatMap((chapterId) =>
|
||||||
__typename: 'ChapterMetaType' as const,
|
(item.keys ?? []).map((key) => ({
|
||||||
chapterId,
|
__typename: 'ChapterMetaType' as const,
|
||||||
key,
|
chapterId,
|
||||||
value: '',
|
key,
|
||||||
})),
|
value: '',
|
||||||
|
})),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
migrationMeta: {
|
migrationMeta: {
|
||||||
__typename: 'SetChapterMetasPayload',
|
__typename: 'SetChapterMetasPayload',
|
||||||
metas: chapterIds.flatMap((chapterId) =>
|
metas: (migrateInput?.items ?? []).flatMap((item) =>
|
||||||
(migrateInput?.metas ?? []).map((meta) => ({
|
item.chapterIds.flatMap((chapterId) =>
|
||||||
__typename: 'ChapterMetaType' as const,
|
item.metas.map((meta) => ({
|
||||||
chapterId,
|
__typename: 'ChapterMetaType' as const,
|
||||||
key: meta.key,
|
chapterId,
|
||||||
value: meta.value,
|
key: meta.key,
|
||||||
})),
|
value: meta.value,
|
||||||
|
})),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
update(cache, { data }) {
|
update(cache, { data }) {
|
||||||
chapterIds.forEach((chapterId) => {
|
deleteInput?.items.forEach((item) =>
|
||||||
deleteInput?.keys?.forEach((key) => {
|
item.chapterIds.forEach((chapterId) =>
|
||||||
cache.evict({ id: cache.identify({ __typename: 'ChapterMetaType', chapterId, key }) });
|
item.keys?.forEach((key) => {
|
||||||
});
|
cache.evict({
|
||||||
});
|
id: cache.identify({ __typename: 'ChapterMetaType', chapterId, key }),
|
||||||
|
});
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
if (!data?.updatedMeta && !data?.migrationMeta) {
|
if (!data?.updatedMeta && !data?.migrationMeta) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const chapterIds = [
|
||||||
|
...updateInput.items.flatMap((item) => item.chapterIds),
|
||||||
|
...migrateInput.items.flatMap((item) => item.chapterIds),
|
||||||
|
];
|
||||||
|
|
||||||
chapterIds.forEach((chapterId) => {
|
chapterIds.forEach((chapterId) => {
|
||||||
cache.modify({
|
cache.modify({
|
||||||
id: cache.identify({ __typename: 'ChapterType', id: chapterId }),
|
id: cache.identify({ __typename: 'ChapterType', id: chapterId }),
|
||||||
fields: {
|
fields: {
|
||||||
meta(existingMetas, { readField }) {
|
meta(existingMetas, { readField }) {
|
||||||
const updatedMeta = [
|
const updatedMeta = [
|
||||||
...(data?.updatedMeta?.metas ?? []),
|
...(data?.updatedMeta?.metas.filter((meta) => meta.chapterId === chapterId) ??
|
||||||
...(data?.migrationMeta?.metas ?? []),
|
[]),
|
||||||
|
...(data?.migrationMeta?.metas.filter((meta) => meta.chapterId === chapterId) ??
|
||||||
|
[]),
|
||||||
];
|
];
|
||||||
|
|
||||||
return updateMetadataList(updatedMeta, existingMetas, readField, (meta) =>
|
return updateMetadataList(updatedMeta, existingMetas, readField, (meta) =>
|
||||||
@@ -2818,15 +2862,14 @@ export class RequestManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public updateCategoryMeta(
|
public updateCategoryMeta(
|
||||||
categoryIds: CategoryIdInfo['id'][],
|
|
||||||
{
|
{
|
||||||
updateInput = { metas: [] },
|
updateInput = { items: [] },
|
||||||
deleteInput = { keys: [] },
|
deleteInput = { items: [] },
|
||||||
migrateInput = { metas: [] },
|
migrateInput = { items: [] },
|
||||||
}: {
|
}: {
|
||||||
updateInput?: Omit<SetCategoryMetasItemInput, 'categoryIds'>;
|
updateInput?: SetCategoryMetasInput;
|
||||||
deleteInput?: Omit<DeleteCategoryMetasItemInput, 'categoryIds'>;
|
deleteInput?: DeleteCategoryMetasInput;
|
||||||
migrateInput?: Omit<SetCategoryMetasItemInput, 'categoryIds'>;
|
migrateInput?: SetCategoryMetasInput;
|
||||||
},
|
},
|
||||||
options?: MutationOptions<UpdateCategoryMetadataMutation, UpdateCategoryMetadataMutationVariables>,
|
options?: MutationOptions<UpdateCategoryMetadataMutation, UpdateCategoryMetadataMutationVariables>,
|
||||||
): AbortableApolloMutationResponse<UpdateCategoryMetadataMutation> {
|
): AbortableApolloMutationResponse<UpdateCategoryMetadataMutation> {
|
||||||
@@ -2834,69 +2877,87 @@ export class RequestManager {
|
|||||||
GQLMethod.MUTATION,
|
GQLMethod.MUTATION,
|
||||||
UPDATE_CATEGORY_METADATA,
|
UPDATE_CATEGORY_METADATA,
|
||||||
{
|
{
|
||||||
updateInput: { items: [{ ...updateInput, categoryIds }] },
|
updateInput,
|
||||||
hasUpdates: !!updateInput.metas.length,
|
hasUpdates: updateInput.items.some((item) => !!item.metas?.length),
|
||||||
deleteInput: { items: [{ ...deleteInput, categoryIds }] },
|
deleteInput,
|
||||||
hasDeletions: !!deleteInput.keys?.length || !!deleteInput.prefixes?.length,
|
hasDeletions: deleteInput.items.some((item) => !!item.keys?.length || !!item.prefixes?.length),
|
||||||
migrateInput: { items: [{ ...migrateInput, categoryIds }] },
|
migrateInput,
|
||||||
isMigration: !!migrateInput.metas.length,
|
isMigration: migrateInput.items.some((item) => !!item.metas?.length),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
optimisticResponse: {
|
optimisticResponse: {
|
||||||
__typename: 'Mutation',
|
__typename: 'Mutation',
|
||||||
updatedMeta: {
|
updatedMeta: {
|
||||||
__typename: 'SetCategoryMetasPayload',
|
__typename: 'SetCategoryMetasPayload',
|
||||||
metas: categoryIds.flatMap((categoryId) =>
|
metas: (updateInput?.items ?? []).flatMap((item) =>
|
||||||
(updateInput?.metas ?? []).map((meta) => ({
|
item.categoryIds.flatMap((categoryId) =>
|
||||||
__typename: 'CategoryMetaType' as const,
|
item.metas.map((meta) => ({
|
||||||
categoryId,
|
__typename: 'CategoryMetaType' as const,
|
||||||
key: meta.key,
|
categoryId,
|
||||||
value: meta.value,
|
key: meta.key,
|
||||||
})),
|
value: meta.value,
|
||||||
|
})),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
deletedMeta: {
|
deletedMeta: {
|
||||||
__typename: 'DeleteCategoryMetasPayload',
|
__typename: 'DeleteCategoryMetasPayload',
|
||||||
metas: categoryIds.flatMap((categoryId) =>
|
metas: (deleteInput?.items ?? []).flatMap((item) =>
|
||||||
(deleteInput?.keys ?? []).map((key) => ({
|
item.categoryIds.flatMap((categoryId) =>
|
||||||
__typename: 'CategoryMetaType' as const,
|
(item.keys ?? []).map((key) => ({
|
||||||
categoryId,
|
__typename: 'CategoryMetaType' as const,
|
||||||
key,
|
categoryId,
|
||||||
value: '',
|
key,
|
||||||
})),
|
value: '',
|
||||||
|
})),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
migrationMeta: {
|
migrationMeta: {
|
||||||
__typename: 'SetCategoryMetasPayload',
|
__typename: 'SetCategoryMetasPayload',
|
||||||
metas: categoryIds.flatMap((categoryId) =>
|
metas: (migrateInput?.items ?? []).flatMap((item) =>
|
||||||
(migrateInput?.metas ?? []).map((meta) => ({
|
item.categoryIds.flatMap((categoryId) =>
|
||||||
__typename: 'CategoryMetaType' as const,
|
item.metas.map((meta) => ({
|
||||||
categoryId,
|
__typename: 'CategoryMetaType' as const,
|
||||||
key: meta.key,
|
categoryId,
|
||||||
value: meta.value,
|
key: meta.key,
|
||||||
})),
|
value: meta.value,
|
||||||
|
})),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
update(cache, { data }) {
|
update(cache, { data }) {
|
||||||
categoryIds.forEach((categoryId) => {
|
deleteInput?.items.forEach((item) =>
|
||||||
deleteInput?.keys?.forEach((key) => {
|
item.categoryIds.forEach((categoryId) =>
|
||||||
cache.evict({ id: cache.identify({ __typename: 'CategoryMetaType', categoryId, key }) });
|
item.keys?.forEach((key) => {
|
||||||
});
|
cache.evict({
|
||||||
});
|
id: cache.identify({ __typename: 'CategoryMetaType', categoryId, key }),
|
||||||
|
});
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
if (!data?.updatedMeta && !data?.migrationMeta) {
|
if (!data?.updatedMeta && !data?.migrationMeta) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const categoryIds = [
|
||||||
|
...updateInput.items.flatMap((item) => item.categoryIds),
|
||||||
|
...migrateInput.items.flatMap((item) => item.categoryIds),
|
||||||
|
];
|
||||||
|
|
||||||
categoryIds.forEach((categoryId) => {
|
categoryIds.forEach((categoryId) => {
|
||||||
cache.modify({
|
cache.modify({
|
||||||
id: cache.identify({ __typename: 'CategoryType', id: categoryId }),
|
id: cache.identify({ __typename: 'CategoryType', id: categoryId }),
|
||||||
fields: {
|
fields: {
|
||||||
meta(existingMetas, { readField }) {
|
meta(existingMetas, { readField }) {
|
||||||
const updatedMeta = [
|
const updatedMeta = [
|
||||||
...(data?.updatedMeta?.metas ?? []),
|
...(data?.updatedMeta?.metas.filter((meta) => meta.categoryId === categoryId) ??
|
||||||
...(data?.migrationMeta?.metas ?? []),
|
[]),
|
||||||
|
...(data?.migrationMeta?.metas.filter(
|
||||||
|
(meta) => meta.categoryId === categoryId,
|
||||||
|
) ?? []),
|
||||||
];
|
];
|
||||||
|
|
||||||
return updateMetadataList(updatedMeta, existingMetas, readField, (meta) =>
|
return updateMetadataList(updatedMeta, existingMetas, readField, (meta) =>
|
||||||
|
|||||||
Reference in New Issue
Block a user