diff options
author | S4KH <kh.syerikjan@gmail.com> | 2016-10-21 20:36:13 +0800 |
---|---|---|
committer | Christopher Speller <crspeller@gmail.com> | 2016-10-21 08:36:13 -0400 |
commit | 234958e0076655efd8a58ea4502edce3226418ed (patch) | |
tree | 568c2e2f06a6921414e2cded9cb682651768aee8 | |
parent | d13ba8c55c981978f3b962c6991f478b36bf8a8b (diff) | |
download | chat-234958e0076655efd8a58ea4502edce3226418ed.tar.gz chat-234958e0076655efd8a58ea4502edce3226418ed.tar.bz2 chat-234958e0076655efd8a58ea4502edce3226418ed.zip |
HW 4139: Make channel limits configurable in the System Console (#4154)
* Auto Changes
* 4139 Made channel limits configurable in the System Console as described in the issue
* Removed error message entries from other locales, made maxChannelsPerteam type to pointer
* Added * symbol to maxChannelsPerTeam inside isValid function
* Update team_test.go
* Restored to old test
* Checked maximum number channels per team when creating channel
* Fixed code to pass api/channel_test.go
* Reverted changes on config except MaxChannelsPerTeam
* Update channel.go
* Ran gofmt -w .
* Reverted vendor directoy
-rw-r--r-- | api/channel.go | 15 | ||||
-rw-r--r-- | config/config.json | 3 | ||||
-rw-r--r-- | i18n/en.json | 8 | ||||
-rw-r--r-- | model/config.go | 10 | ||||
-rw-r--r-- | webapp/components/admin_console/users_and_teams_settings.jsx | 22 | ||||
-rw-r--r-- | webapp/i18n/en.json | 3 | ||||
-rw-r--r-- | webapp/utils/constants.jsx | 1 |
7 files changed, 60 insertions, 2 deletions
diff --git a/api/channel.go b/api/channel.go index 9cc8976c2..bae2a5277 100644 --- a/api/channel.go +++ b/api/channel.go @@ -73,6 +73,21 @@ func createChannel(c *Context, w http.ResponseWriter, r *http.Request) { return } + if channel.TeamId == c.TeamId { + + // Get total number of channels on current team + if result := <-Srv.Store.Channel().GetChannels(channel.TeamId, c.Session.UserId); result.Err != nil { + c.Err = model.NewLocAppError("createChannel", "api.channel.get_channels.error", nil, result.Err.Message) + return + } else { + data := result.Data.(*model.ChannelList) + if int64(len(data.Channels)+1) > *utils.Cfg.TeamSettings.MaxChannelsPerTeam { + c.Err = model.NewLocAppError("createChannel", "api.channel.create_channel.max_channel_limit.app_error", map[string]interface{}{"MaxChannelsPerTeam": *utils.Cfg.TeamSettings.MaxChannelsPerTeam}, "") + return + } + } + } + channel.CreatorId = c.Session.UserId if sc, err := CreateChannel(c, channel, true); err != nil { diff --git a/config/config.json b/config/config.json index bbdb8d160..02e300897 100644 --- a/config/config.json +++ b/config/config.json @@ -51,7 +51,8 @@ "RestrictTeamInvite": "all", "RestrictPublicChannelManagement": "all", "RestrictPrivateChannelManagement": "all", - "UserStatusAwayTimeout": 300 + "UserStatusAwayTimeout": 300, + "MaxChannelsPerTeam": 2000 }, "SqlSettings": { "DriverName": "mysql", diff --git a/i18n/en.json b/i18n/en.json index 5d27af7f1..de4fda4b6 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -204,6 +204,10 @@ "translation": "Invalid character '__' in channel name for non-direct channel" }, { + "id": "api.channel.create_channel.max_channel_limit.app_error", + "translation": "Cannot create more than {{.MaxChannelsPerTeam}} channels for current team" + }, + { "id": "api.channel.create_default_channels.off_topic", "translation": "Off-Topic" }, @@ -3272,6 +3276,10 @@ "translation": "Invalid maximum users per team for team settings. Must be a positive number." }, { + "id": "model.config.is_valid.max_channels.app_error", + "translation": "Invalid maximum channels per team for team settings. Must be a positive number." + }, + { "id": "model.config.is_valid.password_length.app_error", "translation": "Minimum password length must be a whole number greater than or equal to {{.MinLength}} and less than or equal to {{.MaxLength}}." }, diff --git a/model/config.go b/model/config.go index 8d49434f6..09bf11a71 100644 --- a/model/config.go +++ b/model/config.go @@ -223,6 +223,7 @@ type TeamSettings struct { RestrictPublicChannelManagement *string RestrictPrivateChannelManagement *string UserStatusAwayTimeout *int64 + MaxChannelsPerTeam *int64 } type LdapSettings struct { @@ -502,6 +503,11 @@ func (o *Config) SetDefaults() { *o.TeamSettings.UserStatusAwayTimeout = 300 } + if o.TeamSettings.MaxChannelsPerTeam == nil { + o.TeamSettings.MaxChannelsPerTeam = new(int64) + *o.TeamSettings.MaxChannelsPerTeam = 2000 + } + if o.EmailSettings.EnableSignInWithEmail == nil { o.EmailSettings.EnableSignInWithEmail = new(bool) @@ -984,6 +990,10 @@ func (o *Config) IsValid() *AppError { return NewLocAppError("Config.IsValid", "model.config.is_valid.max_users.app_error", nil, "") } + if *o.TeamSettings.MaxChannelsPerTeam <= 0 { + return NewLocAppError("Config.IsValid", "model.config.is_valid.max_channels.app_error", nil, "") + } + if !(*o.TeamSettings.RestrictDirectMessage == DIRECT_MESSAGE_ANY || *o.TeamSettings.RestrictDirectMessage == DIRECT_MESSAGE_TEAM) { return NewLocAppError("Config.IsValid", "model.config.is_valid.restrict_direct_message.app_error", nil, "") } diff --git a/webapp/components/admin_console/users_and_teams_settings.jsx b/webapp/components/admin_console/users_and_teams_settings.jsx index b20b66541..60ee70264 100644 --- a/webapp/components/admin_console/users_and_teams_settings.jsx +++ b/webapp/components/admin_console/users_and_teams_settings.jsx @@ -32,6 +32,7 @@ export default class UsersAndTeamsSettings extends AdminSettings { config.TeamSettings.RestrictCreationToDomains = this.state.restrictCreationToDomains; config.TeamSettings.RestrictTeamNames = this.state.restrictTeamNames; config.TeamSettings.RestrictDirectMessage = this.state.restrictDirectMessage; + config.TeamSettings.MaxChannelsPerTeam = this.parseIntNonZero(this.state.maxChannelsPerTeam, Constants.DEFAULT_MAX_CHANNELS_PER_TEAM); return config; } @@ -43,7 +44,8 @@ export default class UsersAndTeamsSettings extends AdminSettings { maxUsersPerTeam: config.TeamSettings.MaxUsersPerTeam, restrictCreationToDomains: config.TeamSettings.RestrictCreationToDomains, restrictTeamNames: config.TeamSettings.RestrictTeamNames, - restrictDirectMessage: config.TeamSettings.RestrictDirectMessage + restrictDirectMessage: config.TeamSettings.RestrictDirectMessage, + maxChannelsPerTeam: config.TeamSettings.MaxChannelsPerTeam }; } @@ -114,6 +116,24 @@ export default class UsersAndTeamsSettings extends AdminSettings { onChange={this.handleChange} /> <TextSetting + id='maxChannelsPerTeam' + label={ + <FormattedMessage + id='admin.team.maxChannelsTitle' + defaultMessage='Max Channels Per Team:' + /> + } + placeholder={Utils.localizeMessage('admin.team.maxChannelsExample', 'Ex "100"')} + helpText={ + <FormattedMessage + id='admin.team.maxChannelsDescription' + defaultMessage='Maximum total number of channels per team, including both active and deleted channels.' + /> + } + value={this.state.maxChannelsPerTeam} + onChange={this.handleChange} + /> + <TextSetting id='restrictCreationToDomains' label={ <FormattedMessage diff --git a/webapp/i18n/en.json b/webapp/i18n/en.json index ae7d7d201..4e83c3264 100644 --- a/webapp/i18n/en.json +++ b/webapp/i18n/en.json @@ -780,6 +780,9 @@ "admin.team.maxUsersDescription": "Maximum total number of users per team, including both active and inactive users.", "admin.team.maxUsersExample": "E.g.: \"25\"", "admin.team.maxUsersTitle": "Max Users Per Team:", + "admin.team.maxChannelsDescription": "Maximum total number of channels per team, including both active and deleted channels.", + "admin.team.maxChannelsExample": "Ex \"100\"", + "admin.team.maxChannelsTitle": "Max Channels Per Team:", "admin.team.noBrandImage": "No brand image uploaded", "admin.team.openServerDescription": "When true, anyone can signup for a user account on this server without the need to be invited.", "admin.team.openServerTitle": "Enable Open Server: ", diff --git a/webapp/utils/constants.jsx b/webapp/utils/constants.jsx index 83d64358c..efc0d8482 100644 --- a/webapp/utils/constants.jsx +++ b/webapp/utils/constants.jsx @@ -818,6 +818,7 @@ export const Constants = { WEBRTC_TIME_DELAY: 750, WEBRTC_CLEAR_ERROR_DELAY: 15000, DEFAULT_MAX_USERS_PER_TEAM: 50, + DEFAULT_MAX_CHANNELS_PER_TEAM: 2000, MIN_TEAMNAME_LENGTH: 4, MAX_TEAMNAME_LENGTH: 15, MIN_USERNAME_LENGTH: 3, |