MM-46410: adds urgency on mention counts (#20999)
* MM-46410: adds urgency on mention counts We have introduced priority for posts in https://github.com/mattermost/mattermost-webapp/pull/10951. We do need to color the mention badges in the webapp with a prominent color when a mention is posted in an urgent message. A thread has urgent mentions if the root post is marked as urgent, and the replies contain mentions to the user viewing the thread. This PR adds a column, urgentmentioncount, in channelmembers. Furthermore when asking for team/thread mention counts, we also return urgent mention counts for the user. Adds a new table to hold posts priorities Refactors priority out of the props and into the new table We are nilifying Metadata when post.ForPlugin(), which didn't save Priority for a post when Boards was enabled. This commit copies metadata again to the post, so metadata are reinstated. Co-authored-by: Mattermod <mattermod@users.noreply.github.com> Co-authored-by: Vishal Choudhary <vish9812@gmail.com>
Этот коммит содержится в:
@@ -22,60 +22,64 @@ const (
|
||||
)
|
||||
|
||||
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:"-"`
|
||||
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"`
|
||||
UrgentMentionCount int64 `json:"urgent_mention_count"`
|
||||
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:"-"`
|
||||
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"`
|
||||
UrgentMentionCount int64 `json:"urgent_mention_count"`
|
||||
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"`
|
||||
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"`
|
||||
UrgentMentionCount int64 `json:"urgent_mention_count"`
|
||||
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"`
|
||||
}
|
||||
|
||||
func (o *ChannelMember) Auditable() map[string]interface{} {
|
||||
return map[string]interface{}{
|
||||
"channel_id": o.ChannelId,
|
||||
"user_id": o.UserId,
|
||||
"roles": o.Roles,
|
||||
"last_viewed_at": o.LastViewedAt,
|
||||
"msg_count": o.MsgCount,
|
||||
"mention_count": o.MentionCount,
|
||||
"mention_count_root": o.MentionCountRoot,
|
||||
"msg_count_root": o.MsgCountRoot,
|
||||
"notify_props": o.NotifyProps,
|
||||
"last_update_at": o.LastUpdateAt,
|
||||
"scheme_guest": o.SchemeGuest,
|
||||
"scheme_user": o.SchemeUser,
|
||||
"scheme_admin": o.SchemeAdmin,
|
||||
"explicit_roles": o.ExplicitRoles,
|
||||
"channel_id": o.ChannelId,
|
||||
"user_id": o.UserId,
|
||||
"roles": o.Roles,
|
||||
"last_viewed_at": o.LastViewedAt,
|
||||
"msg_count": o.MsgCount,
|
||||
"mention_count": o.MentionCount,
|
||||
"mention_count_root": o.MentionCountRoot,
|
||||
"urgent_mention_count": o.UrgentMentionCount,
|
||||
"msg_count_root": o.MsgCountRoot,
|
||||
"notify_props": o.NotifyProps,
|
||||
"last_update_at": o.LastUpdateAt,
|
||||
"scheme_guest": o.SchemeGuest,
|
||||
"scheme_user": o.SchemeUser,
|
||||
"scheme_admin": o.SchemeAdmin,
|
||||
"explicit_roles": o.ExplicitRoles,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -100,6 +104,10 @@ func (o *ChannelMember) MentionCountRoot_() float64 {
|
||||
return float64(o.MentionCountRoot)
|
||||
}
|
||||
|
||||
func (o *ChannelMember) UrgentMentionCount_() float64 {
|
||||
return float64(o.UrgentMentionCount)
|
||||
}
|
||||
|
||||
func (o *ChannelMember) MsgCountRoot_() float64 {
|
||||
return float64(o.MsgCountRoot)
|
||||
}
|
||||
|
||||
@@ -71,6 +71,10 @@ const (
|
||||
PostPropsGroupHighlightDisabled = "disable_group_highlight"
|
||||
|
||||
PostPropsPreviewedPost = "previewed_post"
|
||||
|
||||
PostPriorityUrgent = "urgent"
|
||||
PostPropsRequestedAck = "requested_ack"
|
||||
PostPropsPersistentNotifications = "persistent_notifications"
|
||||
)
|
||||
|
||||
const (
|
||||
@@ -158,6 +162,15 @@ type PostReminder struct {
|
||||
UserId string `json:",omitempty"`
|
||||
}
|
||||
|
||||
type PostPriority struct {
|
||||
Priority *string `json:"priority"`
|
||||
RequestedAck *bool `json:"requested_ack"`
|
||||
PersistentNotifications *bool `json:"persistent_notifications"`
|
||||
// These fields are only used internally for interacting with DB.
|
||||
PostId string `json:",omitempty"`
|
||||
ChannelId string `json:",omitempty"`
|
||||
}
|
||||
|
||||
type SearchParameter struct {
|
||||
Terms *string `json:"terms"`
|
||||
IsOrSearch *bool `json:"is_or_search"`
|
||||
@@ -306,6 +319,7 @@ type GetPostsOptions struct {
|
||||
FromCreateAt int64 // CreateAt after which to send the items
|
||||
Direction string // Only accepts up|down. Indicates the order in which to send the items.
|
||||
IncludeDeleted bool
|
||||
IncludePostPriority bool
|
||||
}
|
||||
|
||||
type PostCountOptions struct {
|
||||
@@ -770,3 +784,20 @@ func (o *Post) GetPreviewedPostProp() string {
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (o *Post) GetPriority() *PostPriority {
|
||||
if o.Metadata != nil && o.Metadata.Priority != nil {
|
||||
return o.Metadata.Priority
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (o *Post) IsUrgent() bool {
|
||||
postPriority := o.GetPriority()
|
||||
if postPriority == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
return *postPriority.Priority == PostPriorityUrgent
|
||||
}
|
||||
|
||||
@@ -22,6 +22,9 @@ type PostMetadata struct {
|
||||
|
||||
// Reactions holds reactions made to the post.
|
||||
Reactions []*Reaction `json:"reactions,omitempty"`
|
||||
|
||||
// Reactions holds reactions made to the post.
|
||||
Priority *PostPriority `json:"priority,omitempty"`
|
||||
}
|
||||
|
||||
type PostImage struct {
|
||||
@@ -54,11 +57,23 @@ func (p *PostMetadata) Copy() *PostMetadata {
|
||||
reactionsCopy := make([]*Reaction, len(p.Reactions))
|
||||
copy(reactionsCopy, p.Reactions)
|
||||
|
||||
var postPriorityCopy *PostPriority
|
||||
if p.Priority != nil {
|
||||
postPriorityCopy = &PostPriority{
|
||||
Priority: p.Priority.Priority,
|
||||
RequestedAck: p.Priority.RequestedAck,
|
||||
PersistentNotifications: p.Priority.PersistentNotifications,
|
||||
PostId: p.Priority.PostId,
|
||||
ChannelId: p.Priority.ChannelId,
|
||||
}
|
||||
}
|
||||
|
||||
return &PostMetadata{
|
||||
Embeds: embedsCopy,
|
||||
Emojis: emojisCopy,
|
||||
Files: filesCopy,
|
||||
Images: imagesCopy,
|
||||
Reactions: reactionsCopy,
|
||||
Priority: postPriorityCopy,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -45,13 +45,14 @@ func (o *TeamMember) Auditable() map[string]interface{} {
|
||||
|
||||
//msgp:ignore TeamUnread
|
||||
type TeamUnread struct {
|
||||
TeamId string `json:"team_id"`
|
||||
MsgCount int64 `json:"msg_count"`
|
||||
MentionCount int64 `json:"mention_count"`
|
||||
MentionCountRoot int64 `json:"mention_count_root"`
|
||||
MsgCountRoot int64 `json:"msg_count_root"`
|
||||
ThreadCount int64 `json:"thread_count"`
|
||||
ThreadMentionCount int64 `json:"thread_mention_count"`
|
||||
TeamId string `json:"team_id"`
|
||||
MsgCount int64 `json:"msg_count"`
|
||||
MentionCount int64 `json:"mention_count"`
|
||||
MentionCountRoot int64 `json:"mention_count_root"`
|
||||
MsgCountRoot int64 `json:"msg_count_root"`
|
||||
ThreadCount int64 `json:"thread_count"`
|
||||
ThreadMentionCount int64 `json:"thread_mention_count"`
|
||||
ThreadUrgentMentionCount int64 `json:"thread_urgent_mention_count"`
|
||||
}
|
||||
|
||||
//msgp:ignore TeamMemberForExport
|
||||
|
||||
@@ -41,14 +41,16 @@ type ThreadResponse struct {
|
||||
Post *Post `json:"post"`
|
||||
UnreadReplies int64 `json:"unread_replies"`
|
||||
UnreadMentions int64 `json:"unread_mentions"`
|
||||
IsUrgent bool `json:"is_urgent"`
|
||||
DeleteAt int64 `json:"delete_at"`
|
||||
}
|
||||
|
||||
type Threads struct {
|
||||
Total int64 `json:"total"`
|
||||
TotalUnreadThreads int64 `json:"total_unread_threads"`
|
||||
TotalUnreadMentions int64 `json:"total_unread_mentions"`
|
||||
Threads []*ThreadResponse `json:"threads"`
|
||||
Total int64 `json:"total"`
|
||||
TotalUnreadThreads int64 `json:"total_unread_threads"`
|
||||
TotalUnreadMentions int64 `json:"total_unread_mentions"`
|
||||
TotalUnreadUrgentMentions int64 `json:"total_unread_urgent_mentions"`
|
||||
Threads []*ThreadResponse `json:"threads"`
|
||||
}
|
||||
|
||||
type GetUserThreadsOpts struct {
|
||||
@@ -81,6 +83,9 @@ type GetUserThreadsOpts struct {
|
||||
|
||||
// TeamOnly will only fetch threads and unreads for the specified team and excludes DMs/GMs
|
||||
TeamOnly bool
|
||||
|
||||
// IncludeIsUrgent will return IsUrgent field as well to assert is the thread is urgent or not
|
||||
IncludeIsUrgent bool
|
||||
}
|
||||
|
||||
func (o *Thread) Etag() string {
|
||||
|
||||
Ссылка в новой задаче
Block a user