mirror of
https://github.com/superseriousbusiness/gotosocial.git
synced 2025-11-14 02:27:28 -06:00
more work integration new timeline code
This commit is contained in:
parent
49d9a008d9
commit
771fbe2d5e
14 changed files with 419 additions and 606 deletions
|
|
@ -682,13 +682,8 @@ func (p *clientAPI) CreateBlock(ctx context.Context, cMsg *messages.FromClientAP
|
|||
return gtserror.Newf("%T not parseable as *gtsmodel.Block", cMsg.GTSModel)
|
||||
}
|
||||
|
||||
// Remove blocker's statuses from blocker's timeline.
|
||||
p.state.Caches.Timelines.Home.InvalidateFrom(block.AccountID, "AccountID", block.TargetAccountID)
|
||||
p.state.Caches.Timelines.Home.InvalidateFrom(block.AccountID, "BoostOfAccountID", block.TargetAccountID)
|
||||
|
||||
// Remove blockee's statuses from blockee's timeline.
|
||||
p.state.Caches.Timelines.Home.InvalidateFrom(block.TargetAccountID, "AccountID", block.AccountID)
|
||||
p.state.Caches.Timelines.Home.InvalidateFrom(block.TargetAccountID, "BoostOfAccountID", block.AccountID)
|
||||
// Perform any necessary timeline invalidation.
|
||||
p.surface.invalidateTimelinesForBlock(ctx, block)
|
||||
|
||||
// TODO: same with notifications?
|
||||
// TODO: same with bookmarks?
|
||||
|
|
|
|||
|
|
@ -701,53 +701,19 @@ func (p *fediAPI) CreateBlock(ctx context.Context, fMsg *messages.FromFediAPI) e
|
|||
return gtserror.Newf("%T not parseable as *gtsmodel.Block", fMsg.GTSModel)
|
||||
}
|
||||
|
||||
// Remove each account's posts from the other's timelines.
|
||||
//
|
||||
// First home timelines.
|
||||
if err := p.state.Timelines.Home.WipeItemsFromAccountID(
|
||||
ctx,
|
||||
block.AccountID,
|
||||
block.TargetAccountID,
|
||||
); err != nil {
|
||||
log.Errorf(ctx, "error wiping items from block -> target's home timeline: %v", err)
|
||||
}
|
||||
|
||||
if err := p.state.Timelines.Home.WipeItemsFromAccountID(
|
||||
ctx,
|
||||
block.TargetAccountID,
|
||||
block.AccountID,
|
||||
); err != nil {
|
||||
log.Errorf(ctx, "error wiping items from target -> block's home timeline: %v", err)
|
||||
}
|
||||
|
||||
// Now list timelines.
|
||||
if err := p.state.Timelines.List.WipeItemsFromAccountID(
|
||||
ctx,
|
||||
block.AccountID,
|
||||
block.TargetAccountID,
|
||||
); err != nil {
|
||||
log.Errorf(ctx, "error wiping items from block -> target's list timeline(s): %v", err)
|
||||
}
|
||||
|
||||
if err := p.state.Timelines.List.WipeItemsFromAccountID(
|
||||
ctx,
|
||||
block.TargetAccountID,
|
||||
block.AccountID,
|
||||
); err != nil {
|
||||
log.Errorf(ctx, "error wiping items from target -> block's list timeline(s): %v", err)
|
||||
}
|
||||
// Perform any necessary timeline invalidation.
|
||||
p.surface.invalidateTimelinesForBlock(ctx, block)
|
||||
|
||||
// Remove any follows that existed between blocker + blockee.
|
||||
if err := p.state.DB.DeleteFollow(
|
||||
ctx,
|
||||
// (note this handles removing any necessary list entries).
|
||||
if err := p.state.DB.DeleteFollow(ctx,
|
||||
block.AccountID,
|
||||
block.TargetAccountID,
|
||||
); err != nil {
|
||||
log.Errorf(ctx, "error deleting follow from block -> target: %v", err)
|
||||
}
|
||||
|
||||
if err := p.state.DB.DeleteFollow(
|
||||
ctx,
|
||||
if err := p.state.DB.DeleteFollow(ctx,
|
||||
block.TargetAccountID,
|
||||
block.AccountID,
|
||||
); err != nil {
|
||||
|
|
@ -755,16 +721,14 @@ func (p *fediAPI) CreateBlock(ctx context.Context, fMsg *messages.FromFediAPI) e
|
|||
}
|
||||
|
||||
// Remove any follow requests that existed between blocker + blockee.
|
||||
if err := p.state.DB.DeleteFollowRequest(
|
||||
ctx,
|
||||
if err := p.state.DB.DeleteFollowRequest(ctx,
|
||||
block.AccountID,
|
||||
block.TargetAccountID,
|
||||
); err != nil {
|
||||
log.Errorf(ctx, "error deleting follow request from block -> target: %v", err)
|
||||
}
|
||||
|
||||
if err := p.state.DB.DeleteFollowRequest(
|
||||
ctx,
|
||||
if err := p.state.DB.DeleteFollowRequest(ctx,
|
||||
block.TargetAccountID,
|
||||
block.AccountID,
|
||||
); err != nil {
|
||||
|
|
|
|||
|
|
@ -553,13 +553,8 @@ func (s *Surface) tagFollowersForStatus(
|
|||
// deleteStatusFromTimelines completely removes the given status from all timelines.
|
||||
// It will also stream deletion of the status to all open streams.
|
||||
func (s *Surface) deleteStatusFromTimelines(ctx context.Context, statusID string) error {
|
||||
if err := s.State.Timelines.Home.WipeItemFromAllTimelines(ctx, statusID); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := s.State.Timelines.List.WipeItemFromAllTimelines(ctx, statusID); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
s.State.Caches.Timelines.Home.RemoveByStatusIDs(statusID)
|
||||
s.State.Caches.Timelines.List.RemoveByStatusIDs(statusID)
|
||||
s.Stream.Delete(ctx, statusID)
|
||||
return nil
|
||||
}
|
||||
|
|
@ -569,19 +564,8 @@ func (s *Surface) deleteStatusFromTimelines(ctx context.Context, statusID string
|
|||
// stats, boost counts, etc) next time it's fetched by the timeline owner. This goes
|
||||
// both for the status itself, and for any boosts of the status.
|
||||
func (s *Surface) invalidateStatusFromTimelines(ctx context.Context, statusID string) {
|
||||
if err := s.State.Timelines.Home.UnprepareItemFromAllTimelines(ctx, statusID); err != nil {
|
||||
log.
|
||||
WithContext(ctx).
|
||||
WithField("statusID", statusID).
|
||||
Errorf("error unpreparing status from home timelines: %v", err)
|
||||
}
|
||||
|
||||
if err := s.State.Timelines.List.UnprepareItemFromAllTimelines(ctx, statusID); err != nil {
|
||||
log.
|
||||
WithContext(ctx).
|
||||
WithField("statusID", statusID).
|
||||
Errorf("error unpreparing status from list timelines: %v", err)
|
||||
}
|
||||
s.State.Caches.Timelines.Home.UnprepareByStatusIDs(statusID)
|
||||
s.State.Caches.Timelines.List.UnprepareByStatusIDs(statusID)
|
||||
}
|
||||
|
||||
// timelineStatusUpdate looks up HOME and LIST timelines of accounts
|
||||
|
|
@ -860,3 +844,57 @@ func (s *Surface) timelineStatusUpdateForTagFollowers(
|
|||
}
|
||||
return errs.Combine()
|
||||
}
|
||||
|
||||
// invalidateTimelinesForBlock ...
|
||||
func (s *Surface) invalidateTimelinesForBlock(ctx context.Context, block *gtsmodel.Block) {
|
||||
|
||||
// Check if origin is local account,
|
||||
// i.e. has status timeline caches.
|
||||
if block.Account.IsLocal() {
|
||||
|
||||
// Remove target's statuses
|
||||
// from origin's home timeline.
|
||||
s.State.Caches.Timelines.Home.
|
||||
MustGet(block.AccountID).
|
||||
RemoveByAccountIDs(block.TargetAccountID)
|
||||
|
||||
// Get the IDs of any lists created by origin account.
|
||||
listIDs, err := s.State.DB.GetListIDsByAccountID(ctx, block.AccountID)
|
||||
if err != nil {
|
||||
log.Errorf(ctx, "error getting account's list IDs for %s: %v", block.URI, err)
|
||||
}
|
||||
|
||||
// Remove target's statuses from
|
||||
// any of origin's list timelines.
|
||||
for _, listID := range listIDs {
|
||||
s.State.Caches.Timelines.List.
|
||||
MustGet(listID).
|
||||
RemoveByAccountIDs(block.TargetAccountID)
|
||||
}
|
||||
}
|
||||
|
||||
// Check if target is local account,
|
||||
// i.e. has status timeline caches.
|
||||
if block.TargetAccount.IsLocal() {
|
||||
|
||||
// Remove origin's statuses
|
||||
// from target's home timeline.
|
||||
s.State.Caches.Timelines.Home.
|
||||
MustGet(block.TargetAccountID).
|
||||
RemoveByAccountIDs(block.AccountID)
|
||||
|
||||
// Get the IDs of any lists created by target account.
|
||||
listIDs, err := s.State.DB.GetListIDsByAccountID(ctx, block.TargetAccountID)
|
||||
if err != nil {
|
||||
log.Errorf(ctx, "error getting target account's list IDs for %s: %v", block.URI, err)
|
||||
}
|
||||
|
||||
// Remove origin's statuses from
|
||||
// any of target's list timelines.
|
||||
for _, listID := range listIDs {
|
||||
s.State.Caches.Timelines.List.
|
||||
MustGet(listID).
|
||||
RemoveByAccountIDs(block.AccountID)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue