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, ¶ms) 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 }