diff --git a/api4/post.go b/api4/post.go index 7926edfa087..5aecbe0baba 100644 --- a/api4/post.go +++ b/api4/post.go @@ -10,6 +10,7 @@ import ( "time" "github.com/mattermost/mattermost-server/v5/app" + "github.com/mattermost/mattermost-server/v5/mlog" "github.com/mattermost/mattermost-server/v5/model" ) @@ -67,7 +68,20 @@ func createPost(c *Context, w http.ResponseWriter, r *http.Request) { return } - c.App.SetStatusOnline(c.App.Session.UserId, false) + setOnline := r.URL.Query().Get("set_online") + setOnlineBool := true // By default, always set online. + var err2 error + if setOnline != "" { + setOnlineBool, err2 = strconv.ParseBool(setOnline) + if err2 != nil { + mlog.Warn("Failed to parse set_online URL query parameter from createPost request", mlog.Err(err2)) + setOnlineBool = true // Set online nevertheless. + } + } + if setOnlineBool { + c.App.SetStatusOnline(c.App.Session.UserId, false) + } + c.App.UpdateLastActivityAtIfNeeded(c.App.Session) w.WriteHeader(http.StatusCreated) diff --git a/api4/post_test.go b/api4/post_test.go index a7c213a5e58..cc93d7cea98 100644 --- a/api4/post_test.go +++ b/api4/post_test.go @@ -525,6 +525,41 @@ func TestCreatePostSendOutOfChannelMentions(t *testing.T) { } } +func TestCreatePostCheckOnlineStatus(t *testing.T) { + th := Setup().InitBasic() + defer th.TearDown() + + api := Init(th.Server, th.Server.AppOptions, th.Server.Router) + session, _ := th.App.GetSession(th.Client.AuthToken) + + handler := api.ApiHandler(createPost) + resp := httptest.NewRecorder() + post := &model.Post{ + ChannelId: th.BasicChannel.Id, + Message: "some message", + } + + req := httptest.NewRequest("POST", "/api/v4/posts?set_online=false", strings.NewReader(post.ToJson())) + req.Header.Set(model.HEADER_AUTH, "Bearer "+session.Token) + + handler.ServeHTTP(resp, req) + assert.Equal(t, http.StatusCreated, resp.Code) + + _, err := th.App.GetStatus(th.BasicUser.Id) + require.NotNil(t, err) + assert.Equal(t, "store.sql_status.get.missing.app_error", err.Id) + + req = httptest.NewRequest("POST", "/api/v4/posts", strings.NewReader(post.ToJson())) + req.Header.Set(model.HEADER_AUTH, "Bearer "+session.Token) + + handler.ServeHTTP(resp, req) + assert.Equal(t, http.StatusCreated, resp.Code) + + st, err := th.App.GetStatus(th.BasicUser.Id) + require.Nil(t, err) + assert.Equal(t, "online", st.Status) +} + func TestUpdatePost(t *testing.T) { th := Setup().InitBasic() defer th.TearDown()