mutationCustomerUpdate.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. package graphql
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/Nerzal/gocloak/v12"
  6. "github.com/gshopify/service-wrapper/model"
  7. "github.com/gshopify/service-wrapper/scalar"
  8. "github.com/gshopify/service-wrapper/server/middleware"
  9. "gshopper.com/gshopify/customer/graphql/generated"
  10. m "gshopper.com/gshopify/customer/model"
  11. )
  12. func (r *mutationResolver) CustomerUpdate(
  13. ctx context.Context, t string, udata generated.CustomerUpdateInput) (*generated.CustomerUpdatePayload, error) {
  14. var (
  15. inContext, err = middleware.InContext(ctx)
  16. response = &generated.CustomerUpdatePayload{}
  17. customer *generated.Customer
  18. phone *m.Phone
  19. )
  20. if err != nil {
  21. return nil, err
  22. }
  23. if _, _, err = r.decodeAccessToken(ctx, t); err != nil {
  24. response.CustomerUserErrors = append(response.CustomerUserErrors,
  25. CustomerError(generated.CustomerErrorCodeTokenInvalid, err, "customerAccessToken"))
  26. return response, nil
  27. }
  28. customer, err = r.customer(ctx, t)
  29. if err != nil {
  30. response.CustomerUserErrors = append(response.CustomerUserErrors,
  31. CustomerError(generated.CustomerErrorCodeTokenInvalid, err, "customerAccessToken"))
  32. return response, nil
  33. }
  34. // upsert FirstName
  35. if udata.FirstName != nil {
  36. customer.FirstName = udata.FirstName
  37. }
  38. // upsert LastName
  39. if udata.LastName != nil {
  40. customer.LastName = udata.LastName
  41. }
  42. // upsert AcceptsMarketing
  43. if udata.AcceptsMarketing != nil {
  44. customer.AcceptsMarketing = *udata.AcceptsMarketing
  45. }
  46. if udata.Phone != nil {
  47. phone, err = m.NewPhoneNumber(*udata.Phone, inContext.Country.String(), false)
  48. if err != nil {
  49. response.CustomerUserErrors = append(response.CustomerUserErrors,
  50. CustomerError(generated.CustomerErrorCodeInvalid, err, "phone"))
  51. return response, nil
  52. }
  53. customer.Phone = gocloak.StringP(phone.String())
  54. }
  55. user := gocloak.User{
  56. ID: gocloak.StringP(customer.ID),
  57. FirstName: customer.FirstName,
  58. LastName: customer.LastName,
  59. Email: customer.Email,
  60. Attributes: &map[string][]string{
  61. "accepts_marketing": {fmt.Sprintf("%v", customer.AcceptsMarketing)},
  62. "phone_number": {*customer.Phone},
  63. },
  64. }
  65. customer.UpdatedAt = scalar.Now()
  66. customer.Metafields = append(customer.Metafields,
  67. NewMetafield("updated_at", customer.UpdatedAt, model.MetafieldTypeDateTime))
  68. for _, metafield := range customer.Metafields {
  69. (*user.Attributes)[metafield.Key] = []string{metafield.Value}
  70. }
  71. // update user properties & attributes
  72. admin, err := r.conf.Admin.Token(r.client, ctx)
  73. if err != nil {
  74. response.CustomerUserErrors = append(response.CustomerUserErrors,
  75. CustomerError(generated.CustomerErrorCodeTokenInvalid, err, "adminAccessToken"))
  76. return response, nil
  77. }
  78. if err := r.client.UpdateUser(ctx, admin.AccessToken, r.conf.Cli.Realm, user); err != nil {
  79. response.CustomerUserErrors = append(response.CustomerUserErrors,
  80. CustomerError(generated.CustomerErrorCodeInvalid, err))
  81. return response, nil
  82. }
  83. // update user password
  84. if udata.Password != nil {
  85. err = r.client.SetPassword(ctx, admin.AccessToken, customer.ID, r.conf.Cli.Realm, *udata.Password, false)
  86. if err != nil {
  87. response.CustomerUserErrors = append(response.CustomerUserErrors,
  88. CustomerError(generated.CustomerErrorCodeInvalid, err, "password"))
  89. return response, nil
  90. }
  91. _, _ = r.CustomerAccessTokenDelete(ctx, t)
  92. var payload *generated.CustomerAccessTokenCreatePayload
  93. payload, err = r.CustomerAccessTokenCreate(ctx, generated.CustomerAccessTokenCreateInput{
  94. Email: *customer.Email,
  95. Password: *udata.Password,
  96. })
  97. if err != nil {
  98. response.CustomerUserErrors = append(response.CustomerUserErrors,
  99. CustomerError(generated.CustomerErrorCodeInvalid, err, "password"))
  100. return response, nil
  101. }
  102. response.CustomerAccessToken = payload.CustomerAccessToken
  103. }
  104. response.Customer = customer
  105. return response, nil
  106. }