mirror of
https://github.com/idanoo/autobrr
synced 2025-07-23 08:49:13 +00:00
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:
parent
f8715c193c
commit
19e129e55f
6 changed files with 289 additions and 67 deletions
|
@ -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
|
||||
}
|
||||
|
|
|
@ -124,7 +124,9 @@ type ReleaseActionStatus struct {
|
|||
}
|
||||
|
||||
type DeleteReleaseRequest struct {
|
||||
OlderThan int
|
||||
OlderThan int
|
||||
Indexers []string
|
||||
ReleaseStatuses []string
|
||||
}
|
||||
|
||||
func NewReleaseActionStatus(action *Action, release *Release) *ReleaseActionStatus {
|
||||
|
|
|
@ -211,6 +211,31 @@ func (h releaseHandler) deleteReleases(w http.ResponseWriter, r *http.Request) {
|
|||
req.OlderThan = duration
|
||||
}
|
||||
|
||||
indexers := r.URL.Query()["indexer"]
|
||||
if len(indexers) > 0 {
|
||||
req.Indexers = indexers
|
||||
}
|
||||
|
||||
releaseStatuses := r.URL.Query()["releaseStatus"]
|
||||
validStatuses := map[string]bool{
|
||||
"PUSH_APPROVED": true,
|
||||
"PUSH_REJECTED": true,
|
||||
"PUSH_ERROR": true,
|
||||
}
|
||||
var filteredStatuses []string
|
||||
for _, status := range releaseStatuses {
|
||||
if _, valid := validStatuses[status]; valid {
|
||||
filteredStatuses = append(filteredStatuses, status)
|
||||
} else {
|
||||
h.encoder.StatusResponse(w, http.StatusBadRequest, map[string]interface{}{
|
||||
"code": "INVALID_RELEASE_STATUS",
|
||||
"message": "releaseStatus contains invalid value",
|
||||
})
|
||||
return
|
||||
}
|
||||
}
|
||||
req.ReleaseStatuses = filteredStatuses
|
||||
|
||||
if err := h.service.Delete(r.Context(), &req); err != nil {
|
||||
h.encoder.Error(w, err)
|
||||
return
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue