From 18d29a19e5ec7e4b52a79ec77bff6cc9a63cd5e9 Mon Sep 17 00:00:00 2001 From: Florian Orben Date: Fri, 4 Dec 2015 03:39:37 +0100 Subject: PLT-1380: Post system message when user updates channel header --- api/channel.go | 34 +++++++++++++++++++++++++++++++++- model/post.go | 3 ++- web/react/components/post.jsx | 2 +- 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/api/channel.go b/api/channel.go index 6fa6ec295..659121bf0 100644 --- a/api/channel.go +++ b/api/channel.go @@ -268,19 +268,51 @@ func updateChannelHeader(c *Context, w http.ResponseWriter, r *http.Request) { if !c.HasPermissionsToTeam(channel.TeamId, "updateChannelHeader") { return } - + oldChannelHeader := channel.Header channel.Header = channelHeader if ucresult := <-Srv.Store.Channel().Update(channel); ucresult.Err != nil { c.Err = ucresult.Err return } else { + PostUpdateChannelHeaderMessageAndForget(c, channel.Id, oldChannelHeader, channelHeader) c.LogAudit("name=" + channel.Name) w.Write([]byte(channel.ToJson())) } } } +func PostUpdateChannelHeaderMessageAndForget(c *Context, channelId string, oldChannelHeader, newChannelHeader string) { + go func() { + uc := Srv.Store.User().Get(c.Session.UserId) + + if uresult := <-uc; uresult.Err != nil { + l4g.Error("Failed to retrieve user while trying to save update channel header message %v", uresult.Err) + return + } else { + user := uresult.Data.(*model.User) + + var message string + if oldChannelHeader == "" { + message = fmt.Sprintf("%s updated the channel header to: %s", user.Username, newChannelHeader) + } else if newChannelHeader == "" { + message = fmt.Sprintf("%s removed the channel header (was: %s)", user.Username, oldChannelHeader) + } else { + message = fmt.Sprintf("%s updated the channel header from: %s to: %s", user.Username, oldChannelHeader, newChannelHeader) + } + + post := &model.Post{ + ChannelId: channelId, + Message: message, + Type: model.POST_HEADER_CHANGE, + } + if _, err := CreatePost(c, post, false); err != nil { + l4g.Error("Failed to post join/leave message %v", err) + } + } + }() +} + func updateChannelPurpose(c *Context, w http.ResponseWriter, r *http.Request) { props := model.MapFromJson(r.Body) channelId := props["channel_id"] diff --git a/model/post.go b/model/post.go index 2c90d8b7b..5c86ce70d 100644 --- a/model/post.go +++ b/model/post.go @@ -14,6 +14,7 @@ const ( POST_DEFAULT = "" POST_SLACK_ATTACHMENT = "slack_attachment" POST_JOIN_LEAVE = "system_join_leave" + POST_HEADER_CHANGE = "system_header_change" ) type Post struct { @@ -105,7 +106,7 @@ func (o *Post) IsValid() *AppError { } // should be removed once more message types are supported - if !(o.Type == POST_DEFAULT || o.Type == POST_JOIN_LEAVE || o.Type == POST_SLACK_ATTACHMENT) { + if !(o.Type == POST_DEFAULT || o.Type == POST_JOIN_LEAVE || o.Type == POST_SLACK_ATTACHMENT || o.Type == POST_HEADER_CHANGE) { return NewAppError("Post.IsValid", "Invalid type", "id="+o.Type) } diff --git a/web/react/components/post.jsx b/web/react/components/post.jsx index 786a4a325..695d7daef 100644 --- a/web/react/components/post.jsx +++ b/web/react/components/post.jsx @@ -152,7 +152,7 @@ export default class Post extends React.Component { } let currentUserCss = ''; - if (UserStore.getCurrentId() === post.user_id && !post.props.from_webhook) { + if (UserStore.getCurrentId() === post.user_id && !post.props.from_webhook && !utils.isSystemMessage(post)) { currentUserCss = 'current--user'; } -- cgit v1.2.3-1-g7c22