github.com/grokify/go-ringcentral-client@v0.3.31/office/v1/examples/scim_users_get/get_scim_users.go (about)

     1  package main
     2  
     3  import (
     4  	"context"
     5  	"flag"
     6  	"fmt"
     7  	"log"
     8  	"os"
     9  	"strings"
    10  
    11  	"github.com/antihax/optional"
    12  	"github.com/grokify/goauth"
    13  	"github.com/grokify/mogo/errors/errorsutil"
    14  	"github.com/grokify/mogo/fmt/fmtutil"
    15  	"github.com/grokify/mogo/net/http/httputilmore"
    16  	"github.com/joho/godotenv"
    17  
    18  	rc "github.com/grokify/go-ringcentral-client/office/v1/client"
    19  	rcu "github.com/grokify/go-ringcentral-client/office/v1/util"
    20  	rs "github.com/grokify/go-scim-client"
    21  )
    22  
    23  const (
    24  	envPrefix = "RINGCENTRAL_"
    25  )
    26  
    27  func loadEnv() error {
    28  	envPaths := []string{}
    29  	if len(os.Getenv("ENV_PATH")) > 0 {
    30  		envPaths = append(envPaths, os.Getenv("ENV_PATH"))
    31  	}
    32  	return godotenv.Load(envPaths...)
    33  }
    34  
    35  type ScimApiUtil struct {
    36  	ApiClient *rc.APIClient
    37  	Context   context.Context
    38  }
    39  
    40  func (su *ScimApiUtil) GetSCIMUserById(userId string) (rc.UserInfo, error) {
    41  	uinfo, resp, err := su.ApiClient.SCIMApi.GetUserById(su.Context, userId)
    42  	if err != nil {
    43  		return uinfo, err
    44  	} else if resp.StatusCode >= 300 {
    45  		return uinfo, fmt.Errorf("API Status %v", resp.StatusCode)
    46  	}
    47  	return uinfo, nil
    48  }
    49  
    50  func (su *ScimApiUtil) ListScimUsers(params rc.ListUsersOpts) (rc.GetUserListResponse, error) {
    51  	info, resp, err := su.ApiClient.SCIMApi.ListUsers(su.Context, &params)
    52  	if err != nil {
    53  		return info, err
    54  	} else if resp.StatusCode >= 300 {
    55  		return info, fmt.Errorf("API Status %v", resp.StatusCode)
    56  	}
    57  	return info, nil
    58  }
    59  
    60  func mainClient() {
    61  	err := loadEnv()
    62  	if err != nil {
    63  		panic(err)
    64  	}
    65  	apiClient, err := rcu.NewApiClientPasswordEnv(envPrefix)
    66  	if err != nil {
    67  		panic(err)
    68  	}
    69  
    70  	scimUtil := ScimApiUtil{
    71  		ApiClient: apiClient,
    72  		Context:   context.Background(),
    73  	}
    74  
    75  	// Retrieve a list of users
    76  	info, err := scimUtil.ListScimUsers(rc.ListUsersOpts{})
    77  	if err != nil {
    78  		panic(err)
    79  	}
    80  	fmtutil.PrintJSON(info)
    81  
    82  	for _, user := range info.Resources {
    83  		fmt.Println(user.Id)
    84  
    85  		if 1 == 0 {
    86  			uinfo, err := scimUtil.GetSCIMUserById(user.Id)
    87  			if err != nil {
    88  				panic(err)
    89  			}
    90  			fmtutil.PrintJSON(uinfo)
    91  		}
    92  	}
    93  	fmt.Println("DONE")
    94  }
    95  
    96  func getPathMembersValue(v string) string {
    97  	return fmt.Sprintf("members[value eq \"%v\"]", v)
    98  }
    99  
   100  func tryPatch(scimClient *rs.APIClient, ctx context.Context, userId string) {
   101  	body := rs.UserPatch{
   102  		Operations: []rs.PatchOperation{
   103  			{
   104  				Op: "add",
   105  				Value: rs.User{
   106  					Addresses: []rs.Address{
   107  						{
   108  							Type_:         "work",
   109  							StreetAddress: "100 Main Street",
   110  							Locality:      "South Park",
   111  							Region:        "CO",
   112  							PostalCode:    "80440",
   113  							Country:       "US",
   114  						},
   115  					},
   116  				},
   117  			},
   118  		},
   119  		Schemas: []string{"urn:ietf:params:scim:api:messages:2.0:PatchOp"},
   120  	}
   121  	fmtutil.PrintJSON(body)
   122  
   123  	info, resp, err := scimClient.UserApi.PatchUser(ctx, userId,
   124  		map[string]interface{}{"body": body},
   125  	)
   126  	if err != nil {
   127  		log.Fatal(err)
   128  	} else if resp.StatusCode >= 300 {
   129  		log.Fatal(fmt.Sprintf("StatusCode: %v", resp.StatusCode))
   130  	}
   131  	fmtutil.PrintJSON(info)
   132  }
   133  
   134  func tryReplace(scimClient *rs.APIClient, ctx context.Context, userId string) {
   135  	userResp, resp, err := scimClient.UserApi.GetUserById(ctx, userId)
   136  	if err != nil {
   137  		log.Fatal(err)
   138  	} else if resp.StatusCode >= 300 {
   139  		log.Fatal(fmt.Sprintf("StatusCode: %v", resp.StatusCode))
   140  	}
   141  	fmtutil.PrintJSON(userResp)
   142  	user := rs.User{
   143  		Active:       userResp.Active,
   144  		Addresses:    userResp.Addresses,
   145  		Emails:       userResp.Emails,
   146  		ExternalId:   userResp.ExternalId,
   147  		Id:           userResp.Id,
   148  		Name:         userResp.Name,
   149  		PhoneNumbers: userResp.PhoneNumbers,
   150  		Photos:       userResp.Photos,
   151  		Schemas:      userResp.Schemas,
   152  		UserName:     userResp.UserName,
   153  		Urnietfparamsscimschemasextensionenterprise20User: userResp.Urnietfparamsscimschemasextensionenterprise20User,
   154  	}
   155  	user.Name.FamilyName = "RingForceAwakens"
   156  
   157  	userResp, resp, err = scimClient.UserApi.ReplaceUser(ctx, userId,
   158  		map[string]interface{}{"body": user})
   159  	if err != nil {
   160  		log.Fatal(err)
   161  	} else if resp.StatusCode >= 300 {
   162  		log.Fatal(fmt.Sprintf("StatusCode: %v", resp.StatusCode))
   163  	}
   164  	fmtutil.PrintJSON(userResp)
   165  }
   166  
   167  func tryDelete(scimClient *rs.APIClient, ctx context.Context, userId string) {
   168  	resp, err := scimClient.UserApi.DeleteUser(ctx, userId)
   169  	if err != nil {
   170  		log.Fatal(err)
   171  	} else if resp.StatusCode >= 300 {
   172  		log.Fatal(fmt.Sprintf("StatusCode: %v", resp.StatusCode))
   173  	}
   174  }
   175  
   176  func tryCreate(scimClient *rs.APIClient, ctx context.Context) {
   177  	email := "john@example.com"
   178  	user := rs.User{
   179  		Name: &rs.Name{
   180  			GivenName:  "John",
   181  			FamilyName: "RingCentral",
   182  		},
   183  		Emails: []rs.Email{
   184  			{
   185  				Value: email,
   186  				Type_: "work",
   187  			},
   188  		},
   189  		Schemas:  []string{"urn:ietf:params:scim:schemas:core:2.0:User"},
   190  		UserName: email,
   191  	}
   192  
   193  	info, resp, err := scimClient.UserApi.CreateUser(
   194  		ctx, map[string]interface{}{"body": user})
   195  	if err != nil {
   196  		log.Fatal(err)
   197  	} else if resp.StatusCode >= 300 {
   198  		log.Fatal(fmt.Sprintf("StatusCode: %v", resp.StatusCode))
   199  	}
   200  	fmtutil.PrintJSON(info)
   201  }
   202  
   203  func tryScimClient() {
   204  	scimClient, err := rcu.NewScimApiClient(
   205  		goauth.NewCredentialsOAuth2Env(envPrefix))
   206  	if err != nil {
   207  		log.Fatal(err)
   208  	}
   209  
   210  	ctx := context.Background()
   211  	users, resp, err := scimClient.UserApi.SearchViaGet(ctx, map[string]interface{}{})
   212  	if err != nil {
   213  		log.Fatal(err)
   214  	} else if resp.StatusCode >= 300 {
   215  		log.Fatal(fmt.Sprintf("StatusCode: %v", resp.StatusCode))
   216  	}
   217  	fmtutil.PrintJSON(users)
   218  
   219  	if 1 == 0 {
   220  		userId := "1"
   221  		tryPatch(scimClient, ctx, userId)
   222  	}
   223  
   224  	if 1 == 0 {
   225  		userId := "1"
   226  		tryDelete(scimClient, ctx, userId)
   227  	}
   228  	if 1 == 0 {
   229  		tryCreate(scimClient, ctx)
   230  	}
   231  	if 1 == 0 {
   232  		userId := "1"
   233  		tryReplace(scimClient, ctx, userId)
   234  	}
   235  }
   236  
   237  func tryRingCentralClient(demoConfig DemoConfig) {
   238  	apiClient, err := rcu.NewApiClientPassword(
   239  		goauth.NewCredentialsOAuth2Env(envPrefix))
   240  	if err != nil {
   241  		log.Fatal(err)
   242  	}
   243  
   244  	demo := ScimRingCentralDemo{
   245  		Client:  apiClient,
   246  		Context: context.Background(),
   247  		Config:  demoConfig,
   248  	}
   249  
   250  	if demoConfig.GetServiceProviderConfig {
   251  		demo.GetServiceProviderConfig()
   252  	}
   253  
   254  	demo.GetUsers()
   255  
   256  	if demoConfig.DeleteUser {
   257  		demo.DeleteUser(demoConfig.UserId)
   258  		demo.GetUsers()
   259  	}
   260  	if demoConfig.CreateUser {
   261  		demo.CreateUser()
   262  	}
   263  	if demoConfig.PatchUser {
   264  		userId := "1"
   265  		demo.PatchUser(userId)
   266  	}
   267  	if 1 == 0 {
   268  		userId := "1"
   269  		demo.GetUser(userId)
   270  	}
   271  	if demoConfig.ReplaceUser {
   272  		userId := "1"
   273  		demo.UpdateUser(userId)
   274  	}
   275  }
   276  
   277  type ScimRingCentralDemo struct {
   278  	Client  *rc.APIClient
   279  	Config  DemoConfig
   280  	Context context.Context
   281  }
   282  
   283  func (demo ScimRingCentralDemo) GetServiceProviderConfig() {
   284  	cfg, resp, err := demo.Client.SCIMApi.GetServiceProviderConfig(demo.Context)
   285  	if err != nil {
   286  		log.Fatal(err)
   287  	} else if resp.StatusCode >= 300 {
   288  		log.Fatal(fmt.Sprintf("StatusCode: %v", resp.StatusCode))
   289  	}
   290  	fmtutil.PrintJSON(cfg)
   291  }
   292  
   293  func (demo ScimRingCentralDemo) GetUsers() {
   294  	users, resp, err := demo.Client.SCIMApi.ListUsers(
   295  		demo.Context, &rc.ListUsersOpts{})
   296  	if err != nil {
   297  		log.Fatal(err)
   298  	} else if resp.StatusCode >= 300 {
   299  		log.Fatal(fmt.Sprintf("StatusCode: %v", resp.StatusCode))
   300  	}
   301  	fmtutil.PrintJSON(users)
   302  }
   303  
   304  func (demo ScimRingCentralDemo) GetUser(userId string) rc.UserInfo {
   305  	info, resp, err := demo.Client.SCIMApi.GetUserById(demo.Context, userId)
   306  	if err != nil {
   307  		log.Fatal(err)
   308  	} else if resp.StatusCode >= 300 {
   309  		log.Fatal(fmt.Sprintf("StatusCode: %v", resp.StatusCode))
   310  	}
   311  	fmtutil.PrintJSON(info)
   312  	return info
   313  }
   314  
   315  func (demo ScimRingCentralDemo) DeleteUser(userId string) error {
   316  	resp, err := demo.Client.SCIMApi.DeleteUser(demo.Context, userId)
   317  	if err != nil {
   318  		return errorsutil.Wrap(err, "err ScimRingCentralDemo.DeleteUser()")
   319  		// log.Fatal(err)
   320  	} else if resp.StatusCode >= 300 {
   321  		return fmt.Errorf("invalid HTTP status [%d]", resp.StatusCode)
   322  		// log.Fatal(fmt.Sprintf("StatusCode: %v", resp.StatusCode))
   323  	}
   324  	return httputilmore.PrintResponse(resp, true)
   325  }
   326  
   327  func (demo ScimRingCentralDemo) UpdateUser(userId string) {
   328  	userInfo, resp, err := demo.Client.SCIMApi.GetUserById(demo.Context, userId)
   329  	if err != nil {
   330  		log.Fatal(err)
   331  	} else if resp.StatusCode >= 300 {
   332  		log.Fatal(fmt.Sprintf("StatusCode: %v", resp.StatusCode))
   333  	}
   334  	fmtutil.PrintJSON(userInfo)
   335  
   336  	userReq := rc.UserUpdateRequest{
   337  		Active:       userInfo.Active,
   338  		Addresses:    userInfo.Addresses,
   339  		Emails:       userInfo.Emails,
   340  		ExternalId:   userInfo.ExternalId,
   341  		Id:           userInfo.Id,
   342  		Name:         userInfo.Name,
   343  		PhoneNumbers: userInfo.PhoneNumbers,
   344  		Photos:       userInfo.Photos,
   345  		Schemas:      userInfo.Schemas,
   346  		UserName:     userInfo.UserName,
   347  		Urnietfparamsscimschemasextensionenterprise20User: userInfo.Urnietfparamsscimschemasextensionenterprise20User,
   348  	}
   349  
   350  	userReq.Name.FamilyName = "RingForceAwakens"
   351  
   352  	userResp, resp, err := demo.Client.SCIMApi.UpdateUser(demo.Context, userId, userReq)
   353  	if err != nil {
   354  		log.Fatal(err)
   355  	} else if resp.StatusCode >= 300 {
   356  		log.Fatal(fmt.Sprintf("StatusCode: %v", resp.StatusCode))
   357  	}
   358  	fmtutil.PrintJSON(userResp)
   359  }
   360  
   361  func (demo ScimRingCentralDemo) CreateUser() {
   362  	user := demo.GetNewUser()
   363  
   364  	info, resp, err := demo.Client.SCIMApi.CreateUser(demo.Context, user)
   365  	if err != nil {
   366  		log.Fatal(err)
   367  	} else if resp.StatusCode >= 300 {
   368  		log.Fatal(fmt.Sprintf("StatusCode: %v", resp.StatusCode))
   369  	}
   370  	fmtutil.PrintJSON(info)
   371  }
   372  
   373  func (demo ScimRingCentralDemo) PatchUser(userId string) {
   374  	body := rc.ScimUserPatch{
   375  		Operations: []rc.PatchOperationInfo{
   376  			{
   377  				Op: "add",
   378  				Value: map[string]interface{}{
   379  
   380  					"addresses": []rc.AddressInfo{
   381  						{
   382  							Type:          "work",
   383  							StreetAddress: "100 Main Street",
   384  							Locality:      "South Park",
   385  							Region:        "CO",
   386  							PostalCode:    "80440",
   387  							Country:       "US",
   388  						},
   389  					},
   390  				},
   391  			},
   392  		},
   393  		Schemas: []string{"urn:ietf:params:scim:api:messages:2.0:PatchOp"},
   394  	}
   395  	fmtutil.PrintJSON(body)
   396  
   397  	info, resp, err := demo.Client.SCIMApi.PatchUser(demo.Context, userId,
   398  		&rc.PatchUserOpts{ScimUserPatch: optional.NewInterface(body)})
   399  	if err != nil {
   400  		log.Fatal(err)
   401  	} else if resp.StatusCode >= 300 {
   402  		log.Fatal(fmt.Sprintf("StatusCode: %v", resp.StatusCode))
   403  	}
   404  	fmtutil.PrintJSON(info)
   405  }
   406  
   407  func (demo ScimRingCentralDemo) GetNewUser() rc.UserCreationRequest {
   408  	email := demo.Config.UserEmail
   409  	if len(email) == 0 {
   410  		email = "john@example.com"
   411  	}
   412  	user := rc.UserCreationRequest{
   413  		Name: rc.NameInfo{
   414  			GivenName:  "John",
   415  			FamilyName: "RingCentral",
   416  		},
   417  		Emails: []rc.EmailInfo{
   418  			{
   419  				Value: email,
   420  				Type:  "work",
   421  			},
   422  		},
   423  		Schemas:  []string{"urn:ietf:params:scim:schemas:core:2.0:User"},
   424  		UserName: email,
   425  	}
   426  	return user
   427  }
   428  
   429  type DemoConfig struct {
   430  	GetServiceProviderConfig bool
   431  	CreateUser               bool
   432  	PatchUser                bool
   433  	ReplaceUser              bool
   434  	DeleteUser               bool
   435  	UserEmail                string
   436  	UserId                   string
   437  }
   438  
   439  func main() {
   440  	var createUser = flag.Int("create", 0, "Create user")
   441  	var patchUser = flag.Int("patch", 0, "Patch user")
   442  	var replaceUser = flag.Int("replace", 0, "Replace user")
   443  	var deleteUser = flag.Int("delete", 0, "Delete user")
   444  
   445  	var userEmail = flag.String("email", "", "Email address")
   446  	var userId = flag.String("userid", "", "Email address")
   447  
   448  	flag.Parse()
   449  
   450  	fmt.Printf("[%v]\n", *createUser)
   451  
   452  	cfg := DemoConfig{
   453  		GetServiceProviderConfig: true,
   454  	}
   455  	if *createUser != 0 {
   456  		cfg.CreateUser = true
   457  	}
   458  	if *patchUser != 0 {
   459  		cfg.PatchUser = true
   460  	}
   461  	if *replaceUser != 0 {
   462  		cfg.ReplaceUser = true
   463  	}
   464  	if *deleteUser != 0 {
   465  		cfg.DeleteUser = true
   466  	}
   467  	if len(*userEmail) > 0 {
   468  		cfg.UserEmail = strings.TrimSpace(*userEmail)
   469  	}
   470  	if len(*userId) > 0 {
   471  		cfg.UserId = strings.TrimSpace(*userId)
   472  	}
   473  
   474  	fmtutil.PrintJSON(cfg)
   475  
   476  	err := loadEnv()
   477  	if err != nil {
   478  		log.Fatal(err)
   479  	}
   480  
   481  	if 1 == 0 {
   482  		tryScimClient()
   483  	}
   484  	if 1 == 1 {
   485  		tryRingCentralClient(cfg)
   486  	}
   487  	fmt.Println("DONE")
   488  }