Merge branch 'master' of github.com:mattermost/mattermost-server into top-dms-clean
Этот коммит содержится в:
@@ -221,10 +221,20 @@ func generateLayer(name, templateFile string) ([]byte, error) {
|
||||
if len(results) == 0 {
|
||||
return ""
|
||||
}
|
||||
if len(results) == 1 {
|
||||
return strings.Join(results, ", ")
|
||||
returns := []string{}
|
||||
for _, result := range results {
|
||||
switch result {
|
||||
case "*PostReminderMetadata":
|
||||
returns = append(returns, fmt.Sprintf("*store.%s", strings.TrimPrefix(result, "*")))
|
||||
default:
|
||||
returns = append(returns, result)
|
||||
}
|
||||
}
|
||||
return fmt.Sprintf("(%s)", strings.Join(results, ", "))
|
||||
|
||||
if len(returns) == 1 {
|
||||
return strings.Join(returns, ", ")
|
||||
}
|
||||
return fmt.Sprintf("(%s)", strings.Join(returns, ", "))
|
||||
},
|
||||
"genResultsVars": func(results []string, withNilError bool) string {
|
||||
vars := []string{}
|
||||
|
||||
@@ -5809,6 +5809,42 @@ func (s *OpenTracingLayerPostStore) GetPostIdBeforeTime(channelID string, timest
|
||||
return result, err
|
||||
}
|
||||
|
||||
func (s *OpenTracingLayerPostStore) GetPostReminderMetadata(postID string) (*store.PostReminderMetadata, error) {
|
||||
origCtx := s.Root.Store.Context()
|
||||
span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "PostStore.GetPostReminderMetadata")
|
||||
s.Root.Store.SetContext(newCtx)
|
||||
defer func() {
|
||||
s.Root.Store.SetContext(origCtx)
|
||||
}()
|
||||
|
||||
defer span.Finish()
|
||||
result, err := s.PostStore.GetPostReminderMetadata(postID)
|
||||
if err != nil {
|
||||
span.LogFields(spanlog.Error(err))
|
||||
ext.Error.Set(span, true)
|
||||
}
|
||||
|
||||
return result, err
|
||||
}
|
||||
|
||||
func (s *OpenTracingLayerPostStore) GetPostReminders(now int64) ([]*model.PostReminder, error) {
|
||||
origCtx := s.Root.Store.Context()
|
||||
span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "PostStore.GetPostReminders")
|
||||
s.Root.Store.SetContext(newCtx)
|
||||
defer func() {
|
||||
s.Root.Store.SetContext(origCtx)
|
||||
}()
|
||||
|
||||
defer span.Finish()
|
||||
result, err := s.PostStore.GetPostReminders(now)
|
||||
if err != nil {
|
||||
span.LogFields(spanlog.Error(err))
|
||||
ext.Error.Set(span, true)
|
||||
}
|
||||
|
||||
return result, err
|
||||
}
|
||||
|
||||
func (s *OpenTracingLayerPostStore) GetPosts(options model.GetPostsOptions, allowFromCache bool, sanitizeOptions map[string]bool) (*model.PostList, error) {
|
||||
origCtx := s.Root.Store.Context()
|
||||
span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "PostStore.GetPosts")
|
||||
@@ -6254,6 +6290,24 @@ func (s *OpenTracingLayerPostStore) SearchPostsForUser(paramsList []*model.Searc
|
||||
return result, err
|
||||
}
|
||||
|
||||
func (s *OpenTracingLayerPostStore) SetPostReminder(reminder *model.PostReminder) error {
|
||||
origCtx := s.Root.Store.Context()
|
||||
span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "PostStore.SetPostReminder")
|
||||
s.Root.Store.SetContext(newCtx)
|
||||
defer func() {
|
||||
s.Root.Store.SetContext(origCtx)
|
||||
}()
|
||||
|
||||
defer span.Finish()
|
||||
err := s.PostStore.SetPostReminder(reminder)
|
||||
if err != nil {
|
||||
span.LogFields(spanlog.Error(err))
|
||||
ext.Error.Set(span, true)
|
||||
}
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
func (s *OpenTracingLayerPostStore) Update(newPost *model.Post, oldPost *model.Post) (*model.Post, error) {
|
||||
origCtx := s.Root.Store.Context()
|
||||
span, newCtx := tracing.StartSpanWithParentByContext(s.Root.Store.Context(), "PostStore.Update")
|
||||
|
||||
@@ -6575,6 +6575,48 @@ func (s *RetryLayerPostStore) GetPostIdBeforeTime(channelID string, timestamp in
|
||||
|
||||
}
|
||||
|
||||
func (s *RetryLayerPostStore) GetPostReminderMetadata(postID string) (*store.PostReminderMetadata, error) {
|
||||
|
||||
tries := 0
|
||||
for {
|
||||
result, err := s.PostStore.GetPostReminderMetadata(postID)
|
||||
if err == nil {
|
||||
return result, nil
|
||||
}
|
||||
if !isRepeatableError(err) {
|
||||
return result, err
|
||||
}
|
||||
tries++
|
||||
if tries >= 3 {
|
||||
err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
|
||||
return result, err
|
||||
}
|
||||
timepkg.Sleep(100 * timepkg.Millisecond)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func (s *RetryLayerPostStore) GetPostReminders(now int64) ([]*model.PostReminder, error) {
|
||||
|
||||
tries := 0
|
||||
for {
|
||||
result, err := s.PostStore.GetPostReminders(now)
|
||||
if err == nil {
|
||||
return result, nil
|
||||
}
|
||||
if !isRepeatableError(err) {
|
||||
return result, err
|
||||
}
|
||||
tries++
|
||||
if tries >= 3 {
|
||||
err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
|
||||
return result, err
|
||||
}
|
||||
timepkg.Sleep(100 * timepkg.Millisecond)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func (s *RetryLayerPostStore) GetPosts(options model.GetPostsOptions, allowFromCache bool, sanitizeOptions map[string]bool) (*model.PostList, error) {
|
||||
|
||||
tries := 0
|
||||
@@ -7085,6 +7127,27 @@ func (s *RetryLayerPostStore) SearchPostsForUser(paramsList []*model.SearchParam
|
||||
|
||||
}
|
||||
|
||||
func (s *RetryLayerPostStore) SetPostReminder(reminder *model.PostReminder) error {
|
||||
|
||||
tries := 0
|
||||
for {
|
||||
err := s.PostStore.SetPostReminder(reminder)
|
||||
if err == nil {
|
||||
return nil
|
||||
}
|
||||
if !isRepeatableError(err) {
|
||||
return err
|
||||
}
|
||||
tries++
|
||||
if tries >= 3 {
|
||||
err = errors.Wrap(err, "giving up after 3 consecutive repeatable transaction failures")
|
||||
return err
|
||||
}
|
||||
timepkg.Sleep(100 * timepkg.Millisecond)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func (s *RetryLayerPostStore) Update(newPost *model.Post, oldPost *model.Post) (*model.Post, error) {
|
||||
|
||||
tries := 0
|
||||
|
||||
@@ -3041,3 +3041,97 @@ func postProcessTopDMs(s *SqlPostStore, userID string, topDMs []*model.TopDM) ([
|
||||
}
|
||||
return topDMsFiltered, nil
|
||||
}
|
||||
|
||||
func (s *SqlPostStore) SetPostReminder(reminder *model.PostReminder) error {
|
||||
transaction, err := s.GetMasterX().Beginx()
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "begin_transaction")
|
||||
}
|
||||
defer finalizeTransactionX(transaction)
|
||||
|
||||
sql := `SELECT EXISTS (SELECT 1 FROM Posts WHERE Id=?)`
|
||||
var exist bool
|
||||
err = transaction.Get(&exist, sql, reminder.PostId)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "failed to check for post")
|
||||
}
|
||||
if !exist {
|
||||
return store.NewErrNotFound("Post", reminder.PostId)
|
||||
}
|
||||
|
||||
query := s.getQueryBuilder().
|
||||
Insert("PostReminders").
|
||||
Columns("PostId", "UserId", "TargetTime").
|
||||
Values(reminder.PostId, reminder.UserId, reminder.TargetTime)
|
||||
|
||||
if s.DriverName() == model.DatabaseDriverMysql {
|
||||
query = query.SuffixExpr(sq.Expr("ON DUPLICATE KEY UPDATE TargetTime = ?", reminder.TargetTime))
|
||||
} else {
|
||||
query = query.SuffixExpr(sq.Expr("ON CONFLICT (postid, userid) DO UPDATE SET TargetTime = ?", reminder.TargetTime))
|
||||
}
|
||||
|
||||
sql, args, err := query.ToSql()
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "setPostReminder_tosql")
|
||||
}
|
||||
if _, err2 := transaction.Exec(sql, args...); err2 != nil {
|
||||
return errors.Wrap(err2, "failed to insert post reminder")
|
||||
}
|
||||
if err = transaction.Commit(); err != nil {
|
||||
return errors.Wrap(err, "commit_transaction")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *SqlPostStore) GetPostReminders(now int64) ([]*model.PostReminder, error) {
|
||||
reminders := []*model.PostReminder{}
|
||||
|
||||
transaction, err := s.GetMasterX().Beginx()
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "begin_transaction")
|
||||
}
|
||||
defer finalizeTransactionX(transaction)
|
||||
|
||||
err = transaction.Select(&reminders, `SELECT PostId, UserId
|
||||
FROM PostReminders
|
||||
WHERE TargetTime < ?`, now)
|
||||
if err != nil && err != sql.ErrNoRows {
|
||||
return nil, errors.Wrap(err, "failed to get post reminders")
|
||||
}
|
||||
|
||||
if err == sql.ErrNoRows {
|
||||
// No need to execute delete statement if there's nothing to delete.
|
||||
return reminders, nil
|
||||
}
|
||||
|
||||
// Postgres supports RETURNING * in a DELETE statement, but MySQL doesn't.
|
||||
// So we are stuck with 2 queries. Not taking separate paths for Postgres
|
||||
// and MySQL for simplicity.
|
||||
_, err = transaction.Exec(`DELETE from PostReminders WHERE TargetTime < ?`, now)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "failed to delete post reminders")
|
||||
}
|
||||
|
||||
if err = transaction.Commit(); err != nil {
|
||||
return nil, errors.Wrap(err, "commit_transaction")
|
||||
}
|
||||
|
||||
return reminders, nil
|
||||
}
|
||||
|
||||
func (s *SqlPostStore) GetPostReminderMetadata(postID string) (*store.PostReminderMetadata, error) {
|
||||
meta := &store.PostReminderMetadata{}
|
||||
err := s.GetReplicaX().Get(meta, `SELECT c.id as ChannelId,
|
||||
t.name as TeamName,
|
||||
u.locale as UserLocale, u.username as Username
|
||||
FROM Posts p, Channels c, Teams t, Users u
|
||||
WHERE p.ChannelId=c.Id
|
||||
AND c.TeamId=t.Id
|
||||
AND p.UserId=u.Id
|
||||
AND p.Id=?`, postID)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "failed to get post reminder metadata")
|
||||
}
|
||||
|
||||
return meta, nil
|
||||
}
|
||||
|
||||
@@ -386,6 +386,9 @@ type PostStore interface {
|
||||
GetOldestEntityCreationTime() (int64, error)
|
||||
HasAutoResponsePostByUserSince(options model.GetPostsSinceOptions, userId string) (bool, error)
|
||||
GetPostsSinceForSync(options model.GetPostsSinceForSyncOptions, cursor model.GetPostsSinceForSyncCursor, limit int) ([]*model.Post, model.GetPostsSinceForSyncCursor, error)
|
||||
SetPostReminder(reminder *model.PostReminder) error
|
||||
GetPostReminders(now int64) ([]*model.PostReminder, error)
|
||||
GetPostReminderMetadata(postID string) (*PostReminderMetadata, error)
|
||||
// GetNthRecentPostTime returns the CreateAt time of the nth most recent post.
|
||||
GetNthRecentPostTime(n int64) (int64, error)
|
||||
|
||||
@@ -1022,6 +1025,15 @@ type ChannelMemberGraphQLSearchOpts struct {
|
||||
ExcludeTeam bool
|
||||
}
|
||||
|
||||
// PostReminderMetadata contains some info needed to send
|
||||
// the reminder message to the user.
|
||||
type PostReminderMetadata struct {
|
||||
ChannelId string
|
||||
TeamName string
|
||||
UserLocale string
|
||||
Username string
|
||||
}
|
||||
|
||||
// SidebarCategorySearchOpts contains the options for a graphQL query
|
||||
// to get the sidebar categories.
|
||||
type SidebarCategorySearchOpts struct {
|
||||
|
||||
@@ -9,6 +9,7 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/dyatlov/go-opengraph/opengraph"
|
||||
"github.com/dyatlov/go-opengraph/opengraph/types/image"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
@@ -205,7 +206,7 @@ func testLinkMetadataStoreTypes(t *testing.T, ss store.Store) {
|
||||
t.Run("should save and get opengraph data", func(t *testing.T) {
|
||||
og := &opengraph.OpenGraph{
|
||||
URL: "http://example.com",
|
||||
Images: []*opengraph.Image{
|
||||
Images: []*image.Image{
|
||||
{
|
||||
URL: "http://example.com/image.png",
|
||||
},
|
||||
|
||||
@@ -9,6 +9,8 @@ import (
|
||||
|
||||
model "github.com/mattermost/mattermost-server/v6/model"
|
||||
mock "github.com/stretchr/testify/mock"
|
||||
|
||||
store "github.com/mattermost/mattermost-server/v6/store"
|
||||
)
|
||||
|
||||
// PostStore is an autogenerated mock type for the PostStore type
|
||||
@@ -440,6 +442,52 @@ func (_m *PostStore) GetPostIdBeforeTime(channelID string, timestamp int64, coll
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// GetPostReminderMetadata provides a mock function with given fields: postID
|
||||
func (_m *PostStore) GetPostReminderMetadata(postID string) (*store.PostReminderMetadata, error) {
|
||||
ret := _m.Called(postID)
|
||||
|
||||
var r0 *store.PostReminderMetadata
|
||||
if rf, ok := ret.Get(0).(func(string) *store.PostReminderMetadata); ok {
|
||||
r0 = rf(postID)
|
||||
} else {
|
||||
if ret.Get(0) != nil {
|
||||
r0 = ret.Get(0).(*store.PostReminderMetadata)
|
||||
}
|
||||
}
|
||||
|
||||
var r1 error
|
||||
if rf, ok := ret.Get(1).(func(string) error); ok {
|
||||
r1 = rf(postID)
|
||||
} else {
|
||||
r1 = ret.Error(1)
|
||||
}
|
||||
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// GetPostReminders provides a mock function with given fields: now
|
||||
func (_m *PostStore) GetPostReminders(now int64) ([]*model.PostReminder, error) {
|
||||
ret := _m.Called(now)
|
||||
|
||||
var r0 []*model.PostReminder
|
||||
if rf, ok := ret.Get(0).(func(int64) []*model.PostReminder); ok {
|
||||
r0 = rf(now)
|
||||
} else {
|
||||
if ret.Get(0) != nil {
|
||||
r0 = ret.Get(0).([]*model.PostReminder)
|
||||
}
|
||||
}
|
||||
|
||||
var r1 error
|
||||
if rf, ok := ret.Get(1).(func(int64) error); ok {
|
||||
r1 = rf(now)
|
||||
} else {
|
||||
r1 = ret.Error(1)
|
||||
}
|
||||
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// GetPosts provides a mock function with given fields: options, allowFromCache, sanitizeOptions
|
||||
func (_m *PostStore) GetPosts(options model.GetPostsOptions, allowFromCache bool, sanitizeOptions map[string]bool) (*model.PostList, error) {
|
||||
ret := _m.Called(options, allowFromCache, sanitizeOptions)
|
||||
@@ -992,6 +1040,20 @@ func (_m *PostStore) SearchPostsForUser(paramsList []*model.SearchParams, userID
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
// SetPostReminder provides a mock function with given fields: reminder
|
||||
func (_m *PostStore) SetPostReminder(reminder *model.PostReminder) error {
|
||||
ret := _m.Called(reminder)
|
||||
|
||||
var r0 error
|
||||
if rf, ok := ret.Get(0).(func(*model.PostReminder) error); ok {
|
||||
r0 = rf(reminder)
|
||||
} else {
|
||||
r0 = ret.Error(0)
|
||||
}
|
||||
|
||||
return r0
|
||||
}
|
||||
|
||||
// Update provides a mock function with given fields: newPost, oldPost
|
||||
func (_m *PostStore) Update(newPost *model.Post, oldPost *model.Post) (*model.Post, error) {
|
||||
ret := _m.Called(newPost, oldPost)
|
||||
|
||||
@@ -5,6 +5,7 @@ package storetest
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"sort"
|
||||
"strings"
|
||||
@@ -57,6 +58,9 @@ func TestPostStore(t *testing.T, ss store.Store, s SqlStore) {
|
||||
t.Run("GetForThread", func(t *testing.T) { testPostStoreGetForThread(t, ss) })
|
||||
t.Run("HasAutoResponsePostByUserSince", func(t *testing.T) { testHasAutoResponsePostByUserSince(t, ss) })
|
||||
t.Run("GetPostsSinceForSync", func(t *testing.T) { testGetPostsSinceForSync(t, ss, s) })
|
||||
t.Run("SetPostReminder", func(t *testing.T) { testSetPostReminder(t, ss, s) })
|
||||
t.Run("GetPostReminders", func(t *testing.T) { testGetPostReminders(t, ss, s) })
|
||||
t.Run("GetPostReminderMetadata", func(t *testing.T) { testGetPostReminderMetadata(t, ss, s) })
|
||||
t.Run("GetNthRecentPostTime", func(t *testing.T) { testGetNthRecentPostTime(t, ss) })
|
||||
t.Run("GetTopDMsForUserSince", func(t *testing.T) { testGetTopDMsForUserSince(t, ss, s) })
|
||||
}
|
||||
@@ -3757,6 +3761,130 @@ func testGetPostsSinceForSync(t *testing.T, ss store.Store, s SqlStore) {
|
||||
})
|
||||
}
|
||||
|
||||
func testSetPostReminder(t *testing.T, ss store.Store, s SqlStore) {
|
||||
// Basic
|
||||
userID := NewTestId()
|
||||
|
||||
p1 := &model.Post{
|
||||
UserId: userID,
|
||||
ChannelId: NewTestId(),
|
||||
Message: "hi there",
|
||||
Type: model.PostTypeDefault,
|
||||
}
|
||||
p1, err := ss.Post().Save(p1)
|
||||
require.NoError(t, err)
|
||||
|
||||
reminder := &model.PostReminder{
|
||||
TargetTime: 1234,
|
||||
PostId: p1.Id,
|
||||
UserId: userID,
|
||||
}
|
||||
|
||||
require.NoError(t, ss.Post().SetPostReminder(reminder))
|
||||
|
||||
out := model.PostReminder{}
|
||||
require.NoError(t, s.GetMasterX().Get(&out, `SELECT PostId, UserId, TargetTime FROM PostReminders WHERE PostId=? AND UserId=?`, reminder.PostId, reminder.UserId))
|
||||
assert.Equal(t, reminder, &out)
|
||||
|
||||
reminder.PostId = "notfound"
|
||||
err = ss.Post().SetPostReminder(reminder)
|
||||
var nfErr *store.ErrNotFound
|
||||
require.True(t, errors.As(err, &nfErr))
|
||||
|
||||
// Upsert
|
||||
reminder = &model.PostReminder{
|
||||
TargetTime: 12345,
|
||||
PostId: p1.Id,
|
||||
UserId: userID,
|
||||
}
|
||||
|
||||
require.NoError(t, ss.Post().SetPostReminder(reminder))
|
||||
require.NoError(t, s.GetMasterX().Get(&out, `SELECT PostId, UserId, TargetTime FROM PostReminders WHERE PostId=? AND UserId=?`, reminder.PostId, reminder.UserId))
|
||||
assert.Equal(t, reminder, &out)
|
||||
}
|
||||
|
||||
func testGetPostReminders(t *testing.T, ss store.Store, s SqlStore) {
|
||||
times := []int64{100, 101, 102}
|
||||
for _, tt := range times {
|
||||
userID := NewTestId()
|
||||
|
||||
p1 := &model.Post{
|
||||
UserId: userID,
|
||||
ChannelId: NewTestId(),
|
||||
Message: "hi there",
|
||||
Type: model.PostTypeDefault,
|
||||
}
|
||||
p1, err := ss.Post().Save(p1)
|
||||
require.NoError(t, err)
|
||||
|
||||
reminder := &model.PostReminder{
|
||||
TargetTime: tt,
|
||||
PostId: p1.Id,
|
||||
UserId: userID,
|
||||
}
|
||||
|
||||
require.NoError(t, ss.Post().SetPostReminder(reminder))
|
||||
}
|
||||
|
||||
reminders, err := ss.Post().GetPostReminders(102)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, reminders, 2)
|
||||
|
||||
// assert one reminder is left
|
||||
reminders, err = ss.Post().GetPostReminders(103)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, reminders, 1)
|
||||
|
||||
// assert everything is deleted.
|
||||
reminders, err = ss.Post().GetPostReminders(103)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, reminders, 0)
|
||||
}
|
||||
|
||||
func testGetPostReminderMetadata(t *testing.T, ss store.Store, s SqlStore) {
|
||||
team := &model.Team{
|
||||
Name: "teamname",
|
||||
DisplayName: "display",
|
||||
Type: model.TeamOpen,
|
||||
}
|
||||
team, err := ss.Team().Save(team)
|
||||
require.NoError(t, err)
|
||||
|
||||
ch := &model.Channel{
|
||||
TeamId: team.Id,
|
||||
DisplayName: "channeldisplay",
|
||||
Name: NewTestId(),
|
||||
Type: model.ChannelTypeOpen,
|
||||
}
|
||||
ch, err = ss.Channel().Save(ch, -1)
|
||||
require.NoError(t, err)
|
||||
|
||||
u1 := &model.User{
|
||||
Email: MakeEmail(),
|
||||
Username: model.NewId(),
|
||||
Locale: "es",
|
||||
}
|
||||
|
||||
u1, err = ss.User().Save(u1)
|
||||
require.NoError(t, err)
|
||||
|
||||
p1 := &model.Post{
|
||||
UserId: u1.Id,
|
||||
ChannelId: ch.Id,
|
||||
Message: "hi there",
|
||||
Type: model.PostTypeDefault,
|
||||
}
|
||||
p1, err = ss.Post().Save(p1)
|
||||
require.NoError(t, err)
|
||||
|
||||
meta, err := ss.Post().GetPostReminderMetadata(p1.Id)
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, meta.ChannelId, ch.Id)
|
||||
assert.Equal(t, meta.TeamName, team.Name)
|
||||
assert.Equal(t, meta.Username, u1.Username)
|
||||
assert.Equal(t, meta.UserLocale, u1.Locale)
|
||||
}
|
||||
|
||||
func getPostIds(posts []*model.Post, morePosts ...*model.Post) []string {
|
||||
ids := make([]string, 0, len(posts)+len(morePosts))
|
||||
for _, p := range posts {
|
||||
|
||||
@@ -5258,6 +5258,38 @@ func (s *TimerLayerPostStore) GetPostIdBeforeTime(channelID string, timestamp in
|
||||
return result, err
|
||||
}
|
||||
|
||||
func (s *TimerLayerPostStore) GetPostReminderMetadata(postID string) (*store.PostReminderMetadata, error) {
|
||||
start := time.Now()
|
||||
|
||||
result, err := s.PostStore.GetPostReminderMetadata(postID)
|
||||
|
||||
elapsed := float64(time.Since(start)) / float64(time.Second)
|
||||
if s.Root.Metrics != nil {
|
||||
success := "false"
|
||||
if err == nil {
|
||||
success = "true"
|
||||
}
|
||||
s.Root.Metrics.ObserveStoreMethodDuration("PostStore.GetPostReminderMetadata", success, elapsed)
|
||||
}
|
||||
return result, err
|
||||
}
|
||||
|
||||
func (s *TimerLayerPostStore) GetPostReminders(now int64) ([]*model.PostReminder, error) {
|
||||
start := time.Now()
|
||||
|
||||
result, err := s.PostStore.GetPostReminders(now)
|
||||
|
||||
elapsed := float64(time.Since(start)) / float64(time.Second)
|
||||
if s.Root.Metrics != nil {
|
||||
success := "false"
|
||||
if err == nil {
|
||||
success = "true"
|
||||
}
|
||||
s.Root.Metrics.ObserveStoreMethodDuration("PostStore.GetPostReminders", success, elapsed)
|
||||
}
|
||||
return result, err
|
||||
}
|
||||
|
||||
func (s *TimerLayerPostStore) GetPosts(options model.GetPostsOptions, allowFromCache bool, sanitizeOptions map[string]bool) (*model.PostList, error) {
|
||||
start := time.Now()
|
||||
|
||||
@@ -5657,6 +5689,22 @@ func (s *TimerLayerPostStore) SearchPostsForUser(paramsList []*model.SearchParam
|
||||
return result, err
|
||||
}
|
||||
|
||||
func (s *TimerLayerPostStore) SetPostReminder(reminder *model.PostReminder) error {
|
||||
start := time.Now()
|
||||
|
||||
err := s.PostStore.SetPostReminder(reminder)
|
||||
|
||||
elapsed := float64(time.Since(start)) / float64(time.Second)
|
||||
if s.Root.Metrics != nil {
|
||||
success := "false"
|
||||
if err == nil {
|
||||
success = "true"
|
||||
}
|
||||
s.Root.Metrics.ObserveStoreMethodDuration("PostStore.SetPostReminder", success, elapsed)
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func (s *TimerLayerPostStore) Update(newPost *model.Post, oldPost *model.Post) (*model.Post, error) {
|
||||
start := time.Now()
|
||||
|
||||
|
||||
Ссылка в новой задаче
Block a user