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  }