From f82667f3b86202dafff3a2a4ea56aec74c80316d Mon Sep 17 00:00:00 2001 From: enahum Date: Thu, 27 Oct 2016 12:24:30 -0300 Subject: PLT-4430 improve slow channel switching (#4331) * PLT-4430 improve slow channel switching * Update client side unit tests * Convert getChannelsUnread to getMyChannelMembers and address other feedback * Pull channel members on websocket reconnect --- model/channel_list.go | 35 +++++------------------------------ model/channel_member.go | 21 +++++++++++++++++++++ model/client.go | 16 +++++++++++++--- 3 files changed, 39 insertions(+), 33 deletions(-) (limited to 'model') diff --git a/model/channel_list.go b/model/channel_list.go index 49ba384a2..7a46de45d 100644 --- a/model/channel_list.go +++ b/model/channel_list.go @@ -8,15 +8,11 @@ import ( "io" ) -type ChannelList struct { - Channels []*Channel `json:"channels"` - Members map[string]*ChannelMember `json:"members"` -} +type ChannelList []*Channel func (o *ChannelList) ToJson() string { - b, err := json.Marshal(o) - if err != nil { - return "" + if b, err := json.Marshal(o); err != nil { + return "[]" } else { return string(b) } @@ -28,7 +24,7 @@ func (o *ChannelList) Etag() string { var t int64 = 0 var delta int64 = 0 - for _, v := range o.Channels { + for _, v := range *o { if v.LastPostAt > t { t = v.LastPostAt id = v.Id @@ -39,30 +35,9 @@ func (o *ChannelList) Etag() string { id = v.Id } - member := o.Members[v.Id] - - if member != nil { - max := v.LastPostAt - if v.UpdateAt > max { - max = v.UpdateAt - } - - delta += max - member.LastViewedAt - - if member.LastViewedAt > t { - t = member.LastViewedAt - id = v.Id - } - - if member.LastUpdateAt > t { - t = member.LastUpdateAt - id = v.Id - } - - } } - return Etag(id, t, delta, len(o.Channels)) + return Etag(id, t, delta, len(*o)) } func ChannelListFromJson(data io.Reader) *ChannelList { diff --git a/model/channel_member.go b/model/channel_member.go index 705c6bfbd..4180bb8e6 100644 --- a/model/channel_member.go +++ b/model/channel_member.go @@ -29,6 +29,27 @@ type ChannelMember struct { LastUpdateAt int64 `json:"last_update_at"` } +type ChannelMembers []ChannelMember + +func (o *ChannelMembers) ToJson() string { + if b, err := json.Marshal(o); err != nil { + return "[]" + } else { + return string(b) + } +} + +func ChannelMembersFromJson(data io.Reader) *ChannelMembers { + decoder := json.NewDecoder(data) + var o ChannelMembers + err := decoder.Decode(&o) + if err == nil { + return &o + } else { + return nil + } +} + func (o *ChannelMember) ToJson() string { b, err := json.Marshal(o) if err != nil { diff --git a/model/client.go b/model/client.go index f5aeea4db..e9d6c512c 100644 --- a/model/client.go +++ b/model/client.go @@ -1124,13 +1124,13 @@ func (c *Client) UpdateNotifyProps(data map[string]string) (*Result, *AppError) } } -func (c *Client) GetChannels(etag string) (*Result, *AppError) { - if r, err := c.DoApiGet(c.GetTeamRoute()+"/channels/", "", etag); err != nil { +func (c *Client) GetMyChannelMembers() (*Result, *AppError) { + if r, err := c.DoApiGet(c.GetTeamRoute()+"/channels/members", "", ""); err != nil { return nil, err } else { defer closeBody(r) return &Result{r.Header.Get(HEADER_REQUEST_ID), - r.Header.Get(HEADER_ETAG_SERVER), ChannelListFromJson(r.Body)}, nil + r.Header.Get(HEADER_ETAG_SERVER), ChannelMembersFromJson(r.Body)}, nil } } @@ -1164,6 +1164,16 @@ func (c *Client) GetChannelCounts(etag string) (*Result, *AppError) { } } +func (c *Client) GetChannels(etag string) (*Result, *AppError) { + if r, err := c.DoApiGet(c.GetTeamRoute()+"/channels/", "", etag); err != nil { + return nil, err + } else { + defer closeBody(r) + return &Result{r.Header.Get(HEADER_REQUEST_ID), + r.Header.Get(HEADER_ETAG_SERVER), ChannelListFromJson(r.Body)}, nil + } +} + func (c *Client) JoinChannel(id string) (*Result, *AppError) { if r, err := c.DoApiPost(c.GetChannelRoute(id)+"/join", ""); err != nil { return nil, err -- cgit v1.2.3-1-g7c22