diff options
Diffstat (limited to 'model')
-rw-r--r-- | model/authorization.go | 7 | ||||
-rw-r--r-- | model/channel.go | 41 | ||||
-rw-r--r-- | model/channel_test.go | 21 | ||||
-rw-r--r-- | model/client.go | 10 | ||||
-rw-r--r-- | model/websocket_message.go | 1 |
5 files changed, 79 insertions, 1 deletions
diff --git a/model/authorization.go b/model/authorization.go index ed38bf9b7..a7a6f374d 100644 --- a/model/authorization.go +++ b/model/authorization.go @@ -30,6 +30,7 @@ var PERMISSION_MANAGE_ROLES *Permission var PERMISSION_MANAGE_TEAM_ROLES *Permission var PERMISSION_MANAGE_CHANNEL_ROLES *Permission var PERMISSION_CREATE_DIRECT_CHANNEL *Permission +var PERMISSION_CREATE_GROUP_CHANNEL *Permission var PERMISSION_MANAGE_PUBLIC_CHANNEL_PROPERTIES *Permission var PERMISSION_MANAGE_PRIVATE_CHANNEL_PROPERTIES *Permission var PERMISSION_LIST_TEAM_CHANNELS *Permission @@ -149,6 +150,11 @@ func InitalizePermissions() { "authentication.permissions.create_direct_channel.name", "authentication.permissions.create_direct_channel.description", } + PERMISSION_CREATE_GROUP_CHANNEL = &Permission{ + "create_group_channel", + "authentication.permissions.create_group_channel.name", + "authentication.permissions.create_group_channel.description", + } PERMISSION_MANAGE_PUBLIC_CHANNEL_PROPERTIES = &Permission{ "manage__publicchannel_properties", "authentication.permissions.manage_public_channel_properties.name", @@ -350,6 +356,7 @@ func InitalizeRoles() { "authentication.roles.global_user.description", []string{ PERMISSION_CREATE_DIRECT_CHANNEL.Id, + PERMISSION_CREATE_GROUP_CHANNEL.Id, PERMISSION_PERMANENT_DELETE_USER.Id, PERMISSION_MANAGE_OAUTH.Id, }, diff --git a/model/channel.go b/model/channel.go index c89680194..d24fdb2b4 100644 --- a/model/channel.go +++ b/model/channel.go @@ -4,8 +4,12 @@ package model import ( + "crypto/sha1" + "encoding/hex" "encoding/json" "io" + "sort" + "strings" "unicode/utf8" ) @@ -13,6 +17,9 @@ const ( CHANNEL_OPEN = "O" CHANNEL_PRIVATE = "P" CHANNEL_DIRECT = "D" + CHANNEL_GROUP = "G" + CHANNEL_GROUP_MAX_USERS = 8 + CHANNEL_GROUP_MIN_USERS = 3 DEFAULT_CHANNEL = "town-square" CHANNEL_DISPLAY_NAME_MAX_RUNES = 64 CHANNEL_NAME_MIN_LENGTH = 2 @@ -89,7 +96,7 @@ func (o *Channel) IsValid() *AppError { return NewLocAppError("Channel.IsValid", "model.channel.is_valid.2_or_more.app_error", nil, "id="+o.Id) } - if !(o.Type == CHANNEL_OPEN || o.Type == CHANNEL_PRIVATE || o.Type == CHANNEL_DIRECT) { + if !(o.Type == CHANNEL_OPEN || o.Type == CHANNEL_PRIVATE || o.Type == CHANNEL_DIRECT || o.Type == CHANNEL_GROUP) { return NewLocAppError("Channel.IsValid", "model.channel.is_valid.type.app_error", nil, "id="+o.Id) } @@ -126,6 +133,10 @@ func (o *Channel) ExtraUpdated() { o.ExtraUpdateAt = GetMillis() } +func (o *Channel) IsGroupOrDirect() bool { + return o.Type == CHANNEL_DIRECT || o.Type == CHANNEL_GROUP +} + func GetDMNameFromIds(userId1, userId2 string) string { if userId1 > userId2 { return userId2 + "__" + userId1 @@ -133,3 +144,31 @@ func GetDMNameFromIds(userId1, userId2 string) string { return userId1 + "__" + userId2 } } + +func GetGroupDisplayNameFromUsers(users []*User, truncate bool) string { + usernames := make([]string, len(users)) + for index, user := range users { + usernames[index] = user.Username + } + + sort.Strings(usernames) + + name := strings.Join(usernames, ", ") + + if truncate && len(name) > CHANNEL_NAME_MAX_LENGTH { + name = name[:CHANNEL_NAME_MAX_LENGTH] + } + + return name +} + +func GetGroupNameFromUserIds(userIds []string) string { + sort.Strings(userIds) + + h := sha1.New() + for _, id := range userIds { + io.WriteString(h, id) + } + + return hex.EncodeToString(h.Sum(nil)) +} diff --git a/model/channel_test.go b/model/channel_test.go index af4e3c16d..deb36633c 100644 --- a/model/channel_test.go +++ b/model/channel_test.go @@ -104,3 +104,24 @@ func TestChannelPreUpdate(t *testing.T) { o := Channel{Name: "test"} o.PreUpdate() } + +func TestGetGroupDisplayNameFromUsers(t *testing.T) { + users := make([]*User, 4) + users[0] = &User{Username: NewId()} + users[1] = &User{Username: NewId()} + users[2] = &User{Username: NewId()} + users[3] = &User{Username: NewId()} + + name := GetGroupDisplayNameFromUsers(users, true) + if len(name) > CHANNEL_NAME_MAX_LENGTH { + t.Fatal("name too long") + } +} + +func TestGetGroupNameFromUserIds(t *testing.T) { + name := GetGroupNameFromUserIds([]string{NewId(), NewId(), NewId(), NewId(), NewId()}) + + if len(name) > CHANNEL_NAME_MAX_LENGTH { + t.Fatal("name too long") + } +} diff --git a/model/client.go b/model/client.go index 820386aa4..24ee2c2bf 100644 --- a/model/client.go +++ b/model/client.go @@ -1121,6 +1121,16 @@ func (c *Client) CreateDirectChannel(userId string) (*Result, *AppError) { } } +func (c *Client) CreateGroupChannel(userIds []string) (*Result, *AppError) { + if r, err := c.DoApiPost(c.GetTeamRoute()+"/channels/create_group", ArrayToJson(userIds)); err != nil { + return nil, err + } else { + defer closeBody(r) + return &Result{r.Header.Get(HEADER_REQUEST_ID), + r.Header.Get(HEADER_ETAG_SERVER), ChannelFromJson(r.Body)}, nil + } +} + func (c *Client) UpdateChannel(channel *Channel) (*Result, *AppError) { if r, err := c.DoApiPost(c.GetTeamRoute()+"/channels/update", channel.ToJson()); err != nil { return nil, err diff --git a/model/websocket_message.go b/model/websocket_message.go index 491998ebb..23820470b 100644 --- a/model/websocket_message.go +++ b/model/websocket_message.go @@ -16,6 +16,7 @@ const ( WEBSOCKET_EVENT_CHANNEL_DELETED = "channel_deleted" WEBSOCKET_EVENT_CHANNEL_CREATED = "channel_created" WEBSOCKET_EVENT_DIRECT_ADDED = "direct_added" + WEBSOCKET_EVENT_GROUP_ADDED = "group_added" WEBSOCKET_EVENT_NEW_USER = "new_user" WEBSOCKET_EVENT_LEAVE_TEAM = "leave_team" WEBSOCKET_EVENT_UPDATE_TEAM = "update_team" |