feat(releases): delete based on age/indexer/status (#1522)

* feat(releases): delete based on age/indexer/status

* fix: sanitize releaseStatuses

* swap to RMSC

* add AgeSelect component

* improve texts

* refactor: streamline form layout

* improve text

* remove a paragraph

* improved UX

explaining the options, better error handling

* reinstate red border

* fix: labels to match other similar labels for selects

- improved contrast for the word "required" in desc
- added red asterisk to required select

* minor text improvement to warning

* fix: delete-button vertical alignment

* feat: cleanup queries

* feat: cleanup delete

---------

Co-authored-by: ze0s <ze0s@riseup.net>
This commit is contained in:
soup 2024-05-03 11:32:20 +02:00 committed by GitHub
parent f8715c193c
commit 19e129e55f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 289 additions and 67 deletions

View file

@ -582,7 +582,27 @@ func (repo *ReleaseRepo) Delete(ctx context.Context, req *domain.DeleteReleaseRe
return errors.Wrap(err, "could not start transaction")
}
defer tx.Rollback()
defer func() {
var txErr error
if p := recover(); p != nil {
txErr = tx.Rollback()
if txErr != nil {
repo.log.Error().Err(txErr).Msg("error rolling back transaction")
}
repo.log.Error().Msgf("something went terribly wrong panic: %v", p)
} else if err != nil {
txErr = tx.Rollback()
if txErr != nil {
repo.log.Error().Err(txErr).Msg("error rolling back transaction")
}
} else {
// All good, commit
txErr = tx.Commit()
if txErr != nil {
repo.log.Error().Err(txErr).Msg("error committing transaction")
}
}
}()
qb := repo.db.squirrel.Delete("release")
@ -599,16 +619,30 @@ func (repo *ReleaseRepo) Delete(ctx context.Context, req *domain.DeleteReleaseRe
}
}
query, args, err := qb.ToSql()
if err != nil {
return errors.Wrap(err, "error executing query")
if len(req.Indexers) > 0 {
qb = qb.Where(sq.Eq{"indexer": req.Indexers})
}
repo.log.Debug().Str("repo", "release").Str("query", query).Msgf("release.delete: args: %v", args)
if len(req.ReleaseStatuses) > 0 {
subQuery := sq.Select("release_id").From("release_action_status").Where(sq.Eq{"status": req.ReleaseStatuses})
subQueryText, subQueryArgs, err := subQuery.ToSql()
if err != nil {
return errors.Wrap(err, "error building subquery")
}
qb = qb.Where("id IN ("+subQueryText+")", subQueryArgs...)
}
query, args, err := qb.ToSql()
if err != nil {
return errors.Wrap(err, "error building SQL query")
}
repo.log.Trace().Str("query", query).Interface("args", args).Msg("Executing combined delete query")
result, err := tx.ExecContext(ctx, query, args...)
if err != nil {
return errors.Wrap(err, "error executing query")
repo.log.Error().Err(err).Str("query", query).Interface("args", args).Msg("Error executing combined delete query")
return errors.Wrap(err, "error executing delete query")
}
deletedRows, err := result.RowsAffected()
@ -616,16 +650,20 @@ func (repo *ReleaseRepo) Delete(ctx context.Context, req *domain.DeleteReleaseRe
return errors.Wrap(err, "error fetching rows affected")
}
_, err = tx.ExecContext(ctx, `DELETE FROM release_action_status WHERE release_id NOT IN (SELECT id FROM "release")`)
repo.log.Debug().Msgf("deleted %d rows from release table", deletedRows)
// clean up orphaned rows
orphanedResult, err := tx.ExecContext(ctx, `DELETE FROM release_action_status WHERE release_id NOT IN (SELECT id FROM "release")`)
if err != nil {
return errors.Wrap(err, "error executing query")
}
if err := tx.Commit(); err != nil {
return errors.Wrap(err, "error commit transaction delete")
deletedRowsOrphaned, err := orphanedResult.RowsAffected()
if err != nil {
return errors.Wrap(err, "error fetching rows affected")
}
repo.log.Debug().Msgf("deleted %d rows from release table", deletedRows)
repo.log.Debug().Msgf("deleted %d orphaned rows from release table", deletedRowsOrphaned)
return nil
}