github.com/grokify/go-ringcentral-client@v0.3.31/office/v1/util/mergedusers/mergedusers.go (about) 1 package mergedusers 2 3 import ( 4 "encoding/json" 5 "errors" 6 "fmt" 7 "io" 8 "io/ioutil" 9 "mime/multipart" 10 "net/http" 11 "strconv" 12 "strings" 13 14 rc "github.com/grokify/go-ringcentral-client/office/v1/client" 15 "github.com/grokify/mogo/mime/multipartutil" 16 "github.com/nyaruka/phonenumbers" 17 ) 18 19 type MergedUserSet struct { 20 UserIdOrder []string 21 MergedUserMap map[string]MergedUser 22 } 23 24 func NewMergedUserSet() MergedUserSet { 25 return MergedUserSet{ 26 UserIdOrder: []string{}, 27 MergedUserMap: map[string]MergedUser{}} 28 } 29 30 type MergedUser struct { 31 MainNumber string 32 GlipPersonInfo rc.GlipPersonInfo 33 ExtensionInfo rc.GetExtensionInfoResponse 34 } 35 36 func (mu *MergedUser) TrimNumbers() { 37 mu.MainNumber = strings.TrimSpace(mu.MainNumber) 38 mu.ExtensionInfo.Contact.BusinessPhone = strings.TrimSpace(mu.ExtensionInfo.Contact.BusinessPhone) 39 mu.ExtensionInfo.ExtensionNumber = strings.TrimSpace(mu.ExtensionInfo.ExtensionNumber) 40 } 41 42 func (mu *MergedUser) PhoneBusinessOrMainNumberExt() string { 43 mu.TrimNumbers() 44 45 if len(mu.ExtensionInfo.Contact.BusinessPhone) > 0 { 46 return mu.ExtensionInfo.Contact.BusinessPhone 47 } 48 if len(mu.MainNumber) > 0 && 49 len(mu.ExtensionInfo.ExtensionNumber) > 0 { 50 return fmt.Sprintf("%s;ext=%s", mu.MainNumber, mu.ExtensionInfo.ExtensionNumber) 51 } else if len(mu.MainNumber) > 0 { 52 return mu.MainNumber 53 } else if len(mu.ExtensionInfo.ExtensionNumber) > 0 { 54 return fmt.Sprintf("ext=%s", mu.ExtensionInfo.ExtensionNumber) 55 } 56 return "" 57 } 58 59 func (mu *MergedUser) DisplayNumber() (string, error) { 60 mu.TrimNumbers() 61 62 if len(mu.ExtensionInfo.Contact.BusinessPhone) > 0 { 63 num, err := phonenumbers.Parse(mu.ExtensionInfo.Contact.BusinessPhone, "") 64 if err != nil { 65 return "", err 66 } 67 return phonenumbers.Format(num, phonenumbers.NATIONAL), nil 68 } else if len(mu.MainNumber) > 0 { 69 num, err := phonenumbers.Parse(mu.MainNumber, "") 70 if err != nil { 71 return "", err 72 } 73 main := phonenumbers.Format(num, phonenumbers.NATIONAL) 74 if len(mu.ExtensionInfo.ExtensionNumber) > 0 { 75 main = fmt.Sprintf("%s x%s", main, mu.ExtensionInfo.ExtensionNumber) 76 } 77 return main, nil 78 } else if len(mu.ExtensionInfo.ExtensionNumber) > 0 { 79 return "x" + mu.ExtensionInfo.ExtensionNumber, nil 80 } 81 return "", errors.New("No phone number") 82 } 83 84 type MergedUserThin struct { 85 Id string 86 FirstName string 87 LastName string 88 Email string 89 Avatar string 90 CompanyId string 91 JobTitle string 92 MainNumber string 93 ExtensionNumber string 94 BusinessPhone string 95 DisplayNumber string 96 } 97 98 func (mu *MergedUser) ToMergedUserThin() MergedUserThin { 99 per := mu.GlipPersonInfo 100 ext := mu.ExtensionInfo 101 thin := MergedUserThin{ 102 Id: per.Id, 103 FirstName: per.FirstName, 104 LastName: per.LastName, 105 Email: per.Email, 106 Avatar: per.Avatar, 107 CompanyId: per.CompanyId, 108 JobTitle: per.JobTitle, 109 MainNumber: mu.MainNumber, 110 ExtensionNumber: ext.ExtensionNumber, 111 BusinessPhone: ext.Contact.BusinessPhone} 112 if disp, err := mu.DisplayNumber(); err == nil { 113 thin.DisplayNumber = disp 114 } 115 return thin 116 } 117 118 func NewMergedUserFromMimePart(part *multipart.Part) (MergedUser, error) { 119 mu := MergedUser{} 120 if slurp, err := ioutil.ReadAll(part); err != nil { 121 return mu, err 122 } else if err = json.Unmarshal(slurp, &mu.GlipPersonInfo); err != nil { 123 return mu, err 124 } 125 return mu, nil 126 } 127 128 func NewGlipPersonInfoFromMimePart(part *multipart.Part) (rc.GlipPersonInfo, error) { 129 var person rc.GlipPersonInfo 130 if slurp, err := ioutil.ReadAll(part); err != nil { 131 return person, err 132 } else { 133 return person, json.Unmarshal(slurp, &person) 134 } 135 } 136 137 func NewExtensionInfoFromMimePart(part *multipart.Part) (rc.GetExtensionInfoResponse, error) { 138 var ext rc.GetExtensionInfoResponse 139 if slurp, err := ioutil.ReadAll(part); err != nil { 140 return ext, err 141 } else { 142 return ext, json.Unmarshal(slurp, &ext) 143 } 144 } 145 146 func AddBatchGlipPersonInfosBodyBoundary(mergedUserSet MergedUserSet, body []byte, boundary string) (MergedUserSet, error) { 147 mr := multipartutil.NewReaderFromBodyBytes([]byte(body), boundary) 148 return AddBatchGlipPersonInfosMultipartReader(mergedUserSet, mr) 149 } 150 151 func AddBatchGlipPersonInfosMultipartReader(mergedUserSet MergedUserSet, mr *multipart.Reader) (MergedUserSet, error) { 152 for { 153 part, err := mr.NextPart() 154 if err == io.EOF { 155 break 156 } else if err != nil { 157 return mergedUserSet, err 158 } 159 if person, err := NewGlipPersonInfoFromMimePart(part); err != nil { 160 return mergedUserSet, err 161 } else if len(person.Id) > 0 { 162 if mu, ok := mergedUserSet.MergedUserMap[person.Id]; ok { 163 mu.GlipPersonInfo = person 164 mergedUserSet.MergedUserMap[person.Id] = mu 165 } else { 166 mergedUserSet.MergedUserMap[person.Id] = MergedUser{GlipPersonInfo: person} 167 mergedUserSet.UserIdOrder = append(mergedUserSet.UserIdOrder, person.Id) 168 } 169 } 170 } 171 return mergedUserSet, nil 172 } 173 174 func AddBatchExtensionInfosHttpResponse(mergedUserSet MergedUserSet, resp *http.Response) (MergedUserSet, error) { 175 mr, err := multipartutil.NewReaderFromHTTPResponse(resp) 176 if err != nil { 177 return mergedUserSet, err 178 } 179 return AddBatchExtensionInfosMultipartReader(mergedUserSet, mr) 180 } 181 182 func AddBatchExtensionInfosMultipartReader(mergedUserSet MergedUserSet, mr *multipart.Reader) (MergedUserSet, error) { 183 for { 184 part, err := mr.NextPart() 185 if err == io.EOF { 186 break 187 } else if err != nil { 188 return mergedUserSet, err 189 } 190 if ext, err := NewExtensionInfoFromMimePart(part); err != nil { 191 return mergedUserSet, err 192 } else if ext.Id > 0 { 193 extIdString := strconv.Itoa(int(ext.Id)) 194 if mu, ok := mergedUserSet.MergedUserMap[extIdString]; ok { 195 mu.ExtensionInfo = ext 196 mergedUserSet.MergedUserMap[extIdString] = mu 197 } else { 198 mergedUserSet.MergedUserMap[extIdString] = MergedUser{ExtensionInfo: ext} 199 mergedUserSet.UserIdOrder = append(mergedUserSet.UserIdOrder, extIdString) 200 } 201 } 202 } 203 return mergedUserSet, nil 204 }