github.com/grokify/go-ringcentral-client@v0.3.31/office/v1/util/mergedusers/mergedusersrequest.go (about) 1 package mergedusers 2 3 import ( 4 "context" 5 "fmt" 6 "net/http" 7 "regexp" 8 "strings" 9 10 rc "github.com/grokify/go-ringcentral-client/office/v1/client" 11 ru "github.com/grokify/go-ringcentral-client/office/v1/util" 12 "github.com/grokify/mogo/mime/multipartutil" 13 ) 14 15 const ( 16 glipPersonInfosUrlPart = "/restapi/v1.0/glip/persons/" 17 extensionInfosUrlPart = "/restapi/v1.0/account/~/extension/" 18 ) 19 20 var ( 21 rxAccountIdUrl = regexp.MustCompile(`^(.+restapi/v1.0/account/\d+).*`) 22 rxAccountId = regexp.MustCompile(`/account/(\d+)`) 23 ) 24 25 func NewMergedUsersApiIds(client *http.Client, serverUrl string, userIds []string) (MergedUserSet, error) { 26 set := NewMergedUserSet() 27 glipPersonInfosUrl := GlipPersonInfosUrl(serverUrl, userIds) 28 29 resp, err := client.Get(glipPersonInfosUrl) 30 if err != nil { 31 return set, err 32 } 33 mr, err := multipartutil.NewReaderFromHTTPResponse(resp) 34 if err != nil { 35 return set, err 36 } 37 set, err = AddBatchGlipPersonInfosMultipartReader(set, mr) 38 if err != nil { 39 return set, err 40 } 41 42 extensionInfosUrl := ExtensionInfosUrl(serverUrl, userIds) 43 44 resp2, err := client.Get(extensionInfosUrl) 45 if err != nil { 46 return set, err 47 } 48 set, err = AddBatchExtensionInfosHttpResponse(set, resp2) 49 if err != nil { 50 return set, err 51 } 52 return AddMainCompanyPhoneNumber(client, serverUrl, set) 53 } 54 55 func GlipPersonInfosUrl(serverUrl string, userIds []string) string { 56 return fmt.Sprintf("%s%s%s", serverUrl, glipPersonInfosUrlPart, strings.Join(userIds, ",")) 57 } 58 59 func ExtensionInfosUrl(serverUrl string, userIds []string) string { 60 return fmt.Sprintf("%s%s%s", serverUrl, extensionInfosUrlPart, strings.Join(userIds, ",")) 61 } 62 63 func ApiUrlToAccountIdUrl(apiUrl string) string { 64 return rxAccountIdUrl.ReplaceAllString(apiUrl, "$1") 65 } 66 67 func AddMainCompanyPhoneNumber(client *http.Client, serverUrl string, set MergedUserSet) (MergedUserSet, error) { 68 accountIdToExtIds := map[string]map[string]int{} 69 for extId, mu := range set.MergedUserMap { 70 if len(mu.ExtensionInfo.Uri) > 0 { 71 m := rxAccountId.FindStringSubmatch(mu.ExtensionInfo.Uri) 72 if len(m) > 1 { 73 actId := m[1] 74 if _, ok := accountIdToExtIds[actId]; !ok { 75 accountIdToExtIds[actId] = map[string]int{} 76 } 77 accountIdToExtIds[actId][extId] = 1 78 } 79 } 80 } 81 82 if len(accountIdToExtIds) > 0 { 83 apiClient, err := ru.NewApiClientHttpClientBaseURL(client, serverUrl) 84 if err != nil { 85 return set, err 86 } 87 88 for actId, extIds := range accountIdToExtIds { 89 mainNumber, err := GetCompanyMainNumber(apiClient, actId) 90 if err != nil { 91 return set, err 92 } 93 if len(mainNumber) > 0 { 94 for extId := range extIds { 95 if user, ok := set.MergedUserMap[extId]; ok { 96 user.MainNumber = mainNumber 97 set.MergedUserMap[extId] = user 98 } 99 } 100 } 101 } 102 } 103 return set, nil 104 } 105 106 func GetCompanyMainNumber(apiClient *rc.APIClient, accountId string) (string, error) { 107 info, resp, err := apiClient.CompanySettingsApi.LoadAccount(context.Background(), accountId) 108 if err != nil { 109 return "", err 110 } else if resp.StatusCode >= 300 { 111 return "", fmt.Errorf("API Error Status [%v]", resp.StatusCode) 112 } 113 return info.MainNumber, nil 114 }