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 --- api/channel.go | 13 ++++++++++- api/channel_test.go | 56 +++++++++++++++++++++++++++++++----------------- api/command_join.go | 2 +- api/command_join_test.go | 2 +- api/team.go | 8 +++---- api/team_test.go | 4 ++-- 6 files changed, 56 insertions(+), 29 deletions(-) (limited to 'api') diff --git a/api/channel.go b/api/channel.go index bae2a5277..2232786fd 100644 --- a/api/channel.go +++ b/api/channel.go @@ -21,6 +21,7 @@ func InitChannel() { BaseRoutes.Channels.Handle("/", ApiUserRequired(getChannels)).Methods("GET") BaseRoutes.Channels.Handle("/more", ApiUserRequired(getMoreChannels)).Methods("GET") BaseRoutes.Channels.Handle("/counts", ApiUserRequired(getChannelCounts)).Methods("GET") + BaseRoutes.Channels.Handle("/members", ApiUserRequired(getMyChannelMembers)).Methods("GET") BaseRoutes.Channels.Handle("/create", ApiUserRequired(createChannel)).Methods("POST") BaseRoutes.Channels.Handle("/create_direct", ApiUserRequired(createDirectChannel)).Methods("POST") BaseRoutes.Channels.Handle("/update", ApiUserRequired(updateChannel)).Methods("POST") @@ -81,7 +82,7 @@ func createChannel(c *Context, w http.ResponseWriter, r *http.Request) { return } else { data := result.Data.(*model.ChannelList) - if int64(len(data.Channels)+1) > *utils.Cfg.TeamSettings.MaxChannelsPerTeam { + if int64(len(*data)+1) > *utils.Cfg.TeamSettings.MaxChannelsPerTeam { c.Err = model.NewLocAppError("createChannel", "api.channel.create_channel.max_channel_limit.app_error", map[string]interface{}{"MaxChannelsPerTeam": *utils.Cfg.TeamSettings.MaxChannelsPerTeam}, "") return } @@ -987,6 +988,16 @@ func getChannelMember(c *Context, w http.ResponseWriter, r *http.Request) { } } +func getMyChannelMembers(c *Context, w http.ResponseWriter, r *http.Request) { + if result := <-Srv.Store.Channel().GetMembersForUser(c.TeamId, c.Session.UserId); result.Err != nil { + c.Err = result.Err + return + } else { + data := result.Data.(*model.ChannelMembers) + w.Write([]byte(data.ToJson())) + } +} + func addMember(c *Context, w http.ResponseWriter, r *http.Request) { params := mux.Vars(r) id := params["channel_id"] diff --git a/api/channel_test.go b/api/channel_test.go index 4835ee9b7..83bb732dd 100644 --- a/api/channel_test.go +++ b/api/channel_test.go @@ -35,7 +35,7 @@ func TestCreateChannel(t *testing.T) { rget := Client.Must(Client.GetChannels("")).Data.(*model.ChannelList) nameMatch := false - for _, c := range rget.Channels { + for _, c := range *rget { if c.Name == channel.Name { nameMatch = true } @@ -240,8 +240,8 @@ func TestUpdateChannel(t *testing.T) { } rget := Client.Must(Client.GetChannels("")) - data := rget.Data.(*model.ChannelList) - for _, c := range data.Channels { + channels := rget.Data.(*model.ChannelList) + for _, c := range *channels { if c.Name == model.DEFAULT_CHANNEL { c.Header = "new header" c.Name = "pseudo-square" @@ -654,13 +654,13 @@ func TestGetChannel(t *testing.T) { channel2 = Client.Must(Client.CreateChannel(channel2)).Data.(*model.Channel) rget := Client.Must(Client.GetChannels("")) - data := rget.Data.(*model.ChannelList) + channels := rget.Data.(*model.ChannelList) - if data.Channels[0].DisplayName != channel1.DisplayName { + if (*channels)[0].DisplayName != channel1.DisplayName { t.Fatal("full name didn't match") } - if data.Channels[1].DisplayName != channel2.DisplayName { + if (*channels)[1].DisplayName != channel2.DisplayName { t.Fatal("full name didn't match") } @@ -717,13 +717,13 @@ func TestGetMoreChannel(t *testing.T) { th.LoginBasic2() rget := Client.Must(Client.GetMoreChannels("")) - data := rget.Data.(*model.ChannelList) + channels := rget.Data.(*model.ChannelList) - if data.Channels[0].DisplayName != channel1.DisplayName { + if (*channels)[0].DisplayName != channel1.DisplayName { t.Fatal("full name didn't match") } - if data.Channels[1].DisplayName != channel2.DisplayName { + if (*channels)[1].DisplayName != channel2.DisplayName { t.Fatal("full name didn't match") } @@ -770,6 +770,30 @@ func TestGetChannelCounts(t *testing.T) { } +func TestGetMyChannelMembers(t *testing.T) { + th := Setup().InitBasic() + Client := th.BasicClient + team := th.BasicTeam + + channel1 := &model.Channel{DisplayName: "A Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id} + channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel) + + channel2 := &model.Channel{DisplayName: "B Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id} + channel2 = Client.Must(Client.CreateChannel(channel2)).Data.(*model.Channel) + + if result, err := Client.GetMyChannelMembers(); err != nil { + t.Fatal(err) + } else { + members := result.Data.(*model.ChannelMembers) + + // town-square, off-topic, basic test channel, channel1, channel2 + if len(*members) != 5 { + t.Fatal("wrong number of members", len(*members)) + } + } + +} + func TestJoinChannelById(t *testing.T) { th := Setup().InitBasic() Client := th.BasicClient @@ -905,7 +929,7 @@ func TestLeaveChannel(t *testing.T) { rget := Client.Must(Client.GetChannels("")) cdata := rget.Data.(*model.ChannelList) - for _, c := range cdata.Channels { + for _, c := range *cdata { if c.Name == model.DEFAULT_CHANNEL { if _, err := Client.LeaveChannel(c.Id); err == nil { t.Fatal("should have errored on leaving default channel") @@ -969,7 +993,7 @@ func TestDeleteChannel(t *testing.T) { rget := Client.Must(Client.GetChannels("")) cdata := rget.Data.(*model.ChannelList) - for _, c := range cdata.Channels { + for _, c := range *cdata { if c.Name == model.DEFAULT_CHANNEL { if _, err := Client.DeleteChannel(c.Id); err == nil { t.Fatal("should have errored on deleting default channel") @@ -1249,7 +1273,7 @@ func TestUpdateNotifyProps(t *testing.T) { data["user_id"] = user.Id data["desktop"] = model.CHANNEL_NOTIFY_MENTION - timeBeforeUpdate := model.GetMillis() + //timeBeforeUpdate := model.GetMillis() time.Sleep(100 * time.Millisecond) // test updating desktop @@ -1261,14 +1285,6 @@ func TestUpdateNotifyProps(t *testing.T) { t.Fatalf("NotifyProps[\"mark_unread\"] changed to %v", notifyProps["mark_unread"]) } - rget := Client.Must(Client.GetChannels("")) - rdata := rget.Data.(*model.ChannelList) - if len(rdata.Members) == 0 || rdata.Members[channel1.Id].NotifyProps["desktop"] != data["desktop"] { - t.Fatal("NotifyProps[\"desktop\"] did not update properly") - } else if rdata.Members[channel1.Id].LastUpdateAt <= timeBeforeUpdate { - t.Fatal("LastUpdateAt did not update") - } - // test an empty update delete(data, "desktop") diff --git a/api/command_join.go b/api/command_join.go index b8c863425..2aba1bbd5 100644 --- a/api/command_join.go +++ b/api/command_join.go @@ -38,7 +38,7 @@ func (me *JoinProvider) DoCommand(c *Context, channelId string, message string) } else { channels := result.Data.(*model.ChannelList) - for _, v := range channels.Channels { + for _, v := range *channels { if v.Name == message { diff --git a/api/command_join_test.go b/api/command_join_test.go index 6cf474c6b..a1dbace41 100644 --- a/api/command_join_test.go +++ b/api/command_join_test.go @@ -42,7 +42,7 @@ func TestJoinCommands(t *testing.T) { c1 := Client.Must(Client.GetChannels("")).Data.(*model.ChannelList) found := false - for _, c := range c1.Channels { + for _, c := range *c1 { if c.Id == channel2.Id { found = true } diff --git a/api/team.go b/api/team.go index 4d4795ab6..46e822504 100644 --- a/api/team.go +++ b/api/team.go @@ -325,20 +325,20 @@ func LeaveTeam(team *model.Team, user *model.User) *model.AppError { teamMember = result.Data.(model.TeamMember) } - var channelMembers *model.ChannelList + var channelList *model.ChannelList if result := <-Srv.Store.Channel().GetChannels(team.Id, user.Id); result.Err != nil { if result.Err.Id == "store.sql_channel.get_channels.not_found.app_error" { - channelMembers = &model.ChannelList{make([]*model.Channel, 0), make(map[string]*model.ChannelMember)} + channelList = &model.ChannelList{} } else { return result.Err } } else { - channelMembers = result.Data.(*model.ChannelList) + channelList = result.Data.(*model.ChannelList) } - for _, channel := range channelMembers.Channels { + for _, channel := range *channelList { if channel.Type != model.CHANNEL_DIRECT { Srv.Store.User().InvalidateProfilesInChannelCache(channel.Id) if result := <-Srv.Store.Channel().RemoveMember(channel.Id, user.Id); result.Err != nil { diff --git a/api/team_test.go b/api/team_test.go index a58710145..bac0228ad 100644 --- a/api/team_test.go +++ b/api/team_test.go @@ -63,7 +63,7 @@ func TestCreateFromSignupTeam(t *testing.T) { } c1 := Client.Must(Client.GetChannels("")).Data.(*model.ChannelList) - if len(c1.Channels) != 2 { + if len(*c1) != 2 { t.Fatal("default channels not created") } @@ -94,7 +94,7 @@ func TestCreateTeam(t *testing.T) { Client.SetTeamId(rteam.Data.(*model.Team).Id) c1 := Client.Must(Client.GetChannels("")).Data.(*model.ChannelList) - if len(c1.Channels) != 2 { + if len(*c1) != 2 { t.Fatal("default channels not created") } -- cgit v1.2.3-1-g7c22