|
@@ -7,8 +7,6 @@ import (
|
|
|
"github.com/golang-jwt/jwt/v4"
|
|
|
"github.com/gshopify/service-wrapper/auth"
|
|
|
"github.com/gshopify/service-wrapper/config"
|
|
|
- "github.com/gshopify/service-wrapper/model"
|
|
|
- "github.com/mitchellh/mapstructure"
|
|
|
"gshopper.com/gshopify/customer/graphql/generated"
|
|
|
m "gshopper.com/gshopify/customer/model"
|
|
|
"time"
|
|
@@ -32,63 +30,46 @@ func NewResolver() (*Resolver, error) {
|
|
|
return r, nil
|
|
|
}
|
|
|
|
|
|
-func (r *Resolver) decodeAccessToken(ctx context.Context, t string) (*jwt.Token, string, error) {
|
|
|
+func (r *Resolver) decodeAccessToken(ctx context.Context, t string) (*jwt.Token, *m.Claims, error) {
|
|
|
if t == "" {
|
|
|
- return nil, "", fmt.Errorf("could not decode accessToken: Token is empty")
|
|
|
+ return nil, nil, fmt.Errorf("could not decode accessToken: Token is empty")
|
|
|
}
|
|
|
|
|
|
token, claim, err := r.client.DecodeAccessToken(ctx, t, r.conf.Cli.Realm)
|
|
|
if err != nil {
|
|
|
- return nil, "", err
|
|
|
+ return nil, nil, err
|
|
|
}
|
|
|
|
|
|
if !token.Valid {
|
|
|
- return nil, "", fmt.Errorf("could not decode accessToken: Token is NOT valid")
|
|
|
+ return nil, nil, fmt.Errorf("could not decode accessToken: Token is NOT valid")
|
|
|
}
|
|
|
|
|
|
- var sessionId string
|
|
|
- if claimed, ok := (*claim)["sid"]; ok {
|
|
|
- if s, ok := claimed.(string); ok {
|
|
|
- sessionId = s
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if sessionId == "" {
|
|
|
- return nil, "", fmt.Errorf("could not claim session id")
|
|
|
+ claims := &m.Claims{}
|
|
|
+ if err = claims.Unmarshall(*claim); err != nil {
|
|
|
+ return nil, nil, err
|
|
|
}
|
|
|
|
|
|
- return token, sessionId, nil
|
|
|
+ return token, claims, nil
|
|
|
}
|
|
|
|
|
|
-func (r *Resolver) customer(ctx context.Context, t string) (*generated.Customer, error) {
|
|
|
+func (r *Resolver) customer(ctx context.Context, uid string) (*generated.Customer, error) {
|
|
|
var (
|
|
|
- customer = generated.Customer{}
|
|
|
- udata map[string]any
|
|
|
- phone *m.Phone
|
|
|
- err error
|
|
|
+ admin *gocloak.JWT
|
|
|
+ user *gocloak.User
|
|
|
+ err error
|
|
|
)
|
|
|
|
|
|
- udata, err = r.client.GetRawUserInfo(ctx, t, r.conf.Cli.Realm)
|
|
|
+ admin, err = r.conf.Admin.Token(r.client, ctx)
|
|
|
if err != nil {
|
|
|
return nil, err
|
|
|
}
|
|
|
|
|
|
- if err = mapstructure.Decode(udata, &customer); err != nil {
|
|
|
- return nil, err
|
|
|
- }
|
|
|
-
|
|
|
- customer.Phone = nil
|
|
|
- phone, err = m.ParsePhoneNumber(udata)
|
|
|
+ user, err = r.client.GetUserByID(ctx, admin.AccessToken, r.conf.Cli.Realm, uid)
|
|
|
if err != nil {
|
|
|
return nil, err
|
|
|
}
|
|
|
|
|
|
- customer.Phone = gocloak.StringP(phone.String())
|
|
|
- customer.Metafields = append(customer.Metafields,
|
|
|
- NewMetafield("phone_region", phone.PhoneRegion, model.MetafieldTypeSingleLineTextField),
|
|
|
- NewMetafield("phone_verified", phone.Verified, model.MetafieldTypeBoolean))
|
|
|
-
|
|
|
- return &customer, nil
|
|
|
+ return User2Customer(user), nil
|
|
|
}
|
|
|
|
|
|
func (r *Resolver) saveSession(ctx context.Context, token *gocloak.JWT) error {
|
|
@@ -99,6 +80,22 @@ func (r *Resolver) saveSession(ctx context.Context, token *gocloak.JWT) error {
|
|
|
time.Duration(token.RefreshExpiresIn)*time.Second)
|
|
|
}
|
|
|
|
|
|
+func (r *Resolver) setPassword(ctx context.Context, uid, password string, shouldValidate bool) error {
|
|
|
+ if shouldValidate {
|
|
|
+ o := generated.CustomerCreateInput{Password: password}
|
|
|
+ if err := o.ValidatePassword(minPasswordEntropy); err != nil {
|
|
|
+ return fmt.Errorf(err.Message)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ admin, err := r.conf.Admin.Token(r.client, ctx)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ return r.client.SetPassword(ctx, admin.AccessToken, uid, r.conf.Cli.Realm, password, false)
|
|
|
+}
|
|
|
+
|
|
|
// Mutation returns generated.MutationResolver implementation.
|
|
|
func (r *Resolver) Mutation() generated.MutationResolver { return &mutationResolver{r} }
|
|
|
|