From d8b732a488233d9b763d2c43ded60a420e1746a6 Mon Sep 17 00:00:00 2001 From: Saturnino Abril Date: Thu, 6 Apr 2017 05:18:23 +0900 Subject: APIv4 GET /users/{user_id}/posts/flagged (#5984) * APIv4 GET /users/{user_id}/posts/flagged * change permission check --- store/sql_post_store.go | 42 +++++++++++++-- store/sql_post_store_test.go | 121 ++++++++++++++++++++++++++++++++++++++++++- store/store.go | 1 + 3 files changed, 159 insertions(+), 5 deletions(-) (limited to 'store') diff --git a/store/sql_post_store.go b/store/sql_post_store.go index 14580dc5f..5779f727c 100644 --- a/store/sql_post_store.go +++ b/store/sql_post_store.go @@ -5,6 +5,7 @@ package store import ( "fmt" + "net/http" "regexp" "strconv" "strings" @@ -13,7 +14,6 @@ import ( "github.com/mattermost/platform/einterfaces" "github.com/mattermost/platform/model" "github.com/mattermost/platform/utils" - "net/http" ) type SqlPostStore struct { @@ -237,7 +237,7 @@ func (s SqlPostStore) GetFlaggedPostsForTeam(userId, teamId string, offset int, Preferences WHERE UserId = :UserId - AND Category = 'flagged_post') + AND Category = :Category) AND DeleteAt = 0 ) as A INNER JOIN Channels as B @@ -247,7 +247,43 @@ func (s SqlPostStore) GetFlaggedPostsForTeam(userId, teamId string, offset int, LIMIT :Limit OFFSET :Offset` if _, err := s.GetReplica().Select(&posts, query, map[string]interface{}{"UserId": userId, "Category": model.PREFERENCE_CATEGORY_FLAGGED_POST, "Offset": offset, "Limit": limit, "TeamId": teamId}); err != nil { - result.Err = model.NewLocAppError("SqlPostStore.GetFlaggedPosts", "store.sql_post.get_flagged_posts.app_error", nil, err.Error()) + result.Err = model.NewLocAppError("SqlPostStore.GetFlaggedPostsForTeam", "store.sql_post.get_flagged_posts.app_error", nil, err.Error()) + } else { + for _, post := range posts { + pl.AddPost(post) + pl.AddOrder(post.Id) + } + } + + result.Data = pl + + storeChannel <- result + close(storeChannel) + }() + + return storeChannel +} + +func (s SqlPostStore) GetFlaggedPostsForChannel(userId, channelId string, offset int, limit int) StoreChannel { + storeChannel := make(StoreChannel, 1) + go func() { + result := StoreResult{} + pl := model.NewPostList() + + var posts []*model.Post + query := ` + SELECT + * + FROM Posts + WHERE + Id IN (SELECT Name FROM Preferences WHERE UserId = :UserId AND Category = :Category) + AND ChannelId = :ChannelId + AND DeleteAt = 0 + ORDER BY CreateAt DESC + LIMIT :Limit OFFSET :Offset` + + if _, err := s.GetReplica().Select(&posts, query, map[string]interface{}{"UserId": userId, "Category": model.PREFERENCE_CATEGORY_FLAGGED_POST, "ChannelId": channelId, "Offset": offset, "Limit": limit}); err != nil { + result.Err = model.NewLocAppError("SqlPostStore.GetFlaggedPostsForChannel", "store.sql_post.get_flagged_posts.app_error", nil, err.Error()) } else { for _, post := range posts { pl.AddPost(post) diff --git a/store/sql_post_store_test.go b/store/sql_post_store_test.go index f9dc5499f..d006555a3 100644 --- a/store/sql_post_store_test.go +++ b/store/sql_post_store_test.go @@ -1144,6 +1144,18 @@ func TestPostStoreGetFlaggedPostsForTeam(t *testing.T) { t.Fatal("should have 1 post") } + r3 = (<-store.Post().GetFlaggedPostsForTeam(o1.UserId, c1.TeamId, 1, 1)).Data.(*model.PostList) + + if len(r3.Order) != 1 { + t.Fatal("should have 1 post") + } + + r3 = (<-store.Post().GetFlaggedPostsForTeam(o1.UserId, c1.TeamId, 1000, 10)).Data.(*model.PostList) + + if len(r3.Order) != 0 { + t.Fatal("should be empty") + } + r4 := (<-store.Post().GetFlaggedPostsForTeam(o1.UserId, c1.TeamId, 0, 2)).Data.(*model.PostList) if len(r4.Order) != 2 { @@ -1202,7 +1214,6 @@ func TestPostStoreGetFlaggedPostsForTeam(t *testing.T) { r4 = (<-store.Post().GetFlaggedPostsForTeam(o1.UserId, c1.TeamId, 0, 10)).Data.(*model.PostList) if len(r4.Order) != 3 { - t.Log(len(r4.Order)) t.Fatal("should have 3 posts") } } @@ -1232,7 +1243,7 @@ func TestPostStoreGetFlaggedPosts(t *testing.T) { o3 = (<-store.Post().Save(o3)).Data.(*model.Post) time.Sleep(2 * time.Millisecond) - r1 := (<-store.Post().GetFlaggedPosts(o1.ChannelId, 0, 2)).Data.(*model.PostList) + r1 := (<-store.Post().GetFlaggedPosts(o1.UserId, 0, 2)).Data.(*model.PostList) if len(r1.Order) != 0 { t.Fatal("should be empty") @@ -1272,6 +1283,18 @@ func TestPostStoreGetFlaggedPosts(t *testing.T) { t.Fatal("should have 1 post") } + r3 = (<-store.Post().GetFlaggedPosts(o1.UserId, 1, 1)).Data.(*model.PostList) + + if len(r3.Order) != 1 { + t.Fatal("should have 1 post") + } + + r3 = (<-store.Post().GetFlaggedPosts(o1.UserId, 1000, 10)).Data.(*model.PostList) + + if len(r3.Order) != 0 { + t.Fatal("should be empty") + } + r4 := (<-store.Post().GetFlaggedPosts(o1.UserId, 0, 2)).Data.(*model.PostList) if len(r4.Order) != 2 { @@ -1296,6 +1319,100 @@ func TestPostStoreGetFlaggedPosts(t *testing.T) { } } +func TestPostStoreGetFlaggedPostsForChannel(t *testing.T) { + Setup() + + o1 := &model.Post{} + o1.ChannelId = model.NewId() + o1.UserId = model.NewId() + o1.Message = "a" + model.NewId() + "b" + o1 = (<-store.Post().Save(o1)).Data.(*model.Post) + time.Sleep(2 * time.Millisecond) + + o2 := &model.Post{} + o2.ChannelId = o1.ChannelId + o2.UserId = model.NewId() + o2.Message = "a" + model.NewId() + "b" + o2 = (<-store.Post().Save(o2)).Data.(*model.Post) + time.Sleep(2 * time.Millisecond) + + // deleted post + o3 := &model.Post{} + o3.ChannelId = model.NewId() + o3.UserId = o1.ChannelId + o3.Message = "a" + model.NewId() + "b" + o3.DeleteAt = 1 + o3 = (<-store.Post().Save(o3)).Data.(*model.Post) + time.Sleep(2 * time.Millisecond) + + o4 := &model.Post{} + o4.ChannelId = model.NewId() + o4.UserId = model.NewId() + o4.Message = "a" + model.NewId() + "b" + o4 = (<-store.Post().Save(o4)).Data.(*model.Post) + time.Sleep(2 * time.Millisecond) + + r := (<-store.Post().GetFlaggedPostsForChannel(o1.UserId, o1.ChannelId, 0, 10)).Data.(*model.PostList) + + if len(r.Order) != 0 { + t.Fatal("should be empty") + } + + preference := model.Preference{ + UserId: o1.UserId, + Category: model.PREFERENCE_CATEGORY_FLAGGED_POST, + Name: o1.Id, + Value: "true", + } + + Must(store.Preference().Save(&model.Preferences{preference})) + + r = (<-store.Post().GetFlaggedPostsForChannel(o1.UserId, o1.ChannelId, 0, 10)).Data.(*model.PostList) + + if len(r.Order) != 1 { + t.Fatal("should have 1 post") + } + + preference.Name = o2.Id + Must(store.Preference().Save(&model.Preferences{preference})) + + preference.Name = o3.Id + Must(store.Preference().Save(&model.Preferences{preference})) + + r = (<-store.Post().GetFlaggedPostsForChannel(o1.UserId, o1.ChannelId, 0, 1)).Data.(*model.PostList) + + if len(r.Order) != 1 { + t.Fatal("should have 1 post") + } + + r = (<-store.Post().GetFlaggedPostsForChannel(o1.UserId, o1.ChannelId, 1, 1)).Data.(*model.PostList) + + if len(r.Order) != 1 { + t.Fatal("should have 1 post") + } + + r = (<-store.Post().GetFlaggedPostsForChannel(o1.UserId, o1.ChannelId, 1000, 10)).Data.(*model.PostList) + + if len(r.Order) != 0 { + t.Fatal("should be empty") + } + + r = (<-store.Post().GetFlaggedPostsForChannel(o1.UserId, o1.ChannelId, 0, 10)).Data.(*model.PostList) + + if len(r.Order) != 2 { + t.Fatal("should have 2 posts") + } + + preference.Name = o4.Id + Must(store.Preference().Save(&model.Preferences{preference})) + + r = (<-store.Post().GetFlaggedPostsForChannel(o1.UserId, o4.ChannelId, 0, 10)).Data.(*model.PostList) + + if len(r.Order) != 1 { + t.Fatal("should have 1 post") + } +} + func TestPostStoreGetPostsCreatedAt(t *testing.T) { Setup() diff --git a/store/store.go b/store/store.go index 3e508dfa5..0f6952247 100644 --- a/store/store.go +++ b/store/store.go @@ -150,6 +150,7 @@ type PostStore interface { GetPosts(channelId string, offset int, limit int, allowFromCache bool) StoreChannel GetFlaggedPosts(userId string, offset int, limit int) StoreChannel GetFlaggedPostsForTeam(userId, teamId string, offset int, limit int) StoreChannel + GetFlaggedPostsForChannel(userId, channelId string, offset int, limit int) StoreChannel GetPostsBefore(channelId string, postId string, numPosts int, offset int) StoreChannel GetPostsAfter(channelId string, postId string, numPosts int, offset int) StoreChannel GetPostsSince(channelId string, time int64, allowFromCache bool) StoreChannel -- cgit v1.2.3-1-g7c22