diff options
Diffstat (limited to 'internal/processing')
-rw-r--r-- | internal/processing/account/delete.go | 39 | ||||
-rw-r--r-- | internal/processing/blocks.go | 96 |
2 files changed, 68 insertions, 67 deletions
diff --git a/internal/processing/account/delete.go b/internal/processing/account/delete.go index 2a20ec96e..a613ba485 100644 --- a/internal/processing/account/delete.go +++ b/internal/processing/account/delete.go @@ -20,7 +20,6 @@ package account import ( "context" "errors" - "fmt" "net" "time" @@ -114,38 +113,38 @@ func (p *Processor) DeleteSelf(ctx context.Context, account *gtsmodel.Account) g func (p *Processor) deleteUserAndTokensForAccount(ctx context.Context, account *gtsmodel.Account) error { user, err := p.state.DB.GetUserByAccountID(ctx, account.ID) if err != nil { - return fmt.Errorf("deleteUserAndTokensForAccount: db error getting user: %w", err) + return gtserror.Newf("db error getting user: %w", err) } tokens := []*gtsmodel.Token{} if err := p.state.DB.GetWhere(ctx, []db.Where{{Key: "user_id", Value: user.ID}}, &tokens); err != nil { - return fmt.Errorf("deleteUserAndTokensForAccount: db error getting tokens: %w", err) + return gtserror.Newf("db error getting tokens: %w", err) } for _, t := range tokens { // Delete any OAuth clients associated with this token. if err := p.state.DB.DeleteByID(ctx, t.ClientID, &[]*gtsmodel.Client{}); err != nil { - return fmt.Errorf("deleteUserAndTokensForAccount: db error deleting client: %w", err) + return gtserror.Newf("db error deleting client: %w", err) } // Delete any OAuth applications associated with this token. if err := p.state.DB.DeleteWhere(ctx, []db.Where{{Key: "client_id", Value: t.ClientID}}, &[]*gtsmodel.Application{}); err != nil { - return fmt.Errorf("deleteUserAndTokensForAccount: db error deleting application: %w", err) + return gtserror.Newf("db error deleting application: %w", err) } // Delete the token itself. if err := p.state.DB.DeleteByID(ctx, t.ID, t); err != nil { - return fmt.Errorf("deleteUserAndTokensForAccount: db error deleting token: %w", err) + return gtserror.Newf("db error deleting token: %w", err) } } columns, err := stubbifyUser(user) if err != nil { - return fmt.Errorf("deleteUserAndTokensForAccount: error stubbifying user: %w", err) + return gtserror.Newf("error stubbifying user: %w", err) } if err := p.state.DB.UpdateUser(ctx, user, columns...); err != nil { - return fmt.Errorf("deleteUserAndTokensForAccount: db error updating user: %w", err) + return gtserror.Newf("db error updating user: %w", err) } return nil @@ -160,24 +159,24 @@ func (p *Processor) deleteAccountFollows(ctx context.Context, account *gtsmodel. // Delete follows targeting this account. followedBy, err := p.state.DB.GetAccountFollowers(ctx, account.ID) if err != nil && !errors.Is(err, db.ErrNoEntries) { - return fmt.Errorf("deleteAccountFollows: db error getting follows targeting account %s: %w", account.ID, err) + return gtserror.Newf("db error getting follows targeting account %s: %w", account.ID, err) } for _, follow := range followedBy { if err := p.state.DB.DeleteFollowByID(ctx, follow.ID); err != nil { - return fmt.Errorf("deleteAccountFollows: db error unfollowing account followedBy: %w", err) + return gtserror.Newf("db error unfollowing account followedBy: %w", err) } } // Delete follow requests targeting this account. followRequestedBy, err := p.state.DB.GetAccountFollowRequests(ctx, account.ID) if err != nil && !errors.Is(err, db.ErrNoEntries) { - return fmt.Errorf("deleteAccountFollows: db error getting follow requests targeting account %s: %w", account.ID, err) + return gtserror.Newf("db error getting follow requests targeting account %s: %w", account.ID, err) } for _, followRequest := range followRequestedBy { if err := p.state.DB.DeleteFollowRequestByID(ctx, followRequest.ID); err != nil { - return fmt.Errorf("deleteAccountFollows: db error unfollowing account followRequestedBy: %w", err) + return gtserror.Newf("db error unfollowing account followRequestedBy: %w", err) } } @@ -193,14 +192,14 @@ func (p *Processor) deleteAccountFollows(ctx context.Context, account *gtsmodel. // Delete follows originating from this account. following, err := p.state.DB.GetAccountFollows(ctx, account.ID) if err != nil && !errors.Is(err, db.ErrNoEntries) { - return fmt.Errorf("deleteAccountFollows: db error getting follows owned by account %s: %w", account.ID, err) + return gtserror.Newf("db error getting follows owned by account %s: %w", account.ID, err) } // For each follow owned by this account, unfollow // and process side effects (noop if remote account). for _, follow := range following { if err := p.state.DB.DeleteFollowByID(ctx, follow.ID); err != nil { - return fmt.Errorf("deleteAccountFollows: db error unfollowing account: %w", err) + return gtserror.Newf("db error unfollowing account: %w", err) } if msg := unfollowSideEffects(ctx, account, follow); msg != nil { // There was a side effect to process. @@ -211,14 +210,14 @@ func (p *Processor) deleteAccountFollows(ctx context.Context, account *gtsmodel. // Delete follow requests originating from this account. followRequesting, err := p.state.DB.GetAccountFollowRequesting(ctx, account.ID) if err != nil && !errors.Is(err, db.ErrNoEntries) { - return fmt.Errorf("deleteAccountFollows: db error getting follow requests owned by account %s: %w", account.ID, err) + return gtserror.Newf("db error getting follow requests owned by account %s: %w", account.ID, err) } // For each follow owned by this account, unfollow // and process side effects (noop if remote account). for _, followRequest := range followRequesting { if err := p.state.DB.DeleteFollowRequestByID(ctx, followRequest.ID); err != nil { - return fmt.Errorf("deleteAccountFollows: db error unfollowingRequesting account: %w", err) + return gtserror.Newf("db error unfollowingRequesting account: %w", err) } // Dummy out a follow so our side effects func @@ -279,7 +278,7 @@ func (p *Processor) unfollowSideEffectsFunc(deletedAccount *gtsmodel.Account) fu func (p *Processor) deleteAccountBlocks(ctx context.Context, account *gtsmodel.Account) error { if err := p.state.DB.DeleteAccountBlocks(ctx, account.ID); err != nil { - return fmt.Errorf("deleteAccountBlocks: db error deleting account blocks for %s: %w", account.ID, err) + return gtserror.Newf("db error deleting account blocks for %s: %w", account.ID, err) } return nil } @@ -333,7 +332,7 @@ statusLoop: // Look for any boosts of this status in DB. boosts, err := p.state.DB.GetStatusReblogs(ctx, status) if err != nil && !errors.Is(err, db.ErrNoEntries) { - return fmt.Errorf("deleteAccountStatuses: error fetching status reblogs for %s: %w", status.ID, err) + return gtserror.Newf("error fetching status reblogs for %s: %w", status.ID, err) } for _, boost := range boosts { @@ -347,7 +346,7 @@ statusLoop: log.WithContext(ctx).WithField("boost", boost).Warnf("no account found with id %s for boost %s", boost.AccountID, boost.ID) continue } - return fmt.Errorf("deleteAccountStatuses: error fetching boosted status account for %s: %w", boost.AccountID, err) + return gtserror.Newf("error fetching boosted status account for %s: %w", boost.AccountID, err) } // Set account model @@ -505,7 +504,7 @@ func stubbifyUser(user *gtsmodel.User) ([]string, error) { return nil, err } - var never = time.Time{} + never := time.Time{} user.EncryptedPassword = string(dummyPassword) user.SignUpIP = net.IPv4zero diff --git a/internal/processing/blocks.go b/internal/processing/blocks.go index 644f28ca9..8996dff92 100644 --- a/internal/processing/blocks.go +++ b/internal/processing/blocks.go @@ -19,69 +19,71 @@ package processing import ( "context" - "fmt" - "net/url" + "errors" apimodel "github.com/superseriousbusiness/gotosocial/internal/api/model" - "github.com/superseriousbusiness/gotosocial/internal/config" "github.com/superseriousbusiness/gotosocial/internal/db" "github.com/superseriousbusiness/gotosocial/internal/gtserror" - "github.com/superseriousbusiness/gotosocial/internal/oauth" + "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" + "github.com/superseriousbusiness/gotosocial/internal/log" + "github.com/superseriousbusiness/gotosocial/internal/paging" + "github.com/superseriousbusiness/gotosocial/internal/util" ) -func (p *Processor) BlocksGet(ctx context.Context, authed *oauth.Auth, maxID string, sinceID string, limit int) (*apimodel.BlocksResponse, gtserror.WithCode) { - accounts, nextMaxID, prevMinID, err := p.state.DB.GetAccountBlocks(ctx, authed.Account.ID, maxID, sinceID, limit) - if err != nil { - if err == db.ErrNoEntries { - // there are just no entries - return &apimodel.BlocksResponse{ - Accounts: []*apimodel.Account{}, - }, nil - } - // there's an actual error +// BlocksGet ... +func (p *Processor) BlocksGet( + ctx context.Context, + requestingAccount *gtsmodel.Account, + page paging.Pager, +) (*apimodel.PageableResponse, gtserror.WithCode) { + blocks, err := p.state.DB.GetAccountBlocks(ctx, + requestingAccount.ID, + &page, + ) + if err != nil && !errors.Is(err, db.ErrNoEntries) { return nil, gtserror.NewErrorInternalError(err) } - apiAccounts := []*apimodel.Account{} - for _, a := range accounts { - apiAccount, err := p.tc.AccountToAPIAccountBlocked(ctx, a) - if err != nil { - continue - } - apiAccounts = append(apiAccounts, apiAccount) + // Check for zero length. + count := len(blocks) + if len(blocks) == 0 { + return util.EmptyPageableResponse(), nil } - return p.packageBlocksResponse(apiAccounts, "/api/v1/blocks", nextMaxID, prevMinID, limit) -} + var ( + items = make([]interface{}, 0, count) -func (p *Processor) packageBlocksResponse(accounts []*apimodel.Account, path string, nextMaxID string, prevMinID string, limit int) (*apimodel.BlocksResponse, gtserror.WithCode) { - resp := &apimodel.BlocksResponse{ - Accounts: []*apimodel.Account{}, - } - resp.Accounts = accounts + // Set next + prev values before API converting + // so the caller can still page even on error. + nextMaxIDValue = blocks[count-1].ID + prevMinIDValue = blocks[0].ID + ) - // prepare the next and previous links - if len(accounts) != 0 { - protocol := config.GetProtocol() - host := config.GetHost() - - nextLink := &url.URL{ - Scheme: protocol, - Host: host, - Path: path, - RawQuery: fmt.Sprintf("limit=%d&max_id=%s", limit, nextMaxID), + for _, block := range blocks { + if block.TargetAccount == nil { + // All models should be populated at this point. + log.Warnf(ctx, "block target account was nil: %v", err) + continue } - next := fmt.Sprintf("<%s>; rel=\"next\"", nextLink.String()) - prevLink := &url.URL{ - Scheme: protocol, - Host: host, - Path: path, - RawQuery: fmt.Sprintf("limit=%d&min_id=%s", limit, prevMinID), + // Convert target account to frontend API model. + account, err := p.tc.AccountToAPIAccountBlocked(ctx, block.TargetAccount) + if err != nil { + log.Errorf(ctx, "error converting account to public api account: %v", err) + continue } - prev := fmt.Sprintf("<%s>; rel=\"prev\"", prevLink.String()) - resp.LinkHeader = fmt.Sprintf("%s, %s", next, prev) + + // Append target to return items. + items = append(items, account) } - return resp, nil + return util.PackagePageableResponse(util.PageableResponseParams{ + Items: items, + Path: "/api/v1/blocks", + NextMaxIDKey: "max_id", + PrevMinIDKey: "since_id", + NextMaxIDValue: nextMaxIDValue, + PrevMinIDValue: prevMinIDValue, + Limit: page.Limit, + }) } |