Prevent needless metadata updates (#1860)
* Update metadata queries * Add conditional metadata update
This commit is contained in:
parent
a8f56defe1
commit
948fd39389
5 changed files with 28 additions and 54 deletions
|
@ -14,6 +14,7 @@ import {
|
|||
UpdatePrivateMetadataVariables
|
||||
} from "../metadata/types/UpdatePrivateMetadata";
|
||||
import { filterMetadataArray } from "./filterMetadataArray";
|
||||
import { areMetadataArraysEqual } from "./metadataUpdateHelpers";
|
||||
|
||||
interface ObjectWithMetadata {
|
||||
id: string;
|
||||
|
@ -36,12 +37,21 @@ function createMetadataUpdateHandler<TData extends MetadataFormData, TError>(
|
|||
): Promise<Array<MetadataErrorFragment | TError>> => {
|
||||
const errors = await update(data);
|
||||
|
||||
const hasMetadataChanged = !areMetadataArraysEqual(
|
||||
initial.metadata,
|
||||
data.metadata
|
||||
);
|
||||
const hasPrivateMetadataChanged = !areMetadataArraysEqual(
|
||||
initial.privateMetadata,
|
||||
data.privateMetadata
|
||||
);
|
||||
|
||||
if (errors.length > 0) {
|
||||
return errors;
|
||||
}
|
||||
|
||||
if (errors.length === 0) {
|
||||
if (data.metadata) {
|
||||
if (data.metadata && hasMetadataChanged) {
|
||||
const initialKeys = initial.metadata.map(m => m.key);
|
||||
const modifiedKeys = data.metadata.map(m => m.key);
|
||||
|
||||
|
@ -63,7 +73,7 @@ function createMetadataUpdateHandler<TData extends MetadataFormData, TError>(
|
|||
}
|
||||
}
|
||||
|
||||
if (data.privateMetadata) {
|
||||
if (data.privateMetadata && hasPrivateMetadataChanged) {
|
||||
const initialKeys = initial.privateMetadata.map(m => m.key);
|
||||
const modifiedKeys = data.privateMetadata.map(m => m.key);
|
||||
|
||||
|
|
16
src/utils/handlers/metadataUpdateHelpers.ts
Normal file
16
src/utils/handlers/metadataUpdateHelpers.ts
Normal file
|
@ -0,0 +1,16 @@
|
|||
import { MetadataInput } from "@saleor/sdk/dist/apollo/types";
|
||||
import isEqual from "lodash/isEqual";
|
||||
import sortBy from "lodash/sortBy";
|
||||
|
||||
export interface GenericMetadataInput extends MetadataInput {
|
||||
__typename?: string;
|
||||
}
|
||||
|
||||
const removeTypename = ({ __typename, ...input }: GenericMetadataInput) => ({
|
||||
...input
|
||||
});
|
||||
|
||||
export const areMetadataArraysEqual = (
|
||||
before: GenericMetadataInput[],
|
||||
after: MetadataInput[]
|
||||
) => isEqual(sortBy(before.map(removeTypename)), sortBy(after));
|
|
@ -15,29 +15,9 @@ export interface UpdateMetadata_updateMetadata_errors {
|
|||
field: string | null;
|
||||
}
|
||||
|
||||
export interface UpdateMetadata_updateMetadata_item_metadata {
|
||||
__typename: "MetadataItem";
|
||||
key: string;
|
||||
value: string;
|
||||
}
|
||||
|
||||
export interface UpdateMetadata_updateMetadata_item_privateMetadata {
|
||||
__typename: "MetadataItem";
|
||||
key: string;
|
||||
value: string;
|
||||
}
|
||||
|
||||
export interface UpdateMetadata_updateMetadata_item {
|
||||
__typename: "App" | "Attribute" | "Category" | "Checkout" | "Collection" | "DigitalContent" | "Fulfillment" | "GiftCard" | "Invoice" | "Menu" | "MenuItem" | "Order" | "Page" | "PageType" | "Payment" | "Product" | "ProductType" | "ProductVariant" | "Sale" | "ShippingMethod" | "ShippingMethodType" | "ShippingZone" | "User" | "Voucher" | "Warehouse";
|
||||
metadata: (UpdateMetadata_updateMetadata_item_metadata | null)[];
|
||||
privateMetadata: (UpdateMetadata_updateMetadata_item_privateMetadata | null)[];
|
||||
id: string;
|
||||
}
|
||||
|
||||
export interface UpdateMetadata_updateMetadata {
|
||||
__typename: "UpdateMetadata";
|
||||
errors: UpdateMetadata_updateMetadata_errors[];
|
||||
item: UpdateMetadata_updateMetadata_item | null;
|
||||
}
|
||||
|
||||
export interface UpdateMetadata_deleteMetadata_errors {
|
||||
|
|
|
@ -15,29 +15,9 @@ export interface UpdatePrivateMetadata_updatePrivateMetadata_errors {
|
|||
field: string | null;
|
||||
}
|
||||
|
||||
export interface UpdatePrivateMetadata_updatePrivateMetadata_item_metadata {
|
||||
__typename: "MetadataItem";
|
||||
key: string;
|
||||
value: string;
|
||||
}
|
||||
|
||||
export interface UpdatePrivateMetadata_updatePrivateMetadata_item_privateMetadata {
|
||||
__typename: "MetadataItem";
|
||||
key: string;
|
||||
value: string;
|
||||
}
|
||||
|
||||
export interface UpdatePrivateMetadata_updatePrivateMetadata_item {
|
||||
__typename: "App" | "Attribute" | "Category" | "Checkout" | "Collection" | "DigitalContent" | "Fulfillment" | "GiftCard" | "Invoice" | "Menu" | "MenuItem" | "Order" | "Page" | "PageType" | "Payment" | "Product" | "ProductType" | "ProductVariant" | "Sale" | "ShippingMethod" | "ShippingMethodType" | "ShippingZone" | "User" | "Voucher" | "Warehouse";
|
||||
metadata: (UpdatePrivateMetadata_updatePrivateMetadata_item_metadata | null)[];
|
||||
privateMetadata: (UpdatePrivateMetadata_updatePrivateMetadata_item_privateMetadata | null)[];
|
||||
id: string;
|
||||
}
|
||||
|
||||
export interface UpdatePrivateMetadata_updatePrivateMetadata {
|
||||
__typename: "UpdatePrivateMetadata";
|
||||
errors: UpdatePrivateMetadata_updatePrivateMetadata_errors[];
|
||||
item: UpdatePrivateMetadata_updatePrivateMetadata_item | null;
|
||||
}
|
||||
|
||||
export interface UpdatePrivateMetadata_deletePrivateMetadata_errors {
|
||||
|
|
|
@ -24,12 +24,6 @@ const updateMetadata = gql`
|
|||
errors {
|
||||
...MetadataErrorFragment
|
||||
}
|
||||
item {
|
||||
...MetadataFragment
|
||||
... on Node {
|
||||
id
|
||||
}
|
||||
}
|
||||
}
|
||||
deleteMetadata(id: $id, keys: $keysToDelete) {
|
||||
errors {
|
||||
|
@ -61,12 +55,6 @@ const updatePrivateMetadata = gql`
|
|||
errors {
|
||||
...MetadataErrorFragment
|
||||
}
|
||||
item {
|
||||
...MetadataFragment
|
||||
... on Node {
|
||||
id
|
||||
}
|
||||
}
|
||||
}
|
||||
deletePrivateMetadata(id: $id, keys: $keysToDelete) {
|
||||
errors {
|
||||
|
|
Loading…
Reference in a new issue