From ab6ef954b4acbd30ba87c2a7680e7843b946adca Mon Sep 17 00:00:00 2001 From: Tsilavina Razafinirina Date: Mon, 20 Nov 2017 18:15:33 +0300 Subject: PLT-6217 Fixes system message posted to Town Square when a member leaves a team (#7752) * Fixes system message posted to Town Square when adding/removing team member (#6483) Fixes unit test method call to match RemoveUserFromTeam modification (#6483) Fixes system message posted to Town Square when adding/removing team member (#6483) Removes unnessary error message * Updates system message when a user leaves a team (#6483) * Changes system message when a user is removed from team (#6483) * Adds a new string to be post to town-square when a member is added to a team (#6483) --- api/team.go | 2 +- api4/team.go | 2 +- api4/team_test.go | 4 ++-- app/channel.go | 24 ++++++++++++++++++++++-- app/team.go | 41 ++++++++++++++++++++++++++++++++++++++--- cmd/platform/team.go | 2 +- i18n/en.json | 12 ++++++++++++ model/post.go | 6 ++++-- 8 files changed, 81 insertions(+), 12 deletions(-) diff --git a/api/team.go b/api/team.go index 089680624..dc9f3a33d 100644 --- a/api/team.go +++ b/api/team.go @@ -179,7 +179,7 @@ func removeUserFromTeam(c *Context, w http.ResponseWriter, r *http.Request) { } } - if err := c.App.RemoveUserFromTeam(c.TeamId, userId); err != nil { + if err := c.App.RemoveUserFromTeam(c.TeamId, userId, c.Session.UserId); err != nil { c.Err = err return } diff --git a/api4/team.go b/api4/team.go index fe5d7a266..858579b4a 100644 --- a/api4/team.go +++ b/api4/team.go @@ -458,7 +458,7 @@ func removeTeamMember(c *Context, w http.ResponseWriter, r *http.Request) { } } - if err := c.App.RemoveUserFromTeam(c.Params.TeamId, c.Params.UserId); err != nil { + if err := c.App.RemoveUserFromTeam(c.Params.TeamId, c.Params.UserId, c.Session.UserId); err != nil { c.Err = err return } diff --git a/api4/team_test.go b/api4/team_test.go index da2f42369..91dc059da 100644 --- a/api4/team_test.go +++ b/api4/team_test.go @@ -1238,7 +1238,7 @@ func TestAddTeamMember(t *testing.T) { team := th.BasicTeam otherUser := th.CreateUser() - if err := th.App.RemoveUserFromTeam(th.BasicTeam.Id, th.BasicUser2.Id); err != nil { + if err := th.App.RemoveUserFromTeam(th.BasicTeam.Id, th.BasicUser2.Id, ""); err != nil { t.Fatalf(err.Error()) } @@ -1454,7 +1454,7 @@ func TestAddTeamMembers(t *testing.T) { otherUser.Id, } - if err := th.App.RemoveUserFromTeam(th.BasicTeam.Id, th.BasicUser2.Id); err != nil { + if err := th.App.RemoveUserFromTeam(th.BasicTeam.Id, th.BasicUser2.Id, ""); err != nil { t.Fatalf(err.Error()) } diff --git a/app/channel.go b/app/channel.go index de60fbae3..ea58795ea 100644 --- a/app/channel.go +++ b/app/channel.go @@ -61,7 +61,7 @@ func (a *App) JoinDefaultChannels(teamId string, user *model.User, channelRole s l4g.Error(utils.T("api.channel.post_user_add_remove_message_and_forget.error"), err) } } else { - if err := a.PostAddToChannelMessage(requestor, user, townSquare, ""); err != nil { + if err := a.PostAddToTeamMessage(requestor, user, townSquare, ""); err != nil { l4g.Error(utils.T("api.channel.post_user_add_remove_message_and_forget.error"), err) } } @@ -1006,10 +1006,30 @@ func (a *App) PostAddToChannelMessage(user *model.User, addedUser *model.User, c return nil } +func (a *App) PostAddToTeamMessage(user *model.User, addedUser *model.User, channel *model.Channel, postRootId string) *model.AppError { + post := &model.Post{ + ChannelId: channel.Id, + Message: fmt.Sprintf(utils.T("api.team.add_user_to_team.added"), addedUser.Username, user.Username), + Type: model.POST_ADD_TO_TEAM, + UserId: user.Id, + RootId: postRootId, + Props: model.StringInterface{ + "username": user.Username, + "addedUsername": addedUser.Username, + }, + } + + if _, err := a.CreatePost(post, channel, false); err != nil { + return model.NewAppError("postAddToTeamMessage", "api.channel.post_user_add_remove_message_and_forget.error", nil, err.Error(), http.StatusInternalServerError) + } + + return nil +} + func (a *App) PostRemoveFromChannelMessage(removerUserId string, removedUser *model.User, channel *model.Channel) *model.AppError { post := &model.Post{ ChannelId: channel.Id, - Message: fmt.Sprintf(utils.T("api.channel.remove_member.removed"), removedUser.Username), + Message: fmt.Sprintf(utils.T("api.team.remove_user_from_team.removed"), removedUser.Username), Type: model.POST_REMOVE_FROM_CHANNEL, UserId: removerUserId, Props: model.StringInterface{ diff --git a/app/team.go b/app/team.go index 7b267f32a..c2d06513e 100644 --- a/app/team.go +++ b/app/team.go @@ -554,7 +554,7 @@ func (a *App) GetTeamUnread(teamId, userId string) (*model.TeamUnread, *model.Ap return teamUnread, nil } -func (a *App) RemoveUserFromTeam(teamId string, userId string) *model.AppError { +func (a *App) RemoveUserFromTeam(teamId string, userId string, requestorId string) *model.AppError { tchan := a.Srv.Store.Team().Get(teamId) uchan := a.Srv.Store.User().Get(userId) @@ -572,14 +572,14 @@ func (a *App) RemoveUserFromTeam(teamId string, userId string) *model.AppError { user = result.Data.(*model.User) } - if err := a.LeaveTeam(team, user); err != nil { + if err := a.LeaveTeam(team, user, requestorId); err != nil { return err } return nil } -func (a *App) LeaveTeam(team *model.Team, user *model.User) *model.AppError { +func (a *App) LeaveTeam(team *model.Team, user *model.User, requestorId string) *model.AppError { var teamMember *model.TeamMember var err *model.AppError @@ -609,6 +609,23 @@ func (a *App) LeaveTeam(team *model.Team, user *model.User) *model.AppError { } } + var channel *model.Channel + if result := <-a.Srv.Store.Channel().GetByName(team.Id, model.DEFAULT_CHANNEL, false); result.Err != nil { + return result.Err + } else { + channel = result.Data.(*model.Channel) + } + + if requestorId == user.Id { + if err := a.postLeaveTeamMessage(user, channel); err != nil { + l4g.Error(utils.T("api.channel.post_user_add_remove_message_and_forget.error"), err) + } + } else { + if err := a.PostRemoveFromChannelMessage(user.Id, user, channel); err != nil { + l4g.Error(utils.T("api.channel.post_user_add_remove_message_and_forget.error"), err) + } + } + // Send the websocket message before we actually do the remove so the user being removed gets it. message := model.NewWebSocketEvent(model.WEBSOCKET_EVENT_LEAVE_TEAM, team.Id, "", "", nil) message.Add("user_id", user.Id) @@ -637,6 +654,24 @@ func (a *App) LeaveTeam(team *model.Team, user *model.User) *model.AppError { return nil } +func (a *App) postLeaveTeamMessage(user *model.User, channel *model.Channel) *model.AppError { + post := &model.Post{ + ChannelId: channel.Id, + Message: fmt.Sprintf(utils.T("api.team.leave.left"), user.Username), + Type: model.POST_LEAVE_TEAM, + UserId: user.Id, + Props: model.StringInterface{ + "username": user.Username, + }, + } + + if _, err := a.CreatePost(post, channel, false); err != nil { + return model.NewAppError("postRemoveFromChannelMessage", "api.channel.post_user_add_remove_message_and_forget.error", nil, err.Error(), http.StatusInternalServerError) + } + + return nil +} + func (a *App) InviteNewUsersToTeam(emailList []string, teamId, senderId string) *model.AppError { if len(emailList) == 0 { err := model.NewAppError("InviteNewUsersToTeam", "api.team.invite_members.no_one.app_error", nil, "", http.StatusBadRequest) diff --git a/cmd/platform/team.go b/cmd/platform/team.go index f35a97c82..1cb5bd99e 100644 --- a/cmd/platform/team.go +++ b/cmd/platform/team.go @@ -130,7 +130,7 @@ func removeUserFromTeam(a *app.App, team *model.Team, user *model.User, userArg CommandPrintErrorln("Can't find user '" + userArg + "'") return } - if err := a.LeaveTeam(team, user); err != nil { + if err := a.LeaveTeam(team, user, ""); err != nil { CommandPrintErrorln("Unable to remove '" + userArg + "' from " + team.Name + ". Error: " + err.Error()) } } diff --git a/i18n/en.json b/i18n/en.json index 9ef50217d..8ca4c5deb 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -2166,6 +2166,10 @@ "id": "api.system.go_routines", "translation": "The number of running goroutines is over the health threshold %v of %v" }, + { + "id": "api.team.add_user_to_team.added", + "translation": "%v added to the team by %v" + }, { "id": "api.team.add_user_to_team.missing_parameter.app_error", "translation": "Parameter required to add user to team." @@ -2274,6 +2278,10 @@ "id": "api.team.is_team_creation_allowed.disabled.app_error", "translation": "Team creation has been disabled. Please ask your systems administrator for details." }, + { + "id": "api.team.leave.left", + "translation": "%v left the team." + }, { "id": "api.team.is_team_creation_allowed.domain.app_error", "translation": "Email must be from a specific domain (e.g. @example.com). Please ask your systems administrator for details." @@ -2286,6 +2294,10 @@ "id": "api.team.permanent_delete_team.deleted.warn", "translation": "Permanently deleted team %v id=%v" }, + { + "id": "api.team.remove_user_from_team.removed", + "translation": "%v was removed from the team." + }, { "id": "api.team.remove_user_from_team.missing.app_error", "translation": "The user does not appear to be part of this team." diff --git a/model/post.go b/model/post.go index a7be63432..8e4689eb7 100644 --- a/model/post.go +++ b/model/post.go @@ -19,8 +19,10 @@ const ( POST_JOIN_LEAVE = "system_join_leave" // Deprecated, use POST_JOIN_CHANNEL or POST_LEAVE_CHANNEL instead POST_JOIN_CHANNEL = "system_join_channel" POST_LEAVE_CHANNEL = "system_leave_channel" + POST_LEAVE_TEAM = "system_leave_team" POST_ADD_REMOVE = "system_add_remove" // Deprecated, use POST_ADD_TO_CHANNEL or POST_REMOVE_FROM_CHANNEL instead POST_ADD_TO_CHANNEL = "system_add_to_channel" + POST_ADD_TO_TEAM = "system_add_to_team" POST_REMOVE_FROM_CHANNEL = "system_remove_from_channel" POST_HEADER_CHANGE = "system_header_change" POST_DISPLAYNAME_CHANGE = "system_displayname_change" @@ -167,8 +169,8 @@ func (o *Post) IsValid() *AppError { } if !(o.Type == POST_DEFAULT || o.Type == POST_JOIN_LEAVE || o.Type == POST_ADD_REMOVE || - o.Type == POST_JOIN_CHANNEL || o.Type == POST_LEAVE_CHANNEL || - o.Type == POST_REMOVE_FROM_CHANNEL || o.Type == POST_ADD_TO_CHANNEL || + o.Type == POST_JOIN_CHANNEL || o.Type == POST_LEAVE_CHANNEL || o.Type == POST_LEAVE_TEAM || + o.Type == POST_REMOVE_FROM_CHANNEL || o.Type == POST_ADD_TO_CHANNEL || o.Type == POST_ADD_TO_TEAM || o.Type == POST_SLACK_ATTACHMENT || o.Type == POST_HEADER_CHANGE || o.Type == POST_PURPOSE_CHANGE || o.Type == POST_DISPLAYNAME_CHANGE || o.Type == POST_CHANNEL_DELETED || strings.HasPrefix(o.Type, POST_CUSTOM_TYPE_PREFIX)) { -- cgit v1.2.3-1-g7c22