[chore] Tidy up status deletion, remove from cache too (#845)

* add func for deleting status from db + cache

* move deletes entirely back to processor
and also only do a delete if the requesting account owns the item being deleted

* tidy up unboost processing

* delete status more efficiently

* fix wrong account id on remote test attachments

* fix federator test
This commit is contained in:
tobi 2022-09-21 19:55:52 +02:00 committed by GitHub
commit 4cf76a2bfc
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
12 changed files with 113 additions and 94 deletions

View file

@ -227,6 +227,42 @@ func (s *statusDB) UpdateStatus(ctx context.Context, status *gtsmodel.Status) (*
return status, err
}
func (s *statusDB) DeleteStatusByID(ctx context.Context, id string) db.Error {
err := s.conn.RunInTx(ctx, func(tx bun.Tx) error {
// delete links between this status and any emojis it uses
if _, err := tx.
NewDelete().
Model(&gtsmodel.StatusToEmoji{}).
Where("status_id = ?", bun.Ident(id)).
Exec(ctx); err != nil {
return err
}
// delete links between this status and any tags it uses
if _, err := tx.
NewDelete().
Model(&gtsmodel.StatusToTag{}).
Where("status_id = ?", bun.Ident(id)).
Exec(ctx); err != nil {
return err
}
// delete the status itself
if _, err := tx.
NewDelete().
Model(&gtsmodel.Status{ID: id}).
WherePK().
Exec(ctx); err != nil {
return err
}
s.cache.Invalidate(id)
return nil
})
return s.conn.ProcessError(err)
}
func (s *statusDB) GetStatusParents(ctx context.Context, status *gtsmodel.Status, onlyDirect bool) ([]*gtsmodel.Status, db.Error) {
parents := []*gtsmodel.Status{}
s.statusParent(ctx, status, &parents, onlyDirect)

View file

@ -25,6 +25,7 @@ import (
"time"
"github.com/stretchr/testify/suite"
"github.com/superseriousbusiness/gotosocial/internal/db"
)
type StatusTestSuite struct {
@ -132,6 +133,15 @@ func (suite *StatusTestSuite) TestGetStatusChildren() {
}
}
func (suite *StatusTestSuite) TestDeleteStatus() {
targetStatus := suite.testStatuses["admin_account_status_1"]
err := suite.db.DeleteStatusByID(context.Background(), targetStatus.ID)
suite.NoError(err)
_, err = suite.db.GetStatusByID(context.Background(), targetStatus.ID)
suite.ErrorIs(err, db.ErrNoEntries)
}
func TestStatusTestSuite(t *testing.T) {
suite.Run(t, new(StatusTestSuite))
}