* Show private channels in autocomplete This is supported in all Engines: MySQL, Postgres, Bleve, Elasticsearch. https://mattermost.atlassian.net/browse/MM-18496 ```release-note Private channels will now appear in channel autocomplete. If you are using Bleve or ElasticSearch, you will have to reindex the channels again to populate them with the new attributes. ``` A large chunk of this work has been based on the earlier effort at https://github.com/mattermost/mattermost-server/pull/17804. Full credit goes to https://github.com/arvinDarmawan. * Add comment ```release-note NONE ``` * Adding more tests ```release-note NONE ``` * fix more tests ```release-note NONE ``` * tmp ```release-note NONE ``` * more fixes ```release-note NONE ``` * add tests ```release-note NONE ``` * Add review comments from previous PR ```release-note NONE ``` * Add API to return all channels from all team ```release-note NONE ``` * Added support for bleve and ES ```release-note NONE ``` * Streaming response for GetAllChannels ```release-note NONE ``` * Fix tests ```release-note NONE ``` * Trigger CI ```release-note NONE ``` * fix tests ```release-note NONE ``` * Addressing review comments ```release-note NONE ``` * Fix lint ```release-note NONE ``` * Removing flaky test ```release-note NONE ``` * Address comments ```release-note NONE ``` * Trigger CI ```release-note NONE ``` * Added /users/<userid>/channel_members endpoint ```release-note NONE ``` * Minor edit ```release-note NONE ``` * Improve embedding ```release-note NONE ``` * Fix lint error ```release-note NONE ``` Co-authored-by: Mattermod <mattermod@users.noreply.github.com>
179 строки
6.4 KiB
Go
179 строки
6.4 KiB
Go
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
// See LICENSE.txt for license information.
|
|
|
|
package model
|
|
|
|
import (
|
|
"net/http"
|
|
"strings"
|
|
)
|
|
|
|
const (
|
|
ChannelNotifyDefault = "default"
|
|
ChannelNotifyAll = "all"
|
|
ChannelNotifyMention = "mention"
|
|
ChannelNotifyNone = "none"
|
|
ChannelMarkUnreadAll = "all"
|
|
ChannelMarkUnreadMention = "mention"
|
|
IgnoreChannelMentionsDefault = "default"
|
|
IgnoreChannelMentionsOff = "off"
|
|
IgnoreChannelMentionsOn = "on"
|
|
IgnoreChannelMentionsNotifyProp = "ignore_channel_mentions"
|
|
)
|
|
|
|
type ChannelUnread struct {
|
|
TeamId string `json:"team_id"`
|
|
ChannelId string `json:"channel_id"`
|
|
MsgCount int64 `json:"msg_count"`
|
|
MentionCount int64 `json:"mention_count"`
|
|
MentionCountRoot int64 `json:"mention_count_root"`
|
|
MsgCountRoot int64 `json:"msg_count_root"`
|
|
NotifyProps StringMap `json:"-"`
|
|
}
|
|
|
|
type ChannelUnreadAt struct {
|
|
TeamId string `json:"team_id"`
|
|
UserId string `json:"user_id"`
|
|
ChannelId string `json:"channel_id"`
|
|
MsgCount int64 `json:"msg_count"`
|
|
MentionCount int64 `json:"mention_count"`
|
|
MentionCountRoot int64 `json:"mention_count_root"`
|
|
MsgCountRoot int64 `json:"msg_count_root"`
|
|
LastViewedAt int64 `json:"last_viewed_at"`
|
|
NotifyProps StringMap `json:"-"`
|
|
}
|
|
|
|
type ChannelMember struct {
|
|
ChannelId string `json:"channel_id"`
|
|
UserId string `json:"user_id"`
|
|
Roles string `json:"roles"`
|
|
LastViewedAt int64 `json:"last_viewed_at"`
|
|
MsgCount int64 `json:"msg_count"`
|
|
MentionCount int64 `json:"mention_count"`
|
|
MentionCountRoot int64 `json:"mention_count_root"`
|
|
MsgCountRoot int64 `json:"msg_count_root"`
|
|
NotifyProps StringMap `json:"notify_props"`
|
|
LastUpdateAt int64 `json:"last_update_at"`
|
|
SchemeGuest bool `json:"scheme_guest"`
|
|
SchemeUser bool `json:"scheme_user"`
|
|
SchemeAdmin bool `json:"scheme_admin"`
|
|
ExplicitRoles string `json:"explicit_roles"`
|
|
}
|
|
|
|
// ChannelMemberWithTeamData contains ChannelMember appended with extra team information
|
|
// as well.
|
|
type ChannelMemberWithTeamData struct {
|
|
ChannelMember
|
|
TeamDisplayName string `json:"team_display_name"`
|
|
TeamName string `json:"team_name"`
|
|
TeamUpdateAt int64 `json:"team_update_at"`
|
|
}
|
|
|
|
type ChannelMembers []ChannelMember
|
|
|
|
type ChannelMembersWithTeamData []ChannelMemberWithTeamData
|
|
|
|
type ChannelMemberForExport struct {
|
|
ChannelMember
|
|
ChannelName string
|
|
Username string
|
|
}
|
|
|
|
func (o *ChannelMember) IsValid() *AppError {
|
|
if !IsValidId(o.ChannelId) {
|
|
return NewAppError("ChannelMember.IsValid", "model.channel_member.is_valid.channel_id.app_error", nil, "", http.StatusBadRequest)
|
|
}
|
|
|
|
if !IsValidId(o.UserId) {
|
|
return NewAppError("ChannelMember.IsValid", "model.channel_member.is_valid.user_id.app_error", nil, "", http.StatusBadRequest)
|
|
}
|
|
|
|
notifyLevel := o.NotifyProps[DesktopNotifyProp]
|
|
if len(notifyLevel) > 20 || !IsChannelNotifyLevelValid(notifyLevel) {
|
|
return NewAppError("ChannelMember.IsValid", "model.channel_member.is_valid.notify_level.app_error", nil, "notify_level="+notifyLevel, http.StatusBadRequest)
|
|
}
|
|
|
|
markUnreadLevel := o.NotifyProps[MarkUnreadNotifyProp]
|
|
if len(markUnreadLevel) > 20 || !IsChannelMarkUnreadLevelValid(markUnreadLevel) {
|
|
return NewAppError("ChannelMember.IsValid", "model.channel_member.is_valid.unread_level.app_error", nil, "mark_unread_level="+markUnreadLevel, http.StatusBadRequest)
|
|
}
|
|
|
|
if pushLevel, ok := o.NotifyProps[PushNotifyProp]; ok {
|
|
if len(pushLevel) > 20 || !IsChannelNotifyLevelValid(pushLevel) {
|
|
return NewAppError("ChannelMember.IsValid", "model.channel_member.is_valid.push_level.app_error", nil, "push_notification_level="+pushLevel, http.StatusBadRequest)
|
|
}
|
|
}
|
|
|
|
if sendEmail, ok := o.NotifyProps[EmailNotifyProp]; ok {
|
|
if len(sendEmail) > 20 || !IsSendEmailValid(sendEmail) {
|
|
return NewAppError("ChannelMember.IsValid", "model.channel_member.is_valid.email_value.app_error", nil, "push_notification_level="+sendEmail, http.StatusBadRequest)
|
|
}
|
|
}
|
|
|
|
if ignoreChannelMentions, ok := o.NotifyProps[IgnoreChannelMentionsNotifyProp]; ok {
|
|
if len(ignoreChannelMentions) > 40 || !IsIgnoreChannelMentionsValid(ignoreChannelMentions) {
|
|
return NewAppError("ChannelMember.IsValid", "model.channel_member.is_valid.ignore_channel_mentions_value.app_error", nil, "ignore_channel_mentions="+ignoreChannelMentions, http.StatusBadRequest)
|
|
}
|
|
}
|
|
|
|
if len(o.Roles) > UserRolesMaxLength {
|
|
return NewAppError("ChannelMember.IsValid", "model.channel_member.is_valid.roles_limit.app_error",
|
|
map[string]interface{}{"Limit": UserRolesMaxLength}, "", http.StatusBadRequest)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (o *ChannelMember) PreSave() {
|
|
o.LastUpdateAt = GetMillis()
|
|
}
|
|
|
|
func (o *ChannelMember) PreUpdate() {
|
|
o.LastUpdateAt = GetMillis()
|
|
}
|
|
|
|
func (o *ChannelMember) GetRoles() []string {
|
|
return strings.Fields(o.Roles)
|
|
}
|
|
|
|
func (o *ChannelMember) SetChannelMuted(muted bool) {
|
|
if o.IsChannelMuted() {
|
|
o.NotifyProps[MarkUnreadNotifyProp] = ChannelMarkUnreadAll
|
|
} else {
|
|
o.NotifyProps[MarkUnreadNotifyProp] = ChannelMarkUnreadMention
|
|
}
|
|
}
|
|
|
|
func (o *ChannelMember) IsChannelMuted() bool {
|
|
return o.NotifyProps[MarkUnreadNotifyProp] == ChannelMarkUnreadMention
|
|
}
|
|
|
|
func IsChannelNotifyLevelValid(notifyLevel string) bool {
|
|
return notifyLevel == ChannelNotifyDefault ||
|
|
notifyLevel == ChannelNotifyAll ||
|
|
notifyLevel == ChannelNotifyMention ||
|
|
notifyLevel == ChannelNotifyNone
|
|
}
|
|
|
|
func IsChannelMarkUnreadLevelValid(markUnreadLevel string) bool {
|
|
return markUnreadLevel == ChannelMarkUnreadAll || markUnreadLevel == ChannelMarkUnreadMention
|
|
}
|
|
|
|
func IsSendEmailValid(sendEmail string) bool {
|
|
return sendEmail == ChannelNotifyDefault || sendEmail == "true" || sendEmail == "false"
|
|
}
|
|
|
|
func IsIgnoreChannelMentionsValid(ignoreChannelMentions string) bool {
|
|
return ignoreChannelMentions == IgnoreChannelMentionsOn || ignoreChannelMentions == IgnoreChannelMentionsOff || ignoreChannelMentions == IgnoreChannelMentionsDefault
|
|
}
|
|
|
|
func GetDefaultChannelNotifyProps() StringMap {
|
|
return StringMap{
|
|
DesktopNotifyProp: ChannelNotifyDefault,
|
|
MarkUnreadNotifyProp: ChannelMarkUnreadAll,
|
|
PushNotifyProp: ChannelNotifyDefault,
|
|
EmailNotifyProp: ChannelNotifyDefault,
|
|
IgnoreChannelMentionsNotifyProp: IgnoreChannelMentionsDefault,
|
|
}
|
|
}
|