in auth/import_users.go [53:112]
func (c *baseClient) ImportUsers(
ctx context.Context, users []*UserToImport, opts ...UserImportOption) (*UserImportResult, error) {
if len(users) == 0 {
return nil, errors.New("users list must not be empty")
}
if len(users) > maxImportUsers {
return nil, fmt.Errorf("users list must not contain more than %d elements", maxImportUsers)
}
var validatedUsers []map[string]interface{}
hashRequired := false
for _, u := range users {
vu, err := u.validatedUserInfo()
if err != nil {
return nil, err
}
if pw, ok := vu["passwordHash"]; ok && pw != "" {
hashRequired = true
}
validatedUsers = append(validatedUsers, vu)
}
req := map[string]interface{}{
"users": validatedUsers,
}
for _, opt := range opts {
if err := opt.applyTo(req); err != nil {
return nil, err
}
}
if hashRequired {
if algo, ok := req["hashAlgorithm"]; !ok || algo == "" {
return nil, errors.New("hash algorithm option is required to import users with passwords")
}
}
var parsed struct {
Error []struct {
Index int `json:"index"`
Message string `json:"message"`
} `json:"error,omitempty"`
}
_, err := c.post(ctx, "/accounts:batchCreate", req, &parsed)
if err != nil {
return nil, err
}
result := &UserImportResult{
SuccessCount: len(users) - len(parsed.Error),
FailureCount: len(parsed.Error),
}
for _, e := range parsed.Error {
result.Errors = append(result.Errors, &ErrorInfo{
Index: int(e.Index),
Reason: e.Message,
})
}
return result, nil
}