Prevent needless metadata updates (#1860)

* Update metadata queries

* Add conditional metadata update
This commit is contained in:
Wojciech Mista 2022-02-11 10:25:43 +01:00 committed by GitHub
parent a8f56defe1
commit 948fd39389
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 28 additions and 54 deletions

View file

@ -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);

View 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));

View file

@ -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 {

View file

@ -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 {

View file

@ -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 {