summaryrefslogtreecommitdiffstats
path: root/models
diff options
context:
space:
mode:
authorEarl Warren <109468362+earl-warren@users.noreply.github.com>2023-11-05 13:48:32 +0100
committerGitHub <noreply@github.com>2023-11-05 13:48:32 +0100
commit59f9ef9feebb19337b8a153e6cac0371ca706268 (patch)
tree65ec7ec5581cee21a54caf19d125468c4b496169 /models
parentda0c4b8d10cce85c854370ae3c399b542cb04306 (diff)
downloadgitea-59f9ef9feebb19337b8a153e6cac0371ca706268.tar.gz
gitea-59f9ef9feebb19337b8a153e6cac0371ca706268.zip
Remove action runners on user deletion (#27902)
- On user deletion, delete action runners that the user has created. - Add a database consistency check to remove action runners that have nonexistent belonging owner. - Resolves https://codeberg.org/forgejo/forgejo/issues/1720 (cherry picked from commit 009ca7223dab054f7f760b7ccae69e745eebfabb) Co-authored-by: Gusted <postmaster@gusted.xyz>
Diffstat (limited to 'models')
-rw-r--r--models/actions/runner.go24
1 files changed, 24 insertions, 0 deletions
diff --git a/models/actions/runner.go b/models/actions/runner.go
index ec6b49cf16..2c092c2b4a 100644
--- a/models/actions/runner.go
+++ b/models/actions/runner.go
@@ -266,3 +266,27 @@ func CreateRunner(ctx context.Context, t *ActionRunner) error {
_, err := db.GetEngine(ctx).Insert(t)
return err
}
+
+func CountRunnersWithoutBelongingOwner(ctx context.Context) (int64, error) {
+ // Only affect action runners were a owner ID is set, as actions runners
+ // could also be created on a repository.
+ return db.GetEngine(ctx).Table("action_runner").
+ Join("LEFT", "user", "`action_runner`.owner_id = `user`.id").
+ Where("`action_runner`.owner_id != ?", 0).
+ And(builder.IsNull{"`user`.id"}).
+ Count(new(ActionRunner))
+}
+
+func FixRunnersWithoutBelongingOwner(ctx context.Context) (int64, error) {
+ subQuery := builder.Select("`action_runner`.id").
+ From("`action_runner`").
+ Join("LEFT", "user", "`action_runner`.owner_id = `user`.id").
+ Where(builder.Neq{"`action_runner`.owner_id": 0}).
+ And(builder.IsNull{"`user`.id"})
+ b := builder.Delete(builder.In("id", subQuery)).From("`action_runner`")
+ res, err := db.GetEngine(ctx).Exec(b)
+ if err != nil {
+ return 0, err
+ }
+ return res.RowsAffected()
+}