diff --git a/internal/api/client/tokens/tokens.go b/internal/api/client/tokens/tokens.go index ce00a6459..aadaf72c2 100644 --- a/internal/api/client/tokens/tokens.go +++ b/internal/api/client/tokens/tokens.go @@ -43,6 +43,6 @@ func New(processor *processing.Processor) *Module { func (m *Module) Route(attachHandler func(method string, path string, f ...gin.HandlerFunc) gin.IRoutes) { attachHandler(http.MethodGet, BasePath, m.TokensInfoGETHandler) - attachHandler(http.MethodGet, BasePathWithID, m.TokensInfoGETHandler) + attachHandler(http.MethodGet, BasePathWithID, m.TokenInfoGETHandler) attachHandler(http.MethodPost, InvalidateTokenPath, m.TokenInvalidatePOSTHandler) } diff --git a/internal/api/client/tokens/tokensget.go b/internal/api/client/tokens/tokensget.go index 15fc5511f..5c92beccc 100644 --- a/internal/api/client/tokens/tokensget.go +++ b/internal/api/client/tokens/tokensget.go @@ -117,9 +117,9 @@ func (m *Module) TokensInfoGETHandler(c *gin.Context) { } page, errWithCode := paging.ParseIDPage(c, - 0, // min limit - 80, // max limit - 20, // default limit + 0, // min limit + 100, // max limit + 25, // default limit ) if errWithCode != nil { apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1) diff --git a/internal/db/bundb/application.go b/internal/db/bundb/application.go index 1a600d620..562614e5e 100644 --- a/internal/db/bundb/application.go +++ b/internal/db/bundb/application.go @@ -19,8 +19,10 @@ package bundb import ( "context" + "errors" "slices" + "github.com/superseriousbusiness/gotosocial/internal/db" "github.com/superseriousbusiness/gotosocial/internal/gtserror" "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" "github.com/superseriousbusiness/gotosocial/internal/paging" @@ -409,8 +411,11 @@ func (a *applicationDB) UpdateToken(ctx context.Context, token *gtsmodel.Token, } func (a *applicationDB) DeleteTokenByID(ctx context.Context, id string) error { + var token gtsmodel.Token + token.ID = id + _, err := a.db.NewDelete(). - Table("tokens"). + Model(&token). Where("? = ?", bun.Ident("id"), id). Exec(ctx) if err != nil { @@ -418,68 +423,79 @@ func (a *applicationDB) DeleteTokenByID(ctx context.Context, id string) error { } a.state.Caches.DB.Token.Invalidate("ID", id) + a.state.Caches.OnInvalidateToken(&token) return nil } func (a *applicationDB) DeleteTokenByCode(ctx context.Context, code string) error { + var token gtsmodel.Token + _, err := a.db.NewDelete(). - Table("tokens"). + Model(&token). Where("? = ?", bun.Ident("code"), code). + Returning("?", bun.Ident("id")). Exec(ctx) - if err != nil { + if err != nil && !errors.Is(err, db.ErrNoEntries) { return err } a.state.Caches.DB.Token.Invalidate("Code", code) + a.state.Caches.OnInvalidateToken(&token) return nil } func (a *applicationDB) DeleteTokenByAccess(ctx context.Context, access string) error { + var token gtsmodel.Token + _, err := a.db.NewDelete(). - Table("tokens"). + Model(&token). Where("? = ?", bun.Ident("access"), access). + Returning("?", bun.Ident("id")). Exec(ctx) - if err != nil { + if err != nil && !errors.Is(err, db.ErrNoEntries) { return err } a.state.Caches.DB.Token.Invalidate("Access", access) + a.state.Caches.OnInvalidateToken(&token) return nil } func (a *applicationDB) DeleteTokenByRefresh(ctx context.Context, refresh string) error { + var token gtsmodel.Token + _, err := a.db.NewDelete(). - Table("tokens"). + Model(&token). Where("? = ?", bun.Ident("refresh"), refresh). + Returning("?", bun.Ident("id")). Exec(ctx) - if err != nil { + if err != nil && !errors.Is(err, db.ErrNoEntries) { return err } a.state.Caches.DB.Token.Invalidate("Refresh", refresh) + a.state.Caches.OnInvalidateToken(&token) return nil } func (a *applicationDB) DeleteTokensByClientID(ctx context.Context, clientID string) error { + var tokens []*gtsmodel.Token + // Delete tokens owned by // clientID and gather token IDs. - var tokenIDs []string - if _, err := a.db. - NewDelete(). - Table("tokens"). + if _, err := a.db.NewDelete(). + Model(&tokens). Where("? = ?", bun.Ident("client_id"), clientID). - Returning("id"). - Exec(ctx, &tokenIDs); err != nil { + Returning("?", bun.Ident("id")). + Exec(ctx); err != nil && !errors.Is(err, db.ErrNoEntries) { return err } - if len(tokenIDs) == 0 { - // Nothing was deleted, - // nothing to invalidate. - return nil + // Invalidate all deleted tokens. + for _, token := range tokens { + a.state.Caches.DB.Token.Invalidate("ID", token.ID) + a.state.Caches.OnInvalidateToken(token) } - // Invalidate all deleted tokens. - a.state.Caches.DB.Token.InvalidateIDs("ID", tokenIDs) return nil } diff --git a/web/source/settings/views/user/tokens/search.tsx b/web/source/settings/views/user/tokens/search.tsx index 87080cc8f..8025c7bb5 100644 --- a/web/source/settings/views/user/tokens/search.tsx +++ b/web/source/settings/views/user/tokens/search.tsx @@ -36,7 +36,7 @@ export default function TokensSearchForm() { // Populate search form using values from // urlQueryParams, to allow paging. const form = { - limit: useTextInput("limit", { defaultValue: urlQueryParams.get("limit") ?? "20" }) + limit: useTextInput("limit", { defaultValue: urlQueryParams.get("limit") ?? "25" }) }; // On mount, trigger search. @@ -93,9 +93,10 @@ export default function TokensSearchForm() { label="Items per page" options={ <> - + - + + } >