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  }