9 March 2020
GraphQLProduct catalogSearch
Reviews can now be queried, created, updated, and deleted using the GraphQL API.
- [GraphQL API] Added the following types to the GraphQL schema: 
Review,ReviewQueryResult,ReviewTarget,ReviewDraft,ReviewUpdateAction,SetReviewAuthorName,SetReviewCustomField,SetReviewCustomType,SetReviewCustomer,SetReviewKey,SetReviewLocale,SetReviewRating,SetReviewTarget,SetReviewText,SetReviewTitle,TargetReferenceInput,TransitionReviewState. - [GraphQL API] Changed the 
Channeltype:Channelobject type now implementsReviewTargetinterface
 - [GraphQL API] Changed the 
Producttype:Productobject type now implementsReviewTargetinterface
 - [GraphQL API] Changed the 
Querytype:- Added the 
reviewsfield to theQuerytype. - Added the 
reviewfield to theQuerytype. 
 - Added the 
 - [GraphQL API] Changed the 
Mutationtype:- Added the 
updateReviewfield to theMutationtype. - Added the 
deleteReviewfield to theMutationtype. - Added the 
createReviewfield to theMutationtype. 
 - Added the 
 
Introduced the following changes to the GraphQL schema (in SDL format):
extend type Query {
  review(
    "Queries with specified ID"
    id: String,
    "Queries with specified key"
    key: String): Review
  reviews(where: String, sort: [String!], limit: Int, offset: Int): ReviewQueryResult!
}
type Review implements Versioned {
  key: String
  uniquenessValue: String
  locale: Locale
  authorName: String
  title: String
  text: String
  targetRef: Reference
  target: ReviewTarget
  rating: Int
  stateRef: Reference
  state: State
  includedInStatistics: Boolean!
  customerRef: Reference
  customer: Customer
  custom: CustomFieldsType
  id: String!
  version: Long!
  createdAt: DateTime!
  lastModifiedAt: DateTime!
  createdBy: Initiator
  lastModifiedBy: Initiator
}
type ReviewQueryResult {
  offset: Int!
  count: Int!
  total: Long!
  results: [Review!]!
}
interface ReviewTarget {
  id: String!
}
extend type Mutation {
  createReview(draft: ReviewDraft!): Review
  deleteReview(version: Long!,
    "Queries with specified ID"
    id: String,
    "Queries with specified key"
    key: String): Review
  updateReview(version: Long!, actions: [ReviewUpdateAction!]!,
    "Queries with specified ID"
    id: String,
    "Queries with specified key"
    key: String): Review
}
input ReviewDraft {
  key: String
  uniquenessValue: String
  locale: Locale
  authorName: String
  title: String
  text: String
  target: TargetReferenceInput
  state: ResourceIdentifierInput
  rating: Int
  customer: ResourceIdentifierInput
  custom: CustomFieldsDraft
}
input ReviewUpdateAction {
  setAuthorName: SetReviewAuthorName
  setCustomField: SetReviewCustomField
  setCustomType: SetReviewCustomType
  setCustomer: SetReviewCustomer
  setKey: SetReviewKey
  setLocale: SetReviewLocale
  setRating: SetReviewRating
  setTarget: SetReviewTarget
  setText: SetReviewText
  setTitle: SetReviewTitle
  transitionState: TransitionReviewState
}
input SetReviewAuthorName {
  authorName: String
}
input SetReviewCustomField {
  name: String!
  value: String
}
input SetReviewCustomType {
  fields: [CustomFieldInput!]
  type: ResourceIdentifierInput
  typeKey: String
  typeId: String
}
input SetReviewCustomer {
  customer: ResourceIdentifierInput
}
input SetReviewKey {
  key: String
}
input SetReviewLocale {
  locale: Locale
}
input SetReviewRating {
  rating: Int
}
input SetReviewTarget {
  target: TargetReferenceInput
}
input SetReviewText {
  text: String
}
input SetReviewTitle {
  title: String
}
input TargetReferenceInput {
  typeId: String!
  id: String
  key: String
}
input TransitionReviewState {
  state: ResourceIdentifierInput!
  force: Boolean = false
}