AttributeValue migration guide

Keeping in mind future extendibility we came to the conclusion that the current API schema does not support the attribute values best. It bases on attribute value type which basically comes down to string, numeric representations shared among different attribute types.

Whenever a change is required it touches all other attribute types with the same value type.

Your current query looked probably something like this

{
  product(sku: "SKU") {
    sku
    attributeList {
      edges {
        node {
	  ... AttributeValue
	}
      }
    }
  }
}
fragment AttributeValue on AttributeValue {
  __typename
  attribute {
    code
  }
  valueTranslations {
    __typename
    language
    ... on StringAttributeValue {
      stringValue: value
    }
    ... on NumericAttributeValue {
      numericValue: value
    }
    ... on StringArrayAttributeValue {
      stringArrayValue: value
    }
    ... on MultimediaArrayAttributeValue {
       multimediaArrayValue: value {
         ... Multimedia
       }
    }
    ... on MultimediaAttributeValue {
      multimediaValue: value {
        ... Multimedia
      }
    }
    ... on ProductArrayAttributeValue {
      productArrayValue: value {
        sku
      }
    }
  }
}
fragment Multimedia on Multimedia {
  name
  extension
  mime
  size
  alt {
    value
    language
  }
  title {
    value
    language
  }
  url
}

With the new schema, you can write the query with a very similar result in mind - grouping the values by the represented value type.

Since the option attributes are represented in a different way - now representing entire options rather than their codes the output in those types is a bit different those values will have to be returned differentely

{
  product(sku: "SKU") {
    sku
    attributeList {
      edges {
        node {
          attribute {
            code
          }
          translations {
            __typename
            language
            ... on TextAttributeValueTranslation {
              stringValue: value
            }
            ... on TextareaAttributeValueTranslation {
              stringValue: value
            }
            ... on DateAttributeValueTranslation {
              stringValue: value
            }
            ... on UnitAttributeValueTranslation {
              numericValue: value
            }
            ... on PriceAttributeValueTranslation {
              numericValue: value
            }
            ... on NumericAttributeValueTranslation {
              numericValue: value
            }
            ... on ProductRelationAttributeValueTranslation {
              productArrayValue: value {
                sku
              }
            }
            ... on FileAttributeValueTranslation {
              multimediaArrayValue: value {
                ... Multimedia
              }
            }
            ... on GalleryAttributeValueTranslation {
              multimediaArrayValue: value {
                ... Multimedia
              }
            }
            ... on ImageAttributeValueTranslation {
              multimediaValue: value {
                ... Multimedia
              }
            }
            ... on MultiSelectAttributeValueTranslation {
              optionArrayValue: translatedValue {
                ... OptionTranslatedValue
              }
            }
            ... on SelectAttributeValueTranslation {
              optionValue: translatedValue {
                ... OptionTranslatedValue
              }
            }
          }
        }
      }
    }
  }	
}
fragment Multimedia on Multimedia {
  name
  extension
  mime
  size
  alt {
    value
    language
  }
  title {
    value
    language
  }
  url
}
fragment OptionTranslatedValue on OptionTranslatedValue {
  code
  name
}

The new schema also grants you the possibility of easier unpacking of specific attribute types. Since AttributeValue type also recevided specific per attribute type you can write queries with conditional on this level - note unit and price attributes - there's no need to make separate unpacking of attribute list and values.

{
  product(sku: "SKU") {
    sku
    attributeList {
      edges {
        node {
          ... AttributeValue
        }
      }
    }
  }	
}
fragment AttributeValue on AttributeValue {
  __typename
  attribute {
    code
  }
  ... on TextAttributeValue {
    textAttributeValueTranslations: translations {
      value
     language
    }
  }
  ... on TextareaAttributeValue {
    textareaAttributeValueTranslations: translations {
      value
      language
    }
  }
  ... on DateAttributeValue {
    dateAttributeValueTranslations: translations {
      value
      language
    }
  }
  ... on UnitAttributeValue {
    unitAttribute: attribute { # unit might be useful in the value context
      unit {
        name
        symbol
      }
    }
    unitAttributeValueTranslations: translations {
      value
      language
    }
  }
  ... on PriceAttributeValue {
    priceAttribute: attribute { # currency might be useful in the price context
      currency
    }
    priceAttributeValueTranslations: translations {
      value
      language
    }
  }
  ... on NumberAttributeValue {
    numericAttributeValueTranslations: translations {
      value
      language
    }
  }
  ... on ProductRelationAttributeValue {
    productRelationAttributeValueTranslations: translations {
      value {
        sku
      }
      language
    }
  }
  ... on FileAttributeValue {
    fileAttributeValueTranslations: translations {
      value {
        ... Multimedia
      }
      language
    }
  }
  ... on GalleryAttributeValue {
    galleryAttributeValueTranslations: translations {
      value {
        ... Multimedia
      }
      language
    }
  }
  ... on ImageAttributeValue {
    imageAttributeValueTranslations: translations {
      value {
        ... Multimedia
      }
      language
    }
  }
  ... on MultiSelectAttributeValue {
    multiSelectAttributeValueTranslations: translations {
      translatedValue {
        ... OptionTranslatedValue
      }
      language
    }
  }
  ... on SelectAttributeValue {
    selectAttributeValueTranslations: translations {
      translatedValue {
        ... OptionTranslatedValue
      }
      language
    }
  }
}
fragment Multimedia on Multimedia {
  path
  name
  extension
  mime
  size
  alt {
    value
    language
  }
  title {
    value
    language
  }
  url
}
fragment OptionTranslatedValue on OptionTranslatedValue {
  code
  name
}

Wrapping things up the new value schema allows you not only to write a query providing a very similar result to the previous approach but also we trust is much more flexible and resistant to future changes.

Last updated