diff options
author | enahum <nahumhbl@gmail.com> | 2016-10-27 12:24:30 -0300 |
---|---|---|
committer | Harrison Healey <harrisonmhealey@gmail.com> | 2016-10-27 11:24:30 -0400 |
commit | f82667f3b86202dafff3a2a4ea56aec74c80316d (patch) | |
tree | 3785d9502505be528706e41b993a834c7bc00338 /model | |
parent | 14ce471311fee2830be3cbd3a90179015f513719 (diff) | |
download | chat-f82667f3b86202dafff3a2a4ea56aec74c80316d.tar.gz chat-f82667f3b86202dafff3a2a4ea56aec74c80316d.tar.bz2 chat-f82667f3b86202dafff3a2a4ea56aec74c80316d.zip |
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
Diffstat (limited to 'model')
-rw-r--r-- | model/channel_list.go | 35 | ||||
-rw-r--r-- | model/channel_member.go | 21 | ||||
-rw-r--r-- | model/client.go | 16 |
3 files changed, 39 insertions, 33 deletions
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 |