summaryrefslogtreecommitdiffstats
path: root/api
diff options
context:
space:
mode:
authorhmhealey <harrisonmhealey@gmail.com>2015-12-07 18:14:07 -0500
committerhmhealey <harrisonmhealey@gmail.com>2015-12-07 18:14:07 -0500
commit4b51490a3836144e6407b71cbd00aa094985168a (patch)
tree5f3fd42fc1cb037a4342355e9af7dbcfc39257c9 /api
parent7d4a9ad376cf346826ab13b7c0d4eec60eb5cb7d (diff)
downloadchat-4b51490a3836144e6407b71cbd00aa094985168a.tar.gz
chat-4b51490a3836144e6407b71cbd00aa094985168a.tar.bz2
chat-4b51490a3836144e6407b71cbd00aa094985168a.zip
Moved logic for making direct channels visible to both members on post to the server
Diffstat (limited to 'api')
-rw-r--r--api/post.go59
-rw-r--r--api/post_test.go48
2 files changed, 107 insertions, 0 deletions
diff --git a/api/post.go b/api/post.go
index e1adc1d98..5f9dbc775 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")
+ }
+}