summaryrefslogtreecommitdiff
path: root/internal/api
diff options
context:
space:
mode:
authorLibravatar kim <89579420+NyaaaWhatsUpDoc@users.noreply.github.com>2024-09-16 16:46:09 +0000
committerLibravatar GitHub <noreply@github.com>2024-09-16 16:46:09 +0000
commit84279f6a6a0201c90a6747fe8b82c38d5b4e49e2 (patch)
tree6c777c7ed4888d990533117d7e63376bcc23a3fb /internal/api
parent[chore] Refactor federatingDB.Undo, avoid 500 errors on Undo Like (#3310) (diff)
downloadgotosocial-84279f6a6a0201c90a6747fe8b82c38d5b4e49e2.tar.xz
[performance] cache more database calls, reduce required database calls overall (#3290)
* improvements to caching for lists and relationship to accounts / follows * fix nil panic in AddToList() * ensure list related caches are correctly invalidated * ensure returned ID lists are ordered correctly * bump go-structr to v0.8.9 (returns early if zero uncached keys to be loaded) * remove zero checks in uncached key load functions (go-structr now handles this) * fix issues after rebase on upstream/main * update the expected return order of CSV exports (since list entries are now down by entry creation date) * rename some funcs, allow deleting list entries for multiple follow IDs at a time, fix up more tests * use returning statements on delete to get cache invalidation info * fixes to recent database delete changes * fix broken list entries delete sql * remove unused db function * update remainder of delete functions to behave in similar way, some other small tweaks * fix delete user sql, allow returning on err no entries * uncomment + fix list database tests * update remaining list tests * update envparsing test * add comments to each specific key being invalidated * add more cache invalidation explanatory comments * whoops; actually delete poll votes from database in the DeletePollByID() func * remove added but-commented-out field * improved comment regarding paging being disabled * make cache invalidation comments match what's actually happening * fix up delete query comments to match what is happening * rename function to read a bit better * don't use ErrNoEntries on delete when not needed (it's only needed for a RETURNING call) * update function name in test * move list exclusivity check to AFTER eligibility check. use log.Panic() instead of panic() * use the poll_id column in poll_votes for selecting votes in poll ID * fix function name
Diffstat (limited to 'internal/api')
-rw-r--r--internal/api/client/exports/exports_test.go4
-rw-r--r--internal/api/client/lists/listaccounts.go36
-rw-r--r--internal/api/client/lists/listaccounts_test.go13
-rw-r--r--internal/api/client/lists/listaccountsadd_test.go7
4 files changed, 23 insertions, 37 deletions
diff --git a/internal/api/client/exports/exports_test.go b/internal/api/client/exports/exports_test.go
index 1943f2582..303361b86 100644
--- a/internal/api/client/exports/exports_test.go
+++ b/internal/api/client/exports/exports_test.go
@@ -188,8 +188,8 @@ admin@localhost:8080
token: suite.testTokens["local_account_1"],
user: suite.testUsers["local_account_1"],
account: suite.testAccounts["local_account_1"],
- expect: `Cool Ass Posters From This Instance,admin@localhost:8080
-Cool Ass Posters From This Instance,1happyturtle@localhost:8080
+ expect: `Cool Ass Posters From This Instance,1happyturtle@localhost:8080
+Cool Ass Posters From This Instance,admin@localhost:8080
`,
},
// Export Mutes.
diff --git a/internal/api/client/lists/listaccounts.go b/internal/api/client/lists/listaccounts.go
index e1d340ebb..d609251f7 100644
--- a/internal/api/client/lists/listaccounts.go
+++ b/internal/api/client/lists/listaccounts.go
@@ -25,6 +25,7 @@ import (
apiutil "github.com/superseriousbusiness/gotosocial/internal/api/util"
"github.com/superseriousbusiness/gotosocial/internal/gtserror"
"github.com/superseriousbusiness/gotosocial/internal/oauth"
+ "github.com/superseriousbusiness/gotosocial/internal/paging"
)
// ListAccountsGETHandler swagger:operation GET /api/v1/lists/{id}/accounts listAccounts
@@ -129,42 +130,27 @@ func (m *Module) ListAccountsGETHandler(c *gin.Context) {
targetListID := c.Param(IDKey)
if targetListID == "" {
- err := errors.New("no list id specified")
- apiutil.ErrorHandler(c, gtserror.NewErrorBadRequest(err, err.Error()), m.processor.InstanceGetV1)
- return
- }
-
- limit, errWithCode := apiutil.ParseLimit(c.Query(apiutil.LimitKey), 40, 80, 0)
- if errWithCode != nil {
+ const text = "no list id specified"
+ errWithCode := gtserror.NewErrorBadRequest(errors.New(text), text)
apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1)
return
}
- var (
- ctx = c.Request.Context()
+ page, errWithCode := paging.ParseIDPage(c,
+ 1, // min limit
+ 80, // max limit
+ 0, // default = paging disabled
)
-
- if limit == 0 {
- // Return all accounts in the list without pagination.
- accounts, errWithCode := m.processor.List().GetAllListAccounts(ctx, authed.Account, targetListID)
- if errWithCode != nil {
- apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1)
- return
- }
-
- c.JSON(http.StatusOK, accounts)
+ if errWithCode != nil {
+ apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1)
return
}
- // Return subset of accounts in the list with pagination.
resp, errWithCode := m.processor.List().GetListAccounts(
- ctx,
+ c.Request.Context(),
authed.Account,
targetListID,
- c.Query(MaxIDKey),
- c.Query(SinceIDKey),
- c.Query(MinIDKey),
- limit,
+ page,
)
if errWithCode != nil {
apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1)
diff --git a/internal/api/client/lists/listaccounts_test.go b/internal/api/client/lists/listaccounts_test.go
index bbd187f7d..e0a16e29f 100644
--- a/internal/api/client/lists/listaccounts_test.go
+++ b/internal/api/client/lists/listaccounts_test.go
@@ -19,7 +19,7 @@ package lists_test
import (
"encoding/json"
- "io/ioutil"
+ "io"
"net/http"
"net/http/httptest"
"strconv"
@@ -97,7 +97,7 @@ func (suite *ListAccountsTestSuite) getListAccounts(
result := recorder.Result()
defer result.Body.Close()
- b, err := ioutil.ReadAll(result.Body)
+ b, err := io.ReadAll(result.Body)
if err != nil {
return nil, "", err
}
@@ -151,8 +151,7 @@ func (suite *ListAccountsTestSuite) TestGetListAccountsPaginatedDefaultLimit() {
suite.Len(accounts, 2)
suite.Equal(
- `<http://localhost:8080/api/v1/lists/01H0G8E4Q2J3FE3JDWJVWEDCD1/accounts?limit=40&max_id=01H0G89MWVQE0M58VD2HQYMQWH>; rel="next", `+
- `<http://localhost:8080/api/v1/lists/01H0G8E4Q2J3FE3JDWJVWEDCD1/accounts?limit=40&min_id=01H0G8FFM1AGQDRNGBGGX8CYJQ>; rel="prev"`,
+ "<http://localhost:8080/api/v1/lists/01H0G8E4Q2J3FE3JDWJVWEDCD1/accounts?limit=40&max_id=01F8MH5NBDF2MV7CTC4Q5128HF>; rel=\"next\", <http://localhost:8080/api/v1/lists/01H0G8E4Q2J3FE3JDWJVWEDCD1/accounts?limit=40&min_id=01F8MH17FWEB39HZJ76B6VXSKF>; rel=\"prev\"",
link,
)
}
@@ -184,8 +183,7 @@ func (suite *ListAccountsTestSuite) TestGetListAccountsPaginatedNextPage() {
suite.Len(accounts, 1)
suite.Equal(
- `<http://localhost:8080/api/v1/lists/01H0G8E4Q2J3FE3JDWJVWEDCD1/accounts?limit=1&max_id=01H0G8FFM1AGQDRNGBGGX8CYJQ>; rel="next", `+
- `<http://localhost:8080/api/v1/lists/01H0G8E4Q2J3FE3JDWJVWEDCD1/accounts?limit=1&min_id=01H0G8FFM1AGQDRNGBGGX8CYJQ>; rel="prev"`,
+ "<http://localhost:8080/api/v1/lists/01H0G8E4Q2J3FE3JDWJVWEDCD1/accounts?limit=1&max_id=01F8MH17FWEB39HZJ76B6VXSKF>; rel=\"next\", <http://localhost:8080/api/v1/lists/01H0G8E4Q2J3FE3JDWJVWEDCD1/accounts?limit=1&min_id=01F8MH17FWEB39HZJ76B6VXSKF>; rel=\"prev\"",
link,
)
@@ -206,8 +204,7 @@ func (suite *ListAccountsTestSuite) TestGetListAccountsPaginatedNextPage() {
suite.Len(accounts, 1)
suite.Equal(
- `<http://localhost:8080/api/v1/lists/01H0G8E4Q2J3FE3JDWJVWEDCD1/accounts?limit=1&max_id=01H0G89MWVQE0M58VD2HQYMQWH>; rel="next", `+
- `<http://localhost:8080/api/v1/lists/01H0G8E4Q2J3FE3JDWJVWEDCD1/accounts?limit=1&min_id=01H0G89MWVQE0M58VD2HQYMQWH>; rel="prev"`,
+ "<http://localhost:8080/api/v1/lists/01H0G8E4Q2J3FE3JDWJVWEDCD1/accounts?limit=1&max_id=01F8MH17FWEB39HZJ76B6VXSKF>; rel=\"next\", <http://localhost:8080/api/v1/lists/01H0G8E4Q2J3FE3JDWJVWEDCD1/accounts?limit=1&min_id=01F8MH17FWEB39HZJ76B6VXSKF>; rel=\"prev\"",
link,
)
}
diff --git a/internal/api/client/lists/listaccountsadd_test.go b/internal/api/client/lists/listaccountsadd_test.go
index 7e44eeed3..e71cf0992 100644
--- a/internal/api/client/lists/listaccountsadd_test.go
+++ b/internal/api/client/lists/listaccountsadd_test.go
@@ -98,14 +98,17 @@ func (suite *ListAccountsAddTestSuite) TestPostListAccountNotFollowed() {
resp, err := suite.postListAccounts(http.StatusNotFound, listID, accountIDs)
suite.NoError(err)
- suite.Equal(`{"error":"Not Found: you do not follow account 01F8MH5ZK5VRH73AKHQM6Y9VNX"}`, string(resp))
+ suite.Equal(`{"error":"Not Found: account 01F8MH5ZK5VRH73AKHQM6Y9VNX not currently followed"}`, string(resp))
}
func (suite *ListAccountsAddTestSuite) TestPostListAccountOK() {
+ entry := suite.testListEntries["local_account_1_list_1_entry_1"]
+
// Remove turtle from the list.
if err := suite.db.DeleteListEntry(
context.Background(),
- suite.testListEntries["local_account_1_list_1_entry_1"].ID,
+ entry.ListID,
+ entry.FollowID,
); err != nil {
suite.FailNow(err.Error())
}