diff options
| author | 2023-03-20 19:10:08 +0100 | |
|---|---|---|
| committer | 2023-03-20 18:10:08 +0000 | |
| commit | e8595f0c64f527af0913d1a426b697e67ff74ac9 (patch) | |
| tree | a5d45b1ad8b96318944408a23fda91f008643900 /internal/processing/status/bookmark.go | |
| parent | [chore]: Bump github.com/miekg/dns from 1.1.51 to 1.1.52 (#1636) (diff) | |
| download | gotosocial-e8595f0c64f527af0913d1a426b697e67ff74ac9.tar.xz | |
[chore] Refactor account deleting/block logic, tidy up some other processing things (#1599)
* start refactoring account deletion
* update to use state.DB
* further messing about
* some more tidying up
* more tidying, cleaning, nice-making
* further adventures in refactoring and the woes of technical debt
* update fr accept/reject
* poking + prodding
* fix up deleting
* create fave uri
* don't log using requestingAccount.ID because it might be nil
* move getBookmarks function
* use exists query to check for status bookmark
* use deletenotifications func
* fiddle
* delete follow request notif
* split up some db functions
* Fix possible nil pointer panic
* fix more possible nil pointers
* fix license headers
* warn when follow missing (target) account
* return wrapped err when bookmark/fave models can't be retrieved
* simplify self account delete
* warn log likely race condition
* de-sillify status delete loop
* move error check due north
* warn when unfollowSideEffects has no target account
* warn when no boost account is found
* warn + dump follow when no account
* more warnings
* warn on fave account not set
* move for loop inside anonymous function
* fix funky logic
* don't remove mutual account items on block;
do make sure unfollow occurs in both directions!
Diffstat (limited to 'internal/processing/status/bookmark.go')
| -rw-r--r-- | internal/processing/status/bookmark.go | 108 |
1 files changed, 42 insertions, 66 deletions
diff --git a/internal/processing/status/bookmark.go b/internal/processing/status/bookmark.go index 3324273d7..ea386b183 100644 --- a/internal/processing/status/bookmark.go +++ b/internal/processing/status/bookmark.go @@ -31,91 +31,67 @@ import ( // BookmarkCreate adds a bookmark for the requestingAccount, targeting the given status (no-op if bookmark already exists). func (p *Processor) BookmarkCreate(ctx context.Context, requestingAccount *gtsmodel.Account, targetStatusID string) (*apimodel.Status, gtserror.WithCode) { - targetStatus, err := p.state.DB.GetStatusByID(ctx, targetStatusID) - if err != nil { - return nil, gtserror.NewErrorNotFound(fmt.Errorf("error fetching status %s: %s", targetStatusID, err)) - } - if targetStatus.Account == nil { - return nil, gtserror.NewErrorNotFound(fmt.Errorf("no status owner for status %s", targetStatusID)) - } - visible, err := p.filter.StatusVisible(ctx, targetStatus, requestingAccount) - if err != nil { - return nil, gtserror.NewErrorNotFound(fmt.Errorf("error seeing if status %s is visible: %s", targetStatus.ID, err)) - } - if !visible { - return nil, gtserror.NewErrorNotFound(errors.New("status is not visible")) + targetStatus, existingBookmarkID, errWithCode := p.getBookmarkTarget(ctx, requestingAccount, targetStatusID) + if errWithCode != nil { + return nil, errWithCode } - // first check if the status is already bookmarked, if so we don't need to do anything - newBookmark := true - gtsBookmark := >smodel.StatusBookmark{} - if err := p.state.DB.GetWhere(ctx, []db.Where{{Key: "status_id", Value: targetStatus.ID}, {Key: "account_id", Value: requestingAccount.ID}}, gtsBookmark); err == nil { - // we already have a bookmark for this status - newBookmark = false + if existingBookmarkID != "" { + // Status is already bookmarked. + return p.apiStatus(ctx, targetStatus, requestingAccount) } - if newBookmark { - // we need to create a new bookmark in the database - gtsBookmark := >smodel.StatusBookmark{ - ID: id.NewULID(), - AccountID: requestingAccount.ID, - Account: requestingAccount, - TargetAccountID: targetStatus.AccountID, - TargetAccount: targetStatus.Account, - StatusID: targetStatus.ID, - Status: targetStatus, - } - - if err := p.state.DB.Put(ctx, gtsBookmark); err != nil { - return nil, gtserror.NewErrorInternalError(fmt.Errorf("error putting bookmark in database: %s", err)) - } + // Create and store a new bookmark. + gtsBookmark := >smodel.StatusBookmark{ + ID: id.NewULID(), + AccountID: requestingAccount.ID, + Account: requestingAccount, + TargetAccountID: targetStatus.AccountID, + TargetAccount: targetStatus.Account, + StatusID: targetStatus.ID, + Status: targetStatus, } - // return the apidon representation of the target status - apiStatus, err := p.tc.StatusToAPIStatus(ctx, targetStatus, requestingAccount) - if err != nil { - return nil, gtserror.NewErrorInternalError(fmt.Errorf("error converting status %s to frontend representation: %s", targetStatus.ID, err)) + if err := p.state.DB.PutStatusBookmark(ctx, gtsBookmark); err != nil { + err = fmt.Errorf("BookmarkCreate: error putting bookmark in database: %w", err) + return nil, gtserror.NewErrorInternalError(err) } - return apiStatus, nil + return p.apiStatus(ctx, targetStatus, requestingAccount) } // BookmarkRemove removes a bookmark for the requesting account, targeting the given status (no-op if bookmark doesn't exist). func (p *Processor) BookmarkRemove(ctx context.Context, requestingAccount *gtsmodel.Account, targetStatusID string) (*apimodel.Status, gtserror.WithCode) { - targetStatus, err := p.state.DB.GetStatusByID(ctx, targetStatusID) - if err != nil { - return nil, gtserror.NewErrorNotFound(fmt.Errorf("error fetching status %s: %s", targetStatusID, err)) - } - if targetStatus.Account == nil { - return nil, gtserror.NewErrorNotFound(fmt.Errorf("no status owner for status %s", targetStatusID)) + targetStatus, existingBookmarkID, errWithCode := p.getBookmarkTarget(ctx, requestingAccount, targetStatusID) + if errWithCode != nil { + return nil, errWithCode } - visible, err := p.filter.StatusVisible(ctx, targetStatus, requestingAccount) - if err != nil { - return nil, gtserror.NewErrorNotFound(fmt.Errorf("error seeing if status %s is visible: %s", targetStatus.ID, err)) - } - if !visible { - return nil, gtserror.NewErrorNotFound(errors.New("status is not visible")) + + if existingBookmarkID == "" { + // Status isn't bookmarked. + return p.apiStatus(ctx, targetStatus, requestingAccount) } - // first check if the status is actually bookmarked - toUnbookmark := false - gtsBookmark := >smodel.StatusBookmark{} - if err := p.state.DB.GetWhere(ctx, []db.Where{{Key: "status_id", Value: targetStatus.ID}, {Key: "account_id", Value: requestingAccount.ID}}, gtsBookmark); err == nil { - // we have a bookmark for this status - toUnbookmark = true + // We have a bookmark to remove. + if err := p.state.DB.DeleteStatusBookmark(ctx, existingBookmarkID); err != nil { + err = fmt.Errorf("BookmarkRemove: error removing status bookmark: %w", err) + return nil, gtserror.NewErrorInternalError(err) } - if toUnbookmark { - if err := p.state.DB.DeleteWhere(ctx, []db.Where{{Key: "status_id", Value: targetStatus.ID}, {Key: "account_id", Value: requestingAccount.ID}}, gtsBookmark); err != nil { - return nil, gtserror.NewErrorInternalError(fmt.Errorf("error unfaveing status: %s", err)) - } + return p.apiStatus(ctx, targetStatus, requestingAccount) +} + +func (p *Processor) getBookmarkTarget(ctx context.Context, requestingAccount *gtsmodel.Account, targetStatusID string) (*gtsmodel.Status, string, gtserror.WithCode) { + targetStatus, errWithCode := p.getVisibleStatus(ctx, requestingAccount, targetStatusID) + if errWithCode != nil { + return nil, "", errWithCode } - // return the api representation of the target status - apiStatus, err := p.tc.StatusToAPIStatus(ctx, targetStatus, requestingAccount) - if err != nil { - return nil, gtserror.NewErrorInternalError(fmt.Errorf("error converting status %s to frontend representation: %s", targetStatus.ID, err)) + bookmarkID, err := p.state.DB.GetStatusBookmarkID(ctx, requestingAccount.ID, targetStatus.ID) + if err != nil && !errors.Is(err, db.ErrNoEntries) { + err = fmt.Errorf("getBookmarkTarget: error checking existing bookmark: %w", err) + return nil, "", gtserror.NewErrorInternalError(err) } - return apiStatus, nil + return targetStatus, bookmarkID, nil } |
