2
0

mutationCustomerUpdate.go 3.7 KB

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