Move some variables out of model (#17909)
* Move some variables out of model There were some stuff that's not necessary to be in model and can just remain unexported variables. ```release-note NONE ``` * Add license ```release-note NONE ```
Этот коммит содержится в:
коммит произвёл
Claudio Costa
родитель
97ccf0bdf6
Коммит
f49b5dc440
@@ -10,6 +10,7 @@ import (
|
|||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"unicode"
|
"unicode"
|
||||||
@@ -23,8 +24,11 @@ import (
|
|||||||
|
|
||||||
const (
|
const (
|
||||||
CmdCustomStatusTrigger = "status"
|
CmdCustomStatusTrigger = "status"
|
||||||
|
usernameSpecialChars = ".-_"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var atMentionRegexp = regexp.MustCompile(`\B@[[:alnum:]][[:alnum:]\.\-_:]*`)
|
||||||
|
|
||||||
type CommandProvider interface {
|
type CommandProvider interface {
|
||||||
GetTrigger() string
|
GetTrigger() string
|
||||||
GetCommand(a *App, T i18n.TranslateFunc) *model.Command
|
GetCommand(a *App, T i18n.TranslateFunc) *model.Command
|
||||||
@@ -233,7 +237,7 @@ func (a *App) MentionsToTeamMembers(message, teamID string) model.UserMentionMap
|
|||||||
Id string
|
Id string
|
||||||
}
|
}
|
||||||
|
|
||||||
possibleMentions := model.PossibleAtMentions(message)
|
possibleMentions := possibleAtMentions(message)
|
||||||
mentionChan := make(chan *mentionMapItem, len(possibleMentions))
|
mentionChan := make(chan *mentionMapItem, len(possibleMentions))
|
||||||
|
|
||||||
var wg sync.WaitGroup
|
var wg sync.WaitGroup
|
||||||
@@ -252,8 +256,8 @@ func (a *App) MentionsToTeamMembers(message, teamID string) model.UserMentionMap
|
|||||||
// If it's a http.StatusNotFound error, check for usernames in substrings
|
// If it's a http.StatusNotFound error, check for usernames in substrings
|
||||||
// without trailing punctuation
|
// without trailing punctuation
|
||||||
if nErr != nil {
|
if nErr != nil {
|
||||||
trimmed, ok := model.TrimUsernameSpecialChar(mention)
|
trimmed, ok := trimUsernameSpecialChar(mention)
|
||||||
for ; ok; trimmed, ok = model.TrimUsernameSpecialChar(trimmed) {
|
for ; ok; trimmed, ok = trimUsernameSpecialChar(trimmed) {
|
||||||
userFromTrimmed, nErr := a.Srv().Store.User().GetByUsername(trimmed)
|
userFromTrimmed, nErr := a.Srv().Store.User().GetByUsername(trimmed)
|
||||||
if nErr != nil && !errors.As(nErr, &nfErr) {
|
if nErr != nil && !errors.As(nErr, &nfErr) {
|
||||||
return
|
return
|
||||||
@@ -770,3 +774,37 @@ func (a *App) DeleteCommand(commandID string) *model.AppError {
|
|||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// possibleAtMentions returns all substrings in message that look like valid @
|
||||||
|
// mentions.
|
||||||
|
func possibleAtMentions(message string) []string {
|
||||||
|
var names []string
|
||||||
|
|
||||||
|
if !strings.Contains(message, "@") {
|
||||||
|
return names
|
||||||
|
}
|
||||||
|
|
||||||
|
alreadyMentioned := make(map[string]bool)
|
||||||
|
for _, match := range atMentionRegexp.FindAllString(message, -1) {
|
||||||
|
name := model.NormalizeUsername(match[1:])
|
||||||
|
if !alreadyMentioned[name] && model.IsValidUsernameAllowRemote(name) {
|
||||||
|
names = append(names, name)
|
||||||
|
alreadyMentioned[name] = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return names
|
||||||
|
}
|
||||||
|
|
||||||
|
// trimUsernameSpecialChar tries to remove the last character from word if it
|
||||||
|
// is a special character for usernames (dot, dash or underscore). If not, it
|
||||||
|
// returns the same string.
|
||||||
|
func trimUsernameSpecialChar(word string) (string, bool) {
|
||||||
|
len := len(word)
|
||||||
|
|
||||||
|
if len > 0 && strings.LastIndexAny(word, usernameSpecialChars) == (len-1) {
|
||||||
|
return word[:len-1], true
|
||||||
|
}
|
||||||
|
|
||||||
|
return word, false
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
||||||
// See LICENSE.txt for license information.
|
// See LICENSE.txt for license information.
|
||||||
|
|
||||||
package model
|
package app
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
@@ -49,7 +49,7 @@ func TestPossibleAtMentions(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for _, data := range fixture {
|
for _, data := range fixture {
|
||||||
actual := PossibleAtMentions(data.message)
|
actual := possibleAtMentions(data.message)
|
||||||
require.ElementsMatch(t, actual, data.expected)
|
require.ElementsMatch(t, actual, data.expected)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -73,7 +73,7 @@ func TestTrimUsernameSpecialChar(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for _, data := range fixture {
|
for _, data := range fixture {
|
||||||
actualString, actualBool := TrimUsernameSpecialChar(data.word)
|
actualString, actualBool := trimUsernameSpecialChar(data.word)
|
||||||
require.Equal(t, actualBool, data.expectedBool)
|
require.Equal(t, actualBool, data.expectedBool)
|
||||||
if actualBool {
|
if actualBool {
|
||||||
require.Equal(t, actualString, data.expectedString)
|
require.Equal(t, actualString, data.expectedString)
|
||||||
@@ -9,6 +9,7 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
@@ -29,6 +30,8 @@ const (
|
|||||||
PageDefault = 0
|
PageDefault = 0
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var atMentionPattern = regexp.MustCompile(`\B@`)
|
||||||
|
|
||||||
func (a *App) CreatePostAsUser(c *request.Context, post *model.Post, currentSessionId string, setOnline bool) (*model.Post, *model.AppError) {
|
func (a *App) CreatePostAsUser(c *request.Context, post *model.Post, currentSessionId string, setOnline bool) (*model.Post, *model.AppError) {
|
||||||
// Check that channel has not been deleted
|
// Check that channel has not been deleted
|
||||||
channel, errCh := a.Srv().Store.Channel().Get(post.ChannelId, true)
|
channel, errCh := a.Srv().Store.Channel().Get(post.ChannelId, true)
|
||||||
@@ -442,7 +445,7 @@ func (a *App) FillInPostProps(post *model.Post, channel *model.Channel) *model.A
|
|||||||
post.DelProp("channel_mentions")
|
post.DelProp("channel_mentions")
|
||||||
}
|
}
|
||||||
|
|
||||||
matched := model.AtMentionPattern.MatchString(post.Message)
|
matched := atMentionPattern.MatchString(post.Message)
|
||||||
if a.Srv().License() != nil && *a.Srv().License().Features.LDAPGroups && matched && !a.HasPermissionToChannel(post.UserId, post.ChannelId, model.PermissionUseGroupMentions) {
|
if a.Srv().License() != nil && *a.Srv().License().Features.LDAPGroups && matched && !a.HasPermissionToChannel(post.UserId, post.ChannelId, model.PermissionUseGroupMentions) {
|
||||||
post.AddProp(model.PostPropsGroupHighlightDisabled, true)
|
post.AddProp(model.PostPropsGroupHighlightDisabled, true)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,47 +0,0 @@
|
|||||||
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
||||||
// See LICENSE.txt for license information.
|
|
||||||
|
|
||||||
package model
|
|
||||||
|
|
||||||
import (
|
|
||||||
"regexp"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
var atMentionRegexp = regexp.MustCompile(`\B@[[:alnum:]][[:alnum:]\.\-_:]*`)
|
|
||||||
|
|
||||||
const usernameSpecialChars = ".-_"
|
|
||||||
|
|
||||||
// PossibleAtMentions returns all substrings in message that look like valid @
|
|
||||||
// mentions.
|
|
||||||
func PossibleAtMentions(message string) []string {
|
|
||||||
var names []string
|
|
||||||
|
|
||||||
if !strings.Contains(message, "@") {
|
|
||||||
return names
|
|
||||||
}
|
|
||||||
|
|
||||||
alreadyMentioned := make(map[string]bool)
|
|
||||||
for _, match := range atMentionRegexp.FindAllString(message, -1) {
|
|
||||||
name := NormalizeUsername(match[1:])
|
|
||||||
if !alreadyMentioned[name] && IsValidUsernameAllowRemote(name) {
|
|
||||||
names = append(names, name)
|
|
||||||
alreadyMentioned[name] = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return names
|
|
||||||
}
|
|
||||||
|
|
||||||
// TrimUsernameSpecialChar tries to remove the last character from word if it
|
|
||||||
// is a special character for usernames (dot, dash or underscore). If not, it
|
|
||||||
// returns the same string.
|
|
||||||
func TrimUsernameSpecialChar(word string) (string, bool) {
|
|
||||||
len := len(word)
|
|
||||||
|
|
||||||
if len > 0 && strings.LastIndexAny(word, usernameSpecialChars) == (len-1) {
|
|
||||||
return word[:len-1], true
|
|
||||||
}
|
|
||||||
|
|
||||||
return word, false
|
|
||||||
}
|
|
||||||
@@ -18,8 +18,6 @@ const (
|
|||||||
|
|
||||||
var EmojiPattern = regexp.MustCompile(`:[a-zA-Z0-9_+-]+:`)
|
var EmojiPattern = regexp.MustCompile(`:[a-zA-Z0-9_+-]+:`)
|
||||||
|
|
||||||
var ReverseSystemEmojisMap = makeReverseEmojiMap()
|
|
||||||
|
|
||||||
type Emoji struct {
|
type Emoji struct {
|
||||||
Id string `json:"id"`
|
Id string `json:"id"`
|
||||||
CreateAt int64 `json:"create_at"`
|
CreateAt int64 `json:"create_at"`
|
||||||
@@ -51,8 +49,10 @@ func makeReverseEmojiMap() map[string][]string {
|
|||||||
return reverseEmojiMap
|
return reverseEmojiMap
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var reverseSystemEmojisMap = makeReverseEmojiMap()
|
||||||
|
|
||||||
func GetEmojiNameFromUnicode(unicode string) (emojiName string, count int) {
|
func GetEmojiNameFromUnicode(unicode string) (emojiName string, count int) {
|
||||||
if emojiNames, found := ReverseSystemEmojisMap[unicode]; found {
|
if emojiNames, found := reverseSystemEmojisMap[unicode]; found {
|
||||||
return emojiNames[0], len(emojiNames)
|
return emojiNames[0], len(emojiNames)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -69,8 +69,6 @@ const (
|
|||||||
PostPropsGroupHighlightDisabled = "disable_group_highlight"
|
PostPropsGroupHighlightDisabled = "disable_group_highlight"
|
||||||
)
|
)
|
||||||
|
|
||||||
var AtMentionPattern = regexp.MustCompile(`\B@`)
|
|
||||||
|
|
||||||
type Post struct {
|
type Post struct {
|
||||||
Id string `json:"id"`
|
Id string `json:"id"`
|
||||||
CreateAt int64 `json:"create_at"`
|
CreateAt int64 `json:"create_at"`
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user