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
|
UpdatePrivateMetadataVariables
|
||||||
} from "../metadata/types/UpdatePrivateMetadata";
|
} from "../metadata/types/UpdatePrivateMetadata";
|
||||||
import { filterMetadataArray } from "./filterMetadataArray";
|
import { filterMetadataArray } from "./filterMetadataArray";
|
||||||
|
import { areMetadataArraysEqual } from "./metadataUpdateHelpers";
|
||||||
|
|
||||||
interface ObjectWithMetadata {
|
interface ObjectWithMetadata {
|
||||||
id: string;
|
id: string;
|
||||||
|
@ -36,12 +37,21 @@ function createMetadataUpdateHandler<TData extends MetadataFormData, TError>(
|
||||||
): Promise<Array<MetadataErrorFragment | TError>> => {
|
): Promise<Array<MetadataErrorFragment | TError>> => {
|
||||||
const errors = await update(data);
|
const errors = await update(data);
|
||||||
|
|
||||||
|
const hasMetadataChanged = !areMetadataArraysEqual(
|
||||||
|
initial.metadata,
|
||||||
|
data.metadata
|
||||||
|
);
|
||||||
|
const hasPrivateMetadataChanged = !areMetadataArraysEqual(
|
||||||
|
initial.privateMetadata,
|
||||||
|
data.privateMetadata
|
||||||
|
);
|
||||||
|
|
||||||
if (errors.length > 0) {
|
if (errors.length > 0) {
|
||||||
return errors;
|
return errors;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (errors.length === 0) {
|
if (errors.length === 0) {
|
||||||
if (data.metadata) {
|
if (data.metadata && hasMetadataChanged) {
|
||||||
const initialKeys = initial.metadata.map(m => m.key);
|
const initialKeys = initial.metadata.map(m => m.key);
|
||||||
const modifiedKeys = data.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 initialKeys = initial.privateMetadata.map(m => m.key);
|
||||||
const modifiedKeys = data.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;
|
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 {
|
export interface UpdateMetadata_updateMetadata {
|
||||||
__typename: "UpdateMetadata";
|
__typename: "UpdateMetadata";
|
||||||
errors: UpdateMetadata_updateMetadata_errors[];
|
errors: UpdateMetadata_updateMetadata_errors[];
|
||||||
item: UpdateMetadata_updateMetadata_item | null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface UpdateMetadata_deleteMetadata_errors {
|
export interface UpdateMetadata_deleteMetadata_errors {
|
||||||
|
|
|
@ -15,29 +15,9 @@ export interface UpdatePrivateMetadata_updatePrivateMetadata_errors {
|
||||||
field: string | null;
|
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 {
|
export interface UpdatePrivateMetadata_updatePrivateMetadata {
|
||||||
__typename: "UpdatePrivateMetadata";
|
__typename: "UpdatePrivateMetadata";
|
||||||
errors: UpdatePrivateMetadata_updatePrivateMetadata_errors[];
|
errors: UpdatePrivateMetadata_updatePrivateMetadata_errors[];
|
||||||
item: UpdatePrivateMetadata_updatePrivateMetadata_item | null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface UpdatePrivateMetadata_deletePrivateMetadata_errors {
|
export interface UpdatePrivateMetadata_deletePrivateMetadata_errors {
|
||||||
|
|
|
@ -24,12 +24,6 @@ const updateMetadata = gql`
|
||||||
errors {
|
errors {
|
||||||
...MetadataErrorFragment
|
...MetadataErrorFragment
|
||||||
}
|
}
|
||||||
item {
|
|
||||||
...MetadataFragment
|
|
||||||
... on Node {
|
|
||||||
id
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
deleteMetadata(id: $id, keys: $keysToDelete) {
|
deleteMetadata(id: $id, keys: $keysToDelete) {
|
||||||
errors {
|
errors {
|
||||||
|
@ -61,12 +55,6 @@ const updatePrivateMetadata = gql`
|
||||||
errors {
|
errors {
|
||||||
...MetadataErrorFragment
|
...MetadataErrorFragment
|
||||||
}
|
}
|
||||||
item {
|
|
||||||
...MetadataFragment
|
|
||||||
... on Node {
|
|
||||||
id
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
deletePrivateMetadata(id: $id, keys: $keysToDelete) {
|
deletePrivateMetadata(id: $id, keys: $keysToDelete) {
|
||||||
errors {
|
errors {
|
||||||
|
|
Loading…
Reference in a new issue