diff options
author | Joram Wilander <jwawilander@gmail.com> | 2016-08-22 20:36:01 -0400 |
---|---|---|
committer | Corey Hulen <corey@hulen.com> | 2016-08-22 16:36:01 -0800 |
commit | 80d83ae77c85de5666dc88458e2888f66c49cc90 (patch) | |
tree | 3d5a5864662347529899a07e1009f70f5a326df9 | |
parent | c3c62ad2ad018be6887149e92dd35bb527f55168 (diff) | |
download | chat-80d83ae77c85de5666dc88458e2888f66c49cc90.tar.gz chat-80d83ae77c85de5666dc88458e2888f66c49cc90.tar.bz2 chat-80d83ae77c85de5666dc88458e2888f66c49cc90.zip |
Prevent flagging of deleted posts and don't show deleted posts in flagged post list (#3846)
-rw-r--r-- | api/post.go | 8 | ||||
-rw-r--r-- | i18n/en.json | 4 | ||||
-rw-r--r-- | store/sql_post_store.go | 2 | ||||
-rw-r--r-- | store/sql_post_store_test.go | 23 | ||||
-rw-r--r-- | webapp/components/post_view/components/post_info.jsx | 35 | ||||
-rw-r--r-- | webapp/components/rhs_comment.jsx | 35 |
6 files changed, 78 insertions, 29 deletions
diff --git a/api/post.go b/api/post.go index fa42e6f88..b4c70fab2 100644 --- a/api/post.go +++ b/api/post.go @@ -1332,6 +1332,7 @@ func deletePost(c *Context, w http.ResponseWriter, r *http.Request) { go Publish(message) go DeletePostFiles(c.TeamId, post) + go DeleteFlaggedPost(c.Session.UserId, post) result := make(map[string]string) result["id"] = postId @@ -1339,6 +1340,13 @@ func deletePost(c *Context, w http.ResponseWriter, r *http.Request) { } } +func DeleteFlaggedPost(userId string, post *model.Post) { + if result := <-Srv.Store.Preference().Delete(userId, model.PREFERENCE_CATEGORY_FLAGGED_POST, post.Id); result.Err != nil { + l4g.Warn(utils.T("api.post.delete_flagged_post.app_error.warn"), result.Err) + return + } +} + func DeletePostFiles(teamId string, post *model.Post) { if len(post.Filenames) == 0 { return diff --git a/i18n/en.json b/i18n/en.json index f0f09fd1b..00686e1af 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -1098,6 +1098,10 @@ "translation": "Bad filename discarded, filename=%v" }, { + "id": "api.post.delete_flagged_post.app_error.warn", + "translation": "Unable to delete flagged post preference when deleting post, err=%v" + }, + { "id": "api.post.create_post.channel_root_id.app_error", "translation": "Invalid ChannelId for RootId parameter" }, diff --git a/store/sql_post_store.go b/store/sql_post_store.go index 07192b4a6..b844bfbca 100644 --- a/store/sql_post_store.go +++ b/store/sql_post_store.go @@ -149,7 +149,7 @@ func (s SqlPostStore) GetFlaggedPosts(userId string, offset int, limit int) Stor pl := &model.PostList{} var posts []*model.Post - if _, err := s.GetReplica().Select(&posts, "SELECT * FROM Posts WHERE Id IN (SELECT Name FROM Preferences WHERE UserId = :UserId AND Category = :Category) ORDER BY CreateAt ASC LIMIT :Limit OFFSET :Offset", map[string]interface{}{"UserId": userId, "Category": model.PREFERENCE_CATEGORY_FLAGGED_POST, "Offset": offset, "Limit": limit}); err != nil { + if _, err := s.GetReplica().Select(&posts, "SELECT * FROM Posts WHERE Id IN (SELECT Name FROM Preferences WHERE UserId = :UserId AND Category = :Category) AND DeleteAt = 0 ORDER BY CreateAt ASC LIMIT :Limit OFFSET :Offset", map[string]interface{}{"UserId": userId, "Category": model.PREFERENCE_CATEGORY_FLAGGED_POST, "Offset": offset, "Limit": limit}); err != nil { result.Err = model.NewLocAppError("SqlPostStore.GetFlaggedPosts", "store.sql_post.get_flagged_posts.app_error", nil, err.Error()) } else { for _, post := range posts { diff --git a/store/sql_post_store_test.go b/store/sql_post_store_test.go index d8f8c2e6b..594e923be 100644 --- a/store/sql_post_store_test.go +++ b/store/sql_post_store_test.go @@ -923,6 +923,14 @@ func TestPostStoreGetFlaggedPosts(t *testing.T) { o2 = (<-store.Post().Save(o2)).Data.(*model.Post) time.Sleep(2 * time.Millisecond) + o3 := &model.Post{} + o3.ChannelId = o1.ChannelId + o3.UserId = model.NewId() + o3.Message = "a" + model.NewId() + "b" + o3.DeleteAt = 1 + o3 = (<-store.Post().Save(o3)).Data.(*model.Post) + time.Sleep(2 * time.Millisecond) + r1 := (<-store.Post().GetFlaggedPosts(o1.ChannelId, 0, 2)).Data.(*model.PostList) if len(r1.Order) != 0 { @@ -968,4 +976,19 @@ func TestPostStoreGetFlaggedPosts(t *testing.T) { if len(r4.Order) != 2 { t.Fatal("should have 2 posts") } + + preferences = model.Preferences{ + { + UserId: o1.UserId, + Category: model.PREFERENCE_CATEGORY_FLAGGED_POST, + Name: o3.Id, + Value: "true", + }, + } + + Must(store.Preference().Save(&preferences)) + + if len(r4.Order) != 2 { + t.Fatal("should have 2 posts") + } } diff --git a/webapp/components/post_view/components/post_info.jsx b/webapp/components/post_view/components/post_info.jsx index d48d97ba1..e95afe3ed 100644 --- a/webapp/components/post_view/components/post_info.jsx +++ b/webapp/components/post_view/components/post_info.jsx @@ -336,6 +336,26 @@ export default class PostInfo extends React.Component { flagFunc = this.flagPost; } + let flagTrigger; + if (!Utils.isPostEphemeral(post)) { + flagTrigger = ( + <OverlayTrigger + key={'flagtooltipkey' + flagVisible} + delayShow={Constants.OVERLAY_TIME_DELAY} + placement='top' + overlay={flagTooltip} + > + <a + href='#' + className={'flag-icon__container ' + flagVisible} + onClick={flagFunc} + > + {flag} + </a> + </OverlayTrigger> + ); + } + return ( <ul className='post__header--info'> <li className='col'> @@ -345,20 +365,7 @@ export default class PostInfo extends React.Component { compactDisplay={this.props.compactDisplay} useMilitaryTime={this.props.useMilitaryTime} /> - <OverlayTrigger - key={'flagtooltipkey' + flagVisible} - delayShow={Constants.OVERLAY_TIME_DELAY} - placement='top' - overlay={flagTooltip} - > - <a - href='#' - className={'flag-icon__container ' + flagVisible} - onClick={flagFunc} - > - {flag} - </a> - </OverlayTrigger> + {flagTrigger} </li> {options} </ul> diff --git a/webapp/components/rhs_comment.jsx b/webapp/components/rhs_comment.jsx index 92182e27a..05df1ac5f 100644 --- a/webapp/components/rhs_comment.jsx +++ b/webapp/components/rhs_comment.jsx @@ -330,6 +330,26 @@ export default class RhsComment extends React.Component { flagFunc = this.flagPost; } + let flagTrigger; + if (!Utils.isPostEphemeral(post)) { + flagTrigger = ( + <OverlayTrigger + key={'commentflagtooltipkey' + flagVisible} + delayShow={Constants.OVERLAY_TIME_DELAY} + placement='top' + overlay={flagTooltip} + > + <a + href='#' + className={'flag-icon__container ' + flagVisible} + onClick={flagFunc} + > + {flag} + </a> + </OverlayTrigger> + ); + } + return ( <div className={'post post--thread ' + currentUserCss + ' ' + compactClass}> <div className='post__content'> @@ -352,20 +372,7 @@ export default class RhsComment extends React.Component { minute='2-digit' /> </time> - <OverlayTrigger - key={'commentflagtooltipkey' + flagVisible} - delayShow={Constants.OVERLAY_TIME_DELAY} - placement='top' - overlay={flagTooltip} - > - <a - href='#' - className={'flag-icon__container ' + flagVisible} - onClick={flagFunc} - > - {flag} - </a> - </OverlayTrigger> + {flagTrigger} </li> <li className='col col__reply'> {dropdown} |