summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--api/team.go2
-rw-r--r--api4/team.go2
-rw-r--r--api4/team_test.go4
-rw-r--r--app/channel.go24
-rw-r--r--app/team.go41
-rw-r--r--cmd/platform/team.go2
-rw-r--r--i18n/en.json12
-rw-r--r--model/post.go6
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
@@ -2167,6 +2167,10 @@
"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."
},
@@ -2275,6 +2279,10 @@
"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."
},
@@ -2287,6 +2295,10 @@
"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)) {