diff --git a/packages/store-api/src/typeDefs/aggregateOffer.graphql b/packages/store-api/src/typeDefs/aggregateOffer.graphql new file mode 100644 index 0000000000..f6eead5741 --- /dev/null +++ b/packages/store-api/src/typeDefs/aggregateOffer.graphql @@ -0,0 +1,10 @@ +type StoreAggregateOffer { + # Highest spot price amongst all sellers + highPrice: Float! + # Lowest spot price amongst all sellers + lowPrice: Float! + # Number of sellers selling this sku + offerCount: Int! + priceCurrency: String! + offers: [StoreOffer!]! +} diff --git a/packages/store-api/src/typeDefs/aggregateRating.graphql b/packages/store-api/src/typeDefs/aggregateRating.graphql new file mode 100644 index 0000000000..c3757eb122 --- /dev/null +++ b/packages/store-api/src/typeDefs/aggregateRating.graphql @@ -0,0 +1,4 @@ +type StoreAggregateRating { + ratingValue: Float! + reviewCount: Int! +} diff --git a/packages/store-api/src/typeDefs/author.graphql b/packages/store-api/src/typeDefs/author.graphql new file mode 100644 index 0000000000..a4eea334dd --- /dev/null +++ b/packages/store-api/src/typeDefs/author.graphql @@ -0,0 +1,3 @@ +type StoreAuthor { + name: String! +} diff --git a/packages/store-api/src/typeDefs/brand.graphql b/packages/store-api/src/typeDefs/brand.graphql new file mode 100644 index 0000000000..4ed2eeaa1c --- /dev/null +++ b/packages/store-api/src/typeDefs/brand.graphql @@ -0,0 +1,3 @@ +type StoreBrand { + name: String! +} diff --git a/packages/store-api/src/typeDefs/breadcrumb.graphql b/packages/store-api/src/typeDefs/breadcrumb.graphql new file mode 100644 index 0000000000..75d8135d92 --- /dev/null +++ b/packages/store-api/src/typeDefs/breadcrumb.graphql @@ -0,0 +1,10 @@ +type StoreListItem { + item: String! + name: String! + position: Int! +} + +type StoreBreadcrumbList { + itemListElement: [StoreListItem!]! + numberOfItems: Int! +} diff --git a/packages/store-api/src/typeDefs/collection.graphql b/packages/store-api/src/typeDefs/collection.graphql new file mode 100644 index 0000000000..a1807557ff --- /dev/null +++ b/packages/store-api/src/typeDefs/collection.graphql @@ -0,0 +1,26 @@ +enum StoreCollectionType { + Department + Category + Brand + Cluster +} + +type StoreCollectionFacet { + key: String! + value: String! +} + +type StoreCollectionMeta { + selectedFacets: [StoreCollectionFacet!]! +} + +type StoreCollection { + # Meta tag data + seo: StoreSeo! + # location for structured data + breadcrumbList: StoreBreadcrumbList! + meta: StoreCollectionMeta! + id: ID! + slug: String! + type: StoreCollectionType! +} diff --git a/packages/store-api/src/typeDefs/facet.graphql b/packages/store-api/src/typeDefs/facet.graphql new file mode 100644 index 0000000000..802b6192a7 --- /dev/null +++ b/packages/store-api/src/typeDefs/facet.graphql @@ -0,0 +1,14 @@ +type StoreFacet { + key: String! + label: String! + values: [StoreFacetValue!]! + type: StoreFacetType! +} + +type StoreFacetValue { + value: String! + label: String! + selected: Boolean! + # Number of items with this facet + quantity: Int! +} diff --git a/packages/store-api/src/typeDefs/image.graphql b/packages/store-api/src/typeDefs/image.graphql new file mode 100644 index 0000000000..f14908085b --- /dev/null +++ b/packages/store-api/src/typeDefs/image.graphql @@ -0,0 +1,4 @@ +type StoreImage { + url: String! + alternateName: String! +} diff --git a/packages/store-api/src/typeDefs/index.ts b/packages/store-api/src/typeDefs/index.ts new file mode 100644 index 0000000000..5f55589919 --- /dev/null +++ b/packages/store-api/src/typeDefs/index.ts @@ -0,0 +1,39 @@ +import { print } from 'graphql' + +import AggregateOffer from './aggregateOffer.graphql' +import AggregateRating from './aggregateRating.graphql' +import Author from './author.graphql' +import Brand from './brand.graphql' +import Breadcrumb from './breadcrumb.graphql' +import Collection from './collection.graphql' +import Facet from './facet.graphql' +import Image from './image.graphql' +import Offer from './offer.graphql' +import Organization from './organization.graphql' +import PageInfo from './pageInfo.graphql' +import Product from './product.graphql' +import ProductGroup from './productGroup.graphql' +import Query from './query.graphql' +import Review from './review.graphql' +import Seo from './seo.graphql' + +export const typeDefs = [ + Query, + Brand, + Breadcrumb, + Collection, + Facet, + Image, + PageInfo, + Product, + Seo, + Offer, + AggregateRating, + Review, + Author, + ProductGroup, + Organization, + AggregateOffer, +] + .map(print) + .join('\n') diff --git a/packages/store-api/src/typeDefs/offer.graphql b/packages/store-api/src/typeDefs/offer.graphql new file mode 100644 index 0000000000..c158866c0f --- /dev/null +++ b/packages/store-api/src/typeDefs/offer.graphql @@ -0,0 +1,11 @@ +type StoreOffer { + listPrice: Float! + sellingPrice: Float! + priceCurrency: String! + # Also known as spotPrice + price: Float! + priceValidUntil: String! + itemCondition: String! + availability: String! + seller: StoreOrganization! +} diff --git a/packages/store-api/src/typeDefs/organization.graphql b/packages/store-api/src/typeDefs/organization.graphql new file mode 100644 index 0000000000..c2659284c8 --- /dev/null +++ b/packages/store-api/src/typeDefs/organization.graphql @@ -0,0 +1,3 @@ +type StoreOrganization { + identifier: String! +} diff --git a/packages/store-api/src/typeDefs/pageInfo.graphql b/packages/store-api/src/typeDefs/pageInfo.graphql new file mode 100644 index 0000000000..05bfbefa7b --- /dev/null +++ b/packages/store-api/src/typeDefs/pageInfo.graphql @@ -0,0 +1,8 @@ +type StorePageInfo { + hasNextPage: Boolean! + hasPreviousPage: Boolean! + startCursor: String! + endCursor: String! + # Total number of items, not pages + totalCount: Int! +} diff --git a/packages/store-api/src/typeDefs/product.graphql b/packages/store-api/src/typeDefs/product.graphql new file mode 100644 index 0000000000..7809dca24f --- /dev/null +++ b/packages/store-api/src/typeDefs/product.graphql @@ -0,0 +1,19 @@ +type StoreProduct { + # Meta tag data + seo: StoreSeo! + # location for structured data + breadcrumbList: StoreBreadcrumbList! + # Where to retrieve this entity + slug: String! + name: String! + productID: String! + brand: StoreBrand! + description: String! + image: [StoreImage!]! + offers: StoreAggregateOffer! + sku: String! + gtin: String! + review: [StoreReview!]! + aggregateRating: StoreAggregateRating! + isVariantOf: StoreProductGroup! +} diff --git a/packages/store-api/src/typeDefs/productGroup.graphql b/packages/store-api/src/typeDefs/productGroup.graphql new file mode 100644 index 0000000000..6c17a4f53e --- /dev/null +++ b/packages/store-api/src/typeDefs/productGroup.graphql @@ -0,0 +1,5 @@ +type StoreProductGroup { + hasVariant: [StoreProduct!]! + productGroupID: String! + name: String! +} diff --git a/packages/store-api/src/typeDefs/query.graphql b/packages/store-api/src/typeDefs/query.graphql new file mode 100644 index 0000000000..c1116b60fa --- /dev/null +++ b/packages/store-api/src/typeDefs/query.graphql @@ -0,0 +1,72 @@ +type StoreProductEdge { + node: StoreProduct! + cursor: String! +} + +type StoreProductConnection { + pageInfo: StorePageInfo! + edges: [StoreProductEdge!]! +} + + +type StoreCollectionEdge { + node: StoreCollection! + cursor: String! +} + +type StoreCollectionConnection { + pageInfo: StorePageInfo! + edges: [StoreCollectionEdge!]! +} + +enum StoreProductIDField { + id + slug +} + +input StoreProductID { + field: StoreProductIDField! + value: ID! +} + +enum StoreSort { + price_desc + price_asc + orders_desc + name_desc + name_asc + release_desc + discount_desc + score_desc +} + +input StoreSelectedFacet { + key: String! + value: String! +} + +enum StoreFacetType { + BOOLEAN + RANGE +} + +type StoreSearchResult { + products: StoreProductConnection! + facets: [StoreFacet!]! +} + +type Query { + product(locator: StoreProductID!): StoreProduct! + + search( + first: Int! + after: String + sort: StoreSort = score_desc + term: String = "" + selectedFacets: [StoreSelectedFacet!] + ): StoreSearchResult! + + allProducts(first: Int!, after: String): StoreProductConnection! + + allCollections(first: Int!, after: String): StoreCollectionConnection! +} diff --git a/packages/store-api/src/typeDefs/review.graphql b/packages/store-api/src/typeDefs/review.graphql new file mode 100644 index 0000000000..f3cfe7168d --- /dev/null +++ b/packages/store-api/src/typeDefs/review.graphql @@ -0,0 +1,9 @@ +type StoreReviewRating { + ratingValue: Float! + bestRating: Float! +} + +type StoreReview { + reviewRating: StoreReviewRating! + author: StoreAuthor! +} diff --git a/packages/store-api/src/typeDefs/seo.graphql b/packages/store-api/src/typeDefs/seo.graphql new file mode 100644 index 0000000000..fcb507f7fe --- /dev/null +++ b/packages/store-api/src/typeDefs/seo.graphql @@ -0,0 +1,6 @@ +type StoreSeo { + title: String! + titleTemplate: String! + description: String! + canonical: String! +}