From 6f6e89e2715c9ecbadda6b8dbe5227995348dae8 Mon Sep 17 00:00:00 2001 From: tobi <31960611+tsmethurst@users.noreply.github.com> Date: Wed, 8 Jun 2022 20:22:49 +0200 Subject: [feature] Add paging via `Link` header for notifications and account statuses (#629) * test link headers * page get account statuses properly * page get notifications * add util func for packaging timeline responses * return timelined stuff from accountstatusesget * rename timeline response * use new convenience function * go fmt --- internal/api/client/account/statuses.go | 7 +++-- internal/api/client/account/statuses_test.go | 44 +++++++++++++++++++++++++++- 2 files changed, 48 insertions(+), 3 deletions(-) (limited to 'internal/api/client/account') diff --git a/internal/api/client/account/statuses.go b/internal/api/client/account/statuses.go index b440e582a..18b551fcc 100644 --- a/internal/api/client/account/statuses.go +++ b/internal/api/client/account/statuses.go @@ -222,12 +222,15 @@ func (m *Module) AccountStatusesGETHandler(c *gin.Context) { publicOnly = i } - statuses, errWithCode := m.processor.AccountStatusesGet(c.Request.Context(), authed, targetAcctID, limit, excludeReplies, excludeReblogs, maxID, minID, pinnedOnly, mediaOnly, publicOnly) + resp, errWithCode := m.processor.AccountStatusesGet(c.Request.Context(), authed, targetAcctID, limit, excludeReplies, excludeReblogs, maxID, minID, pinnedOnly, mediaOnly, publicOnly) if errWithCode != nil { l.Debugf("error from processor account statuses get: %s", errWithCode) c.JSON(errWithCode.Code(), gin.H{"error": errWithCode.Safe()}) return } - c.JSON(http.StatusOK, statuses) + if resp.LinkHeader != "" { + c.Header("Link", resp.LinkHeader) + } + c.JSON(http.StatusOK, resp.Items) } diff --git a/internal/api/client/account/statuses_test.go b/internal/api/client/account/statuses_test.go index 0e95d47fc..1f935896c 100644 --- a/internal/api/client/account/statuses_test.go +++ b/internal/api/client/account/statuses_test.go @@ -37,7 +37,47 @@ type AccountStatusesTestSuite struct { AccountStandardTestSuite } -func (suite *AccountStatusesTestSuite) TestGetStatusesMediaOnly() { +func (suite *AccountStatusesTestSuite) TestGetStatusesPublicOnly() { + // set up the request + // we're getting statuses of admin + targetAccount := suite.testAccounts["admin_account"] + recorder := httptest.NewRecorder() + ctx := suite.newContext(recorder, http.MethodGet, nil, fmt.Sprintf("/api/v1/accounts/%s/statuses?limit=20&only_media=false&only_public=true", targetAccount.ID), "") + ctx.Params = gin.Params{ + gin.Param{ + Key: account.IDKey, + Value: targetAccount.ID, + }, + } + + // call the handler + suite.accountModule.AccountStatusesGETHandler(ctx) + + // 1. we should have OK because our request was valid + suite.Equal(http.StatusOK, recorder.Code) + + // 2. we should have no error message in the result body + result := recorder.Result() + defer result.Body.Close() + + // check the response + b, err := ioutil.ReadAll(result.Body) + assert.NoError(suite.T(), err) + + // unmarshal the returned statuses + apimodelStatuses := []*apimodel.Status{} + err = json.Unmarshal(b, &apimodelStatuses) + suite.NoError(err) + suite.NotEmpty(apimodelStatuses) + + for _, s := range apimodelStatuses { + suite.Equal(apimodel.VisibilityPublic, s.Visibility) + } + + suite.Equal(`; rel="next", ; rel="prev"`, result.Header.Get("link")) +} + +func (suite *AccountStatusesTestSuite) TestGetStatusesPublicOnlyMediaOnly() { // set up the request // we're getting statuses of admin targetAccount := suite.testAccounts["admin_account"] @@ -74,6 +114,8 @@ func (suite *AccountStatusesTestSuite) TestGetStatusesMediaOnly() { suite.NotEmpty(s.MediaAttachments) suite.Equal(apimodel.VisibilityPublic, s.Visibility) } + + suite.Equal(`; rel="next", ; rel="prev"`, result.Header.Get("link")) } func TestAccountStatusesTestSuite(t *testing.T) { -- cgit v1.2.3