fix(releases): delete older than X (#993)

* fix(release): DeleteOlder func for zero duration

resolves a bug in the `DeleteOlder` function where recent 24-hour data wasn't deleted when set to `delete everything`. We now correctly set the olderThanTimestamp to a future date when duration is zero, ensuring complete deletion of all records.

* fix(releases): delete older

---------

Co-authored-by: ze0s <ze0s@riseup.net>
This commit is contained in:
soup 2023-07-22 14:49:28 +02:00 committed by GitHub
parent 56d3603505
commit e6f32596a1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 56 additions and 71 deletions

View file

@ -18,7 +18,6 @@ import (
sq "github.com/Masterminds/squirrel"
"github.com/lib/pq"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
)
type ReleaseRepo struct {
@ -561,43 +560,37 @@ CROSS JOIN (
return &rls, nil
}
func (repo *ReleaseRepo) Delete(ctx context.Context) error {
func (repo *ReleaseRepo) Delete(ctx context.Context, req *domain.DeleteReleaseRequest) error {
tx, err := repo.db.BeginTx(ctx, nil)
if err != nil {
return err
return errors.Wrap(err, "could not start transaction")
}
defer tx.Rollback()
_, err = tx.ExecContext(ctx, `DELETE FROM "release"`)
qb := repo.db.squirrel.Delete("release")
if req.OlderThan > 0 {
if repo.db.Driver == "sqlite" {
qb = qb.Where(fmt.Sprintf("timestamp < strftime('%%Y-%%m-%%dT%%H:00:00', datetime('now','-%d hours'))", req.OlderThan))
} else {
// postgres compatible
thresholdTime := time.Now().Add(time.Duration(-req.OlderThan) * time.Hour)
qb = qb.Where(sq.Lt{
//"timestamp": fmt.Sprintf("(now() - interval '%d hours')", req.OlderThan),
"timestamp": thresholdTime,
})
}
}
query, args, err := qb.ToSql()
if err != nil {
return errors.Wrap(err, "error executing query")
}
_, err = tx.ExecContext(ctx, `DELETE FROM release_action_status`)
if err != nil {
return errors.Wrap(err, "error executing query")
}
repo.log.Debug().Str("repo", "release").Str("query", query).Msgf("release.delete: args: %v", args)
if err := tx.Commit(); err != nil {
return errors.Wrap(err, "error commit transaction delete")
}
return nil
}
func (repo *ReleaseRepo) DeleteOlder(ctx context.Context, duration int) error {
tx, err := repo.db.BeginTx(ctx, nil)
if err != nil {
return err
}
defer tx.Rollback()
olderThanTimestamp := time.Now().UTC().Add(-time.Duration(duration) * time.Hour)
log.Debug().Msgf("Deleting releases older than: %v", olderThanTimestamp)
result, err := tx.ExecContext(ctx, `DELETE FROM "release" WHERE timestamp < $1`, olderThanTimestamp)
result, err := tx.ExecContext(ctx, query, args...)
if err != nil {
return errors.Wrap(err, "error executing query")
}
@ -606,7 +599,6 @@ func (repo *ReleaseRepo) DeleteOlder(ctx context.Context, duration int) error {
if err != nil {
return errors.Wrap(err, "error fetching rows affected")
}
log.Debug().Msgf("Deleted %d rows from release table", deletedRows)
_, err = tx.ExecContext(ctx, `DELETE FROM release_action_status WHERE release_id NOT IN (SELECT id FROM "release")`)
if err != nil {
@ -617,6 +609,8 @@ func (repo *ReleaseRepo) DeleteOlder(ctx context.Context, duration int) error {
return errors.Wrap(err, "error commit transaction delete")
}
repo.log.Debug().Msgf("deleted %d rows from release table", deletedRows)
return nil
}