Преглед на файлове

GraphQL

- User2Customer converter
- CustomerCreateInput.ValidatePassword
- CustomerCreateInput.ValidateEmail
Alexey Kim преди 2 години
родител
ревизия
5e8a3f76fd
променени са 2 файла, в които са добавени 127 реда и са изтрити 0 реда
  1. 81 0
      graphql/customer.go
  2. 46 0
      graphql/generated/create_input.go

+ 81 - 0
graphql/customer.go

@@ -0,0 +1,81 @@
+package graphql
+
+import (
+	"github.com/Nerzal/gocloak/v12"
+	"github.com/gshopify/service-wrapper/model"
+	"github.com/gshopify/service-wrapper/scalar"
+	"gshopper.com/gshopify/customer/graphql/generated"
+	"strings"
+)
+
+func User2Customer(user *gocloak.User) *generated.Customer {
+	if user == nil {
+		return nil
+	}
+
+	customer := &generated.Customer{
+		ID:        *user.ID,
+		Email:     user.Email,
+		FirstName: user.FirstName,
+		LastName:  user.LastName,
+		CreatedAt: scalar.DateTime(0),
+		UpdatedAt: scalar.DateTime(0),
+	}
+
+	customer.DisplayName = func(u *gocloak.User) string {
+		if u == nil {
+			return ""
+		}
+
+		if u.FirstName != nil || u.LastName != nil {
+			n := strings.Builder{}
+			if u.FirstName != nil && *u.FirstName != "" {
+				n.WriteString(*u.FirstName)
+			}
+
+			if u.LastName != nil || *u.LastName != "" {
+				n.WriteString(" ")
+				n.WriteString(*u.LastName)
+			}
+
+			return n.String()
+		}
+
+		return *u.Email
+	}(user)
+
+	if user.Attributes != nil {
+		for s, values := range *user.Attributes {
+			var meta *generated.Metafield
+
+			if len(values) < 1 {
+				continue
+			}
+
+			switch s {
+			case "phone_number":
+				meta = NewMetafield(s, values[0], model.MetafieldTypeSingleLineTextField)
+				customer.Phone = gocloak.StringP(values[0])
+			case "phone_region":
+				meta = NewMetafield(s, values[0], model.MetafieldTypeSingleLineTextField)
+			case "phone_verified":
+				meta = NewMetafield(s, values[0], model.MetafieldTypeBoolean)
+			case "created_at":
+				_ = customer.CreatedAt.UnmarshalGQL(values[0])
+				meta = NewMetafield(s, values[0], model.MetafieldTypeDateTime)
+			case "updated_at":
+				_ = customer.UpdatedAt.UnmarshalGQL(values[0])
+				meta = NewMetafield(s, values[0], model.MetafieldTypeDateTime)
+			case "accepts_marketing":
+				customer.AcceptsMarketing = values[0] == "true"
+				meta = NewMetafield(s, values[0], model.MetafieldTypeBoolean)
+			default:
+				continue
+			}
+
+			customer.Metafields = append(customer.Metafields, meta)
+		}
+	}
+
+	return customer
+}

+ 46 - 0
graphql/generated/create_input.go

@@ -0,0 +1,46 @@
+package generated
+
+import (
+	passwordvalidator "github.com/wagslane/go-password-validator"
+	"net/mail"
+	"strings"
+)
+
+func (input CustomerCreateInput) ValidatePassword(minPasswordEntropy float64) *CustomerUserError {
+	var code CustomerErrorCode
+
+	if strings.HasPrefix(input.Password, " ") || strings.HasSuffix(input.Password, " ") {
+		code = CustomerErrorCodePasswordStartsOrEndsWithWhitespace
+		return &CustomerUserError{
+			Code:    &code,
+			Field:   []string{"password"},
+			Message: "password must not start or end with whitespaces",
+		}
+	}
+
+	if err := passwordvalidator.Validate(input.Password, minPasswordEntropy); err != nil {
+		code = CustomerErrorCodeBlank
+		return &CustomerUserError{
+			Code:    &code,
+			Field:   []string{"password"},
+			Message: err.Error(),
+		}
+	}
+
+	return nil
+}
+
+func (input CustomerCreateInput) ValidateEmail() *CustomerUserError {
+	addr, err := mail.ParseAddress(input.Email)
+	if err != nil {
+		code := CustomerErrorCodeInvalid
+		return &CustomerUserError{
+			Code:    &code,
+			Field:   []string{"email"},
+			Message: err.Error(),
+		}
+	}
+
+	input.Email = addr.Address
+	return nil
+}