diff options
author | Corey Hulen <corey@hulen.com> | 2015-12-11 06:40:37 -0800 |
---|---|---|
committer | Corey Hulen <corey@hulen.com> | 2015-12-11 06:40:37 -0800 |
commit | 412b45431ac913d13fb211b693e177bc92a09ecf (patch) | |
tree | 74f7e329090541f18ab30c7bf62d21987be92629 /api | |
parent | 607a8151de502bf45de131ef3632c741ad452333 (diff) | |
parent | c55e7895d91c9d4cd31c7cefe81319d64d7fed16 (diff) | |
download | chat-412b45431ac913d13fb211b693e177bc92a09ecf.tar.gz chat-412b45431ac913d13fb211b693e177bc92a09ecf.tar.bz2 chat-412b45431ac913d13fb211b693e177bc92a09ecf.zip |
Merge pull request #1652 from hmhealey/plt1319
PLT-1319 Fixed direct channels not being visible when no actual channel exists
Diffstat (limited to 'api')
-rw-r--r-- | api/post.go | 59 | ||||
-rw-r--r-- | api/post_test.go | 48 | ||||
-rw-r--r-- | api/web_team_hub.go | 4 |
3 files changed, 110 insertions, 1 deletions
diff --git a/api/post.go b/api/post.go index 5fbacc906..97211b391 100644 --- a/api/post.go +++ b/api/post.go @@ -236,9 +236,68 @@ func handlePostEventsAndForget(c *Context, post *model.Post, triggerWebhooks boo if triggerWebhooks { handleWebhookEventsAndForget(c, post, team, channel, user) } + + if channel.Type == model.CHANNEL_DIRECT { + go makeDirectChannelVisible(c.Session.TeamId, post.ChannelId) + } }() } +func makeDirectChannelVisible(teamId string, channelId string) { + var members []model.ChannelMember + if result := <-Srv.Store.Channel().GetMembers(channelId); result.Err != nil { + l4g.Error("Failed to get channel members channel_id=%v err=%v", channelId, result.Err.Message) + return + } else { + members = result.Data.([]model.ChannelMember) + } + + if len(members) != 2 { + l4g.Error("Failed to get 2 members for a direct channel channel_id=%v", channelId) + return + } + + // make sure the channel is visible to both members + for i, member := range members { + otherUserId := members[1-i].UserId + + if result := <-Srv.Store.Preference().Get(member.UserId, model.PREFERENCE_CATEGORY_DIRECT_CHANNEL_SHOW, otherUserId); result.Err != nil { + // create a new preference since one doesn't exist yet + preference := &model.Preference{ + UserId: member.UserId, + Category: model.PREFERENCE_CATEGORY_DIRECT_CHANNEL_SHOW, + Name: otherUserId, + Value: "true", + } + + if saveResult := <-Srv.Store.Preference().Save(&model.Preferences{*preference}); saveResult.Err != nil { + l4g.Error("Failed to save direct channel preference user_id=%v other_user_id=%v err=%v", member.UserId, otherUserId, saveResult.Err.Message) + } else { + message := model.NewMessage(teamId, channelId, member.UserId, model.ACTION_PREFERENCE_CHANGED) + message.Add("preference", preference.ToJson()) + + PublishAndForget(message) + } + } else { + preference := result.Data.(model.Preference) + + if preference.Value != "true" { + // update the existing preference to make the channel visible + preference.Value = "true" + + if updateResult := <-Srv.Store.Preference().Save(&model.Preferences{preference}); updateResult.Err != nil { + l4g.Error("Failed to update direct channel preference user_id=%v other_user_id=%v err=%v", member.UserId, otherUserId, updateResult.Err.Message) + } else { + message := model.NewMessage(teamId, channelId, member.UserId, model.ACTION_PREFERENCE_CHANGED) + message.Add("preference", preference.ToJson()) + + PublishAndForget(message) + } + } + } + } +} + func handleWebhookEventsAndForget(c *Context, post *model.Post, team *model.Team, channel *model.Channel, user *model.User) { go func() { if !utils.Cfg.ServiceSettings.EnableOutgoingWebhooks { diff --git a/api/post_test.go b/api/post_test.go index 0cb437e88..8e09ca76d 100644 --- a/api/post_test.go +++ b/api/post_test.go @@ -805,3 +805,51 @@ func TestFuzzyPosts(t *testing.T) { } } } + +func TestMakeDirectChannelVisible(t *testing.T) { + Setup() + + team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} + team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team) + + user1 := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"} + user1 = Client.Must(Client.CreateUser(user1, "")).Data.(*model.User) + store.Must(Srv.Store.User().VerifyEmail(user1.Id)) + + user2 := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"} + user2 = Client.Must(Client.CreateUser(user2, "")).Data.(*model.User) + store.Must(Srv.Store.User().VerifyEmail(user2.Id)) + + // user2 will be created with prefs created to show user1 in the sidebar so set that to false to get rid of it + Client.LoginByEmail(team.Name, user2.Email, "pwd") + + preferences := &model.Preferences{ + { + UserId: user2.Id, + Category: model.PREFERENCE_CATEGORY_DIRECT_CHANNEL_SHOW, + Name: user1.Id, + Value: "false", + }, + } + Client.Must(Client.SetPreferences(preferences)) + + Client.LoginByEmail(team.Name, user1.Email, "pwd") + + channel := Client.Must(Client.CreateDirectChannel(map[string]string{"user_id": user2.Id})).Data.(*model.Channel) + + makeDirectChannelVisible(team.Id, channel.Id) + + if result, err := Client.GetPreference(model.PREFERENCE_CATEGORY_DIRECT_CHANNEL_SHOW, user2.Id); err != nil { + t.Fatal("Errored trying to set direct channel to be visible for user1") + } else if pref := result.Data.(*model.Preference); pref.Value != "true" { + t.Fatal("Failed to set direct channel to be visible for user1") + } + + Client.LoginByEmail(team.Name, user2.Email, "pwd") + + if result, err := Client.GetPreference(model.PREFERENCE_CATEGORY_DIRECT_CHANNEL_SHOW, user1.Id); err != nil { + t.Fatal("Errored trying to set direct channel to be visible for user2") + } else if pref := result.Data.(*model.Preference); pref.Value != "true" { + t.Fatal("Failed to set direct channel to be visible for user2") + } +} diff --git a/api/web_team_hub.go b/api/web_team_hub.go index 6a25b7d3d..2c2386317 100644 --- a/api/web_team_hub.go +++ b/api/web_team_hub.go @@ -95,9 +95,11 @@ func ShouldSendEvent(webCon *WebConn, msg *model.Message) bool { return false } } else { - // Don't share a user's view events with other users + // Don't share a user's view or preference events with other users if msg.Action == model.ACTION_CHANNEL_VIEWED { return false + } else if msg.Action == model.ACTION_PREFERENCE_CHANGED { + return false } // Only report events to a user who is the subject of the event, or is in the channel of the event |