query_product.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. package graphql
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/gshopify/service-wrapper/fun"
  6. "github.com/gshopify/service-wrapper/model"
  7. "github.com/gshopify/service-wrapper/server/middleware"
  8. "github.com/microcosm-cc/bluemonday"
  9. "gshopper.com/gshopify/products/graphql/generated"
  10. "gshopper.com/gshopify/products/graphql/helper"
  11. )
  12. func (r *queryResolver) Product(ctx context.Context, handle *string, id *string) (*generated.Product, error) {
  13. var (
  14. inContext *middleware.GShopifyContext
  15. product *generated.Product
  16. err error
  17. )
  18. if inContext, err = middleware.InContext(ctx); err != nil {
  19. return nil, err
  20. }
  21. if id == nil && handle == nil {
  22. return nil, fmt.Errorf("at least one argument must be specified")
  23. }
  24. if id != nil {
  25. if s, err := model.ParseId(model.GidProduct, *id); err != nil {
  26. return nil, err
  27. } else {
  28. *id = s
  29. }
  30. }
  31. if product, err = r.db.Product(inContext.Language, handle, id); err != nil {
  32. return nil, err
  33. }
  34. return product, nil
  35. }
  36. func (r *productResolver) Description(_ context.Context, product *generated.Product, truncateAt *int) (string, error) {
  37. return fun.TruncateAt(
  38. bluemonday.StrictPolicy().Sanitize(string(product.DescriptionHTML)),
  39. truncateAt)
  40. }
  41. // Products retrieves Product list by collection
  42. // TODO: implement filters
  43. // TODO: implement sort
  44. func (r *collectionResolver) Products(ctx context.Context, collection *generated.Collection,
  45. after *string, before *string, filters []*generated.ProductFilter, first *int, last *int, reverse *bool, sort *generated.ProductCollectionSortKeys) (*generated.ProductConnection, error) {
  46. var (
  47. inContext *middleware.GShopifyContext
  48. products []*generated.Product
  49. err error
  50. )
  51. if inContext, err = middleware.InContext(ctx); err != nil {
  52. return nil, err
  53. }
  54. rawId, err := model.ParseId(model.GidCollection, collection.ID)
  55. if err != nil {
  56. return nil, err
  57. }
  58. if products, err = r.db.CollectionProducts(inContext.Language, rawId); err != nil {
  59. return nil, err
  60. }
  61. return helper.NewProductConnection(products, after, before, first, last, reverse)
  62. }
  63. func (r *productResolver) Options(ctx context.Context, product *generated.Product, first *int) ([]*generated.ProductOption, error) {
  64. var (
  65. inContext *middleware.GShopifyContext
  66. options []*generated.ProductOption
  67. err error
  68. )
  69. if inContext, err = middleware.InContext(ctx); err != nil {
  70. return nil, err
  71. }
  72. rawId, err := model.ParseId(model.GidProduct, product.ID)
  73. if err != nil {
  74. return nil, err
  75. }
  76. if options, err = r.db.ProductOptions(inContext.Language, rawId); err != nil {
  77. return nil, err
  78. }
  79. return fun.First(options, first), nil
  80. }
  81. func (r *productResolver) Variants(ctx context.Context, product *generated.Product,
  82. first *int, after *string, last *int, before *string, reverse *bool, sortKey *generated.ProductVariantSortKeys) (*generated.ProductVariantConnection, error) {
  83. panic("not implemented")
  84. }