summaryrefslogtreecommitdiffstats
path: root/models/repo
diff options
context:
space:
mode:
authorWim <wim@42.be>2023-06-05 15:25:43 +0200
committerGitHub <noreply@github.com>2023-06-05 13:25:43 +0000
commit62ac3251fa545d32bdfc9ff824106b97ec63edbb (patch)
tree81378a4217e7e3db5fd49889aac969a75507c0fc /models/repo
parent8e63373c014ea681309a2e44ecfb0fbfb88a16f7 (diff)
downloadgitea-62ac3251fa545d32bdfc9ff824106b97ec63edbb.tar.gz
gitea-62ac3251fa545d32bdfc9ff824106b97ec63edbb.zip
Remove stars when repo goes private (#19904)
Fixes #18600
Diffstat (limited to 'models/repo')
-rw-r--r--models/repo/star.go14
-rw-r--r--models/repo/star_test.go18
2 files changed, 32 insertions, 0 deletions
diff --git a/models/repo/star.go b/models/repo/star.go
index b3d3d795f8..89bdb7ac05 100644
--- a/models/repo/star.go
+++ b/models/repo/star.go
@@ -85,3 +85,17 @@ func GetStargazers(repo *Repository, opts db.ListOptions) ([]*user_model.User, e
users := make([]*user_model.User, 0, 8)
return users, sess.Find(&users)
}
+
+// ClearRepoStars clears all stars for a repository and from the user that starred it.
+// Used when a repository is set to private.
+func ClearRepoStars(ctx context.Context, repoID int64) error {
+ if _, err := db.Exec(ctx, "UPDATE `user` SET num_stars=num_stars-1 WHERE id IN (SELECT `uid` FROM `star` WHERE repo_id = ?)", repoID); err != nil {
+ return err
+ }
+
+ if _, err := db.Exec(ctx, "UPDATE `repository` SET num_stars = 0 WHERE id = ?", repoID); err != nil {
+ return err
+ }
+
+ return db.DeleteBeans(ctx, Star{RepoID: repoID})
+}
diff --git a/models/repo/star_test.go b/models/repo/star_test.go
index 7221a6c8eb..f15ac12ebe 100644
--- a/models/repo/star_test.go
+++ b/models/repo/star_test.go
@@ -51,3 +51,21 @@ func TestRepository_GetStargazers2(t *testing.T) {
assert.NoError(t, err)
assert.Len(t, gazers, 0)
}
+
+func TestClearRepoStars(t *testing.T) {
+ assert.NoError(t, unittest.PrepareTestDatabase())
+ const userID = 2
+ const repoID = 1
+ unittest.AssertNotExistsBean(t, &repo_model.Star{UID: userID, RepoID: repoID})
+ assert.NoError(t, repo_model.StarRepo(userID, repoID, true))
+ unittest.AssertExistsAndLoadBean(t, &repo_model.Star{UID: userID, RepoID: repoID})
+ assert.NoError(t, repo_model.StarRepo(userID, repoID, false))
+ unittest.AssertNotExistsBean(t, &repo_model.Star{UID: userID, RepoID: repoID})
+ assert.NoError(t, repo_model.ClearRepoStars(db.DefaultContext, repoID))
+ unittest.AssertNotExistsBean(t, &repo_model.Star{UID: userID, RepoID: repoID})
+
+ repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
+ gazers, err := repo_model.GetStargazers(repo, db.ListOptions{Page: 0})
+ assert.NoError(t, err)
+ assert.Len(t, gazers, 0)
+}