func (s *Service) CreateUser(user kit.User, adaptorName string, authData map[string]interface{}) apperror.Error { adaptor := s.AuthAdaptor(adaptorName) if adaptor == nil { return &apperror.Err{ Code: "unknown_auth_adaptor", Message: fmt.Sprintf("Auth adaptor %v was not registered with user service", adaptorName), Public: true, } } authItem, err := adaptor.RegisterUser(user, authData) if err != nil { return apperror.Wrap(err, "adaptor_error", "") } if user.GetUsername() == "" { user.SetUsername(user.GetEmail()) } // Check if user with same username or email exists. oldUser, err2 := s.Users.Q(). Filter("email", user.GetEmail()).Or("username", user.GetUsername()).First() if err2 != nil { return err2 } else if oldUser != nil { return &apperror.Err{ Code: "user_exists", Message: "A user with the username or email already exists", Public: true, } } user.SetIsActive(true) profile := user.GetProfile() // If a profile is configured, and the user does not have a profile yet, // create a new one. if s.Profiles != nil && profile == nil { profile = s.Profiles.CreateModel().(kit.UserProfile) user.SetProfile(profile) } if err := s.Users.Create(user, nil); err != nil { return err } // Create profile if one exists. if profile != nil { profile.SetUser(user) if err := s.Profiles.Create(profile, user); err != nil { s.Users.Backend().Delete(user) return apperror.Wrap(err, "user_profile_create_error", "Could not create the user profile") } } // Persist auth item. if authItemUserId, ok := authItem.(kit.UserModel); ok { authItemUserId.SetUserId(user.GetId()) } if err := s.Users.Backend().Create(authItem); err != nil { s.Users.Backend().Delete(user) if profile != nil { s.Profiles.Backend().Delete(profile) } return apperror.Wrap(err, "auth_item_create_error", "") } if err := s.SendConfirmationEmail(user); err != nil { s.registry.Logger().Errorf("Could not send confirmation email: %v", err) } return nil }