MM-28249 Auto follow threads (#15878)
Co-authored-by: Mattermod <mattermod@users.noreply.github.com>
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
944841a237
Коммит
8844141df3
@@ -7,7 +7,9 @@ import (
|
||||
"database/sql"
|
||||
"github.com/mattermost/mattermost-server/v5/model"
|
||||
"github.com/mattermost/mattermost-server/v5/store"
|
||||
"github.com/mattermost/mattermost-server/v5/utils"
|
||||
"github.com/pkg/errors"
|
||||
"time"
|
||||
|
||||
sq "github.com/Masterminds/squirrel"
|
||||
)
|
||||
@@ -25,9 +27,12 @@ func newSqlThreadStore(sqlStore SqlStore) store.ThreadStore {
|
||||
}
|
||||
|
||||
for _, db := range sqlStore.GetAllConns() {
|
||||
table := db.AddTableWithName(model.Thread{}, "Threads").SetKeys(false, "PostId")
|
||||
table.ColMap("PostId").SetMaxSize(26)
|
||||
table.ColMap("Participants").SetMaxSize(0)
|
||||
tableThreads := db.AddTableWithName(model.Thread{}, "Threads").SetKeys(false, "PostId")
|
||||
tableThreads.ColMap("PostId").SetMaxSize(26)
|
||||
tableThreads.ColMap("Participants").SetMaxSize(0)
|
||||
tableThreadMemberships := db.AddTableWithName(model.ThreadMembership{}, "ThreadMemberships").SetKeys(false, "PostId", "UserId")
|
||||
tableThreadMemberships.ColMap("PostId").SetMaxSize(26)
|
||||
tableThreadMemberships.ColMap("UserId").SetMaxSize(26)
|
||||
}
|
||||
|
||||
return s
|
||||
@@ -49,6 +54,11 @@ func threadToSlice(thread *model.Thread) []interface{} {
|
||||
func (s *SqlThreadStore) createIndexesIfNotExists() {
|
||||
s.CreateIndexIfNotExists("idx_threads_last_reply_at", "Threads", "LastReplyAt")
|
||||
s.CreateIndexIfNotExists("idx_threads_post_id", "Threads", "PostId")
|
||||
|
||||
s.CreateIndexIfNotExists("idx_thread_memberships_last_update_at", "ThreadMemberships", "LastUpdated")
|
||||
s.CreateIndexIfNotExists("idx_thread_memberships_last_view_at", "ThreadMemberships", "LastViewed")
|
||||
s.CreateIndexIfNotExists("idx_thread_memberships_post_id", "ThreadMemberships", "PostId")
|
||||
s.CreateIndexIfNotExists("idx_thread_memberships_user_id", "ThreadMemberships", "UserId")
|
||||
}
|
||||
|
||||
func (s *SqlThreadStore) SaveMultiple(threads []*model.Thread) ([]*model.Thread, int, error) {
|
||||
@@ -106,3 +116,75 @@ func (s *SqlThreadStore) Delete(threadId string) error {
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *SqlThreadStore) SaveMembership(membership *model.ThreadMembership) (*model.ThreadMembership, error) {
|
||||
if err := s.GetMaster().Insert(membership); err != nil {
|
||||
return nil, errors.Wrapf(err, "failed to save thread membership with postid=%s userid=%s", membership.PostId, membership.UserId)
|
||||
}
|
||||
|
||||
return membership, nil
|
||||
}
|
||||
|
||||
func (s *SqlThreadStore) UpdateMembership(membership *model.ThreadMembership) (*model.ThreadMembership, error) {
|
||||
if _, err := s.GetMaster().Update(membership); err != nil {
|
||||
return nil, errors.Wrapf(err, "failed to update thread membership with postid=%s userid=%s", membership.PostId, membership.UserId)
|
||||
}
|
||||
|
||||
return membership, nil
|
||||
}
|
||||
|
||||
func (s *SqlThreadStore) GetMembershipsForUser(userId string) ([]*model.ThreadMembership, error) {
|
||||
var memberships []*model.ThreadMembership
|
||||
_, err := s.GetReplica().Select(&memberships, "SELECT * from ThreadMemberships WHERE UserId = :UserId", map[string]interface{}{"UserId": userId})
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(err, "failed to get thread membership with userid=%s", userId)
|
||||
}
|
||||
return memberships, nil
|
||||
}
|
||||
|
||||
func (s *SqlThreadStore) GetMembershipForUser(userId, postId string) (*model.ThreadMembership, error) {
|
||||
var membership model.ThreadMembership
|
||||
err := s.GetReplica().SelectOne(&membership, "SELECT * from ThreadMemberships WHERE UserId = :UserId AND PostId = :PostId", map[string]interface{}{"UserId": userId, "PostId": postId})
|
||||
if err != nil {
|
||||
if err == sql.ErrNoRows {
|
||||
return nil, store.NewErrNotFound("Thread", postId)
|
||||
}
|
||||
return nil, errors.Wrapf(err, "failed to get thread membership with userid=%s postid=%s", userId, postId)
|
||||
}
|
||||
return &membership, nil
|
||||
}
|
||||
|
||||
func (s *SqlThreadStore) DeleteMembershipForUser(userId string, postId string) error {
|
||||
if _, err := s.GetMaster().Exec("DELETE FROM ThreadMemberships Where PostId = :PostId AND UserId = :UserId", map[string]interface{}{"PostId": postId, "UserId": userId}); err != nil {
|
||||
return errors.Wrap(err, "failed to update thread membership")
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *SqlThreadStore) CreateMembershipIfNeeded(userId, postId string) error {
|
||||
membership, err := s.GetMembershipForUser(userId, postId)
|
||||
now := utils.MillisFromTime(time.Now())
|
||||
if err == nil {
|
||||
if !membership.Following {
|
||||
membership.Following = true
|
||||
membership.LastUpdated = now
|
||||
_, err = s.UpdateMembership(membership)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
var nfErr *store.ErrNotFound
|
||||
|
||||
if !errors.As(err, &nfErr) {
|
||||
return errors.Wrap(err, "failed to get thread membership")
|
||||
}
|
||||
_, err = s.SaveMembership(&model.ThreadMembership{
|
||||
PostId: postId,
|
||||
UserId: userId,
|
||||
Following: true,
|
||||
LastViewed: 0,
|
||||
LastUpdated: now,
|
||||
})
|
||||
return err
|
||||
}
|
||||
|
||||
Ссылка в новой задаче
Block a user