summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSaturnino Abril <saturnino.abril@gmail.com>2017-03-31 22:58:47 +0900
committerChristopher Speller <crspeller@gmail.com>2017-03-31 09:58:47 -0400
commit5d56fbb036cc7044eae639c92836e0b14ffe7dab (patch)
treeb497427cc50b4ca80694bde93e81878458660e0b
parent5f6d50bff1b4098bc0ef3c120e7b12104e5c4894 (diff)
downloadchat-5d56fbb036cc7044eae639c92836e0b14ffe7dab.tar.gz
chat-5d56fbb036cc7044eae639c92836e0b14ffe7dab.tar.bz2
chat-5d56fbb036cc7044eae639c92836e0b14ffe7dab.zip
APIv4 POST /posts/{post_id/pin & unpin (#5906)
* APIv4 get /posts/{post_id}/pin & unpin * remove PinnedPost from api test helper
-rw-r--r--api4/post.go34
-rw-r--r--api4/post_test.go70
-rw-r--r--model/client4.go20
3 files changed, 124 insertions, 0 deletions
diff --git a/api4/post.go b/api4/post.go
index 9c671ec21..f16a1ba3d 100644
--- a/api4/post.go
+++ b/api4/post.go
@@ -26,6 +26,8 @@ func InitPost() {
BaseRoutes.Team.Handle("/posts/search", ApiSessionRequired(searchPosts)).Methods("POST")
BaseRoutes.Post.Handle("", ApiSessionRequired(updatePost)).Methods("PUT")
BaseRoutes.Post.Handle("/patch", ApiSessionRequired(patchPost)).Methods("PUT")
+ BaseRoutes.Post.Handle("/pin", ApiSessionRequired(pinPost)).Methods("POST")
+ BaseRoutes.Post.Handle("/unpin", ApiSessionRequired(unpinPost)).Methods("POST")
}
func createPost(c *Context, w http.ResponseWriter, r *http.Request) {
@@ -274,6 +276,38 @@ func patchPost(c *Context, w http.ResponseWriter, r *http.Request) {
w.Write([]byte(patchedPost.ToJson()))
}
+func saveIsPinnedPost(c *Context, w http.ResponseWriter, r *http.Request, isPinned bool) {
+ c.RequirePostId()
+ if c.Err != nil {
+ return
+ }
+
+ if !app.SessionHasPermissionToChannelByPost(c.Session, c.Params.PostId, model.PERMISSION_READ_CHANNEL) {
+ c.SetPermissionError(model.PERMISSION_READ_CHANNEL)
+ return
+ }
+
+ patch := &model.PostPatch{}
+ patch.IsPinned = new(bool)
+ *patch.IsPinned = isPinned
+
+ _, err := app.PatchPost(c.Params.PostId, patch)
+ if err != nil {
+ c.Err = err
+ return
+ }
+
+ ReturnStatusOK(w)
+}
+
+func pinPost(c *Context, w http.ResponseWriter, r *http.Request) {
+ saveIsPinnedPost(c, w, r, true)
+}
+
+func unpinPost(c *Context, w http.ResponseWriter, r *http.Request) {
+ saveIsPinnedPost(c, w, r, false)
+}
+
func getFileInfosForPost(c *Context, w http.ResponseWriter, r *http.Request) {
c.RequirePostId()
if c.Err != nil {
diff --git a/api4/post_test.go b/api4/post_test.go
index bf896f081..562136ca9 100644
--- a/api4/post_test.go
+++ b/api4/post_test.go
@@ -270,6 +270,76 @@ func TestPatchPost(t *testing.T) {
CheckNoError(t, resp)
}
+func TestPinPost(t *testing.T) {
+ th := Setup().InitBasic().InitSystemAdmin()
+ defer TearDown()
+ Client := th.Client
+
+ post := th.BasicPost
+ pass, resp := Client.PinPost(post.Id)
+ CheckNoError(t, resp)
+
+ if !pass {
+ t.Fatal("should have passed")
+ }
+
+ if rpost, err := app.GetSinglePost(post.Id); err != nil && rpost.IsPinned != true {
+ t.Fatal("failed to pin post")
+ }
+
+ pass, resp = Client.PinPost("junk")
+ CheckBadRequestStatus(t, resp)
+
+ if pass {
+ t.Fatal("should have failed")
+ }
+
+ _, resp = Client.PinPost(GenerateTestId())
+ CheckForbiddenStatus(t, resp)
+
+ Client.Logout()
+ _, resp = Client.PinPost(post.Id)
+ CheckUnauthorizedStatus(t, resp)
+
+ _, resp = th.SystemAdminClient.PinPost(post.Id)
+ CheckNoError(t, resp)
+}
+
+func TestUnpinPost(t *testing.T) {
+ th := Setup().InitBasic().InitSystemAdmin()
+ defer TearDown()
+ Client := th.Client
+
+ pinnedPost := th.CreatePinnedPost()
+ pass, resp := Client.UnpinPost(pinnedPost.Id)
+ CheckNoError(t, resp)
+
+ if !pass {
+ t.Fatal("should have passed")
+ }
+
+ if rpost, err := app.GetSinglePost(pinnedPost.Id); err != nil && rpost.IsPinned != false {
+ t.Fatal("failed to pin post")
+ }
+
+ pass, resp = Client.UnpinPost("junk")
+ CheckBadRequestStatus(t, resp)
+
+ if pass {
+ t.Fatal("should have failed")
+ }
+
+ _, resp = Client.UnpinPost(GenerateTestId())
+ CheckForbiddenStatus(t, resp)
+
+ Client.Logout()
+ _, resp = Client.UnpinPost(pinnedPost.Id)
+ CheckUnauthorizedStatus(t, resp)
+
+ _, resp = th.SystemAdminClient.UnpinPost(pinnedPost.Id)
+ CheckNoError(t, resp)
+}
+
func TestGetPostsForChannel(t *testing.T) {
th := Setup().InitBasic().InitSystemAdmin()
defer TearDown()
diff --git a/model/client4.go b/model/client4.go
index a43950a68..e62ce57bd 100644
--- a/model/client4.go
+++ b/model/client4.go
@@ -1249,6 +1249,26 @@ func (c *Client4) PatchPost(postId string, patch *PostPatch) (*Post, *Response)
}
}
+// PinPost pin a post based on provided post id string.
+func (c *Client4) PinPost(postId string) (bool, *Response) {
+ if r, err := c.DoApiPost(c.GetPostRoute(postId)+"/pin", ""); err != nil {
+ return false, &Response{StatusCode: r.StatusCode, Error: err}
+ } else {
+ defer closeBody(r)
+ return CheckStatusOK(r), BuildResponse(r)
+ }
+}
+
+// UnpinPost unpin a post based on provided post id string.
+func (c *Client4) UnpinPost(postId string) (bool, *Response) {
+ if r, err := c.DoApiPost(c.GetPostRoute(postId)+"/unpin", ""); err != nil {
+ return false, &Response{StatusCode: r.StatusCode, Error: err}
+ } else {
+ defer closeBody(r)
+ return CheckStatusOK(r), BuildResponse(r)
+ }
+}
+
// GetPost gets a single post.
func (c *Client4) GetPost(postId string, etag string) (*Post, *Response) {
if r, err := c.DoApiGet(c.GetPostRoute(postId), etag); err != nil {