aboutsummaryrefslogtreecommitdiffstats
path: root/models/repo
diff options
context:
space:
mode:
authorLunny Xiao <xiaolunwen@gmail.com>2024-03-29 11:38:16 +0800
committerGitHub <noreply@github.com>2024-03-29 11:38:16 +0800
commit8acc7aab4c254c4819f45e512b86cf5a4255091f (patch)
treef99c44d3af0198977f1b5685bef7d56154beb812 /models/repo
parentdd8dde2be89921b2b1497c6cc5eafdde213429cb (diff)
downloadgitea-8acc7aab4c254c4819f45e512b86cf5a4255091f.tar.gz
gitea-8acc7aab4c254c4819f45e512b86cf5a4255091f.zip
Refactor topic Find functions and add more tests for pagination (#30127)
This also fixed #22238
Diffstat (limited to 'models/repo')
-rw-r--r--models/repo/topic.go31
-rw-r--r--models/repo/topic_test.go14
2 files changed, 20 insertions, 25 deletions
diff --git a/models/repo/topic.go b/models/repo/topic.go
index 79b13e320d..430a60f603 100644
--- a/models/repo/topic.go
+++ b/models/repo/topic.go
@@ -178,7 +178,7 @@ type FindTopicOptions struct {
Keyword string
}
-func (opts *FindTopicOptions) toConds() builder.Cond {
+func (opts *FindTopicOptions) ToConds() builder.Cond {
cond := builder.NewCond()
if opts.RepoID > 0 {
cond = cond.And(builder.Eq{"repo_topic.repo_id": opts.RepoID})
@@ -191,29 +191,24 @@ func (opts *FindTopicOptions) toConds() builder.Cond {
return cond
}
-// FindTopics retrieves the topics via FindTopicOptions
-func FindTopics(ctx context.Context, opts *FindTopicOptions) ([]*Topic, int64, error) {
- sess := db.GetEngine(ctx).Select("topic.*").Where(opts.toConds())
+func (opts *FindTopicOptions) ToOrders() string {
orderBy := "topic.repo_count DESC"
if opts.RepoID > 0 {
- sess.Join("INNER", "repo_topic", "repo_topic.topic_id = topic.id")
orderBy = "topic.name" // when render topics for a repo, it's better to sort them by name, to get consistent result
}
- if opts.PageSize != 0 && opts.Page != 0 {
- sess = db.SetSessionPagination(sess, opts)
- }
- topics := make([]*Topic, 0, 10)
- total, err := sess.OrderBy(orderBy).FindAndCount(&topics)
- return topics, total, err
+ return orderBy
}
-// CountTopics counts the number of topics matching the FindTopicOptions
-func CountTopics(ctx context.Context, opts *FindTopicOptions) (int64, error) {
- sess := db.GetEngine(ctx).Where(opts.toConds())
- if opts.RepoID > 0 {
- sess.Join("INNER", "repo_topic", "repo_topic.topic_id = topic.id")
+func (opts *FindTopicOptions) ToJoins() []db.JoinFunc {
+ if opts.RepoID <= 0 {
+ return nil
+ }
+ return []db.JoinFunc{
+ func(e db.Engine) error {
+ e.Join("INNER", "repo_topic", "repo_topic.topic_id = topic.id")
+ return nil
+ },
}
- return sess.Count(new(Topic))
}
// GetRepoTopicByName retrieves topic from name for a repo if it exist
@@ -283,7 +278,7 @@ func DeleteTopic(ctx context.Context, repoID int64, topicName string) (*Topic, e
// SaveTopics save topics to a repository
func SaveTopics(ctx context.Context, repoID int64, topicNames ...string) error {
- topics, _, err := FindTopics(ctx, &FindTopicOptions{
+ topics, err := db.Find[Topic](ctx, &FindTopicOptions{
RepoID: repoID,
})
if err != nil {
diff --git a/models/repo/topic_test.go b/models/repo/topic_test.go
index 2b609e6d66..1600896b6e 100644
--- a/models/repo/topic_test.go
+++ b/models/repo/topic_test.go
@@ -19,18 +19,18 @@ func TestAddTopic(t *testing.T) {
assert.NoError(t, unittest.PrepareTestDatabase())
- topics, _, err := repo_model.FindTopics(db.DefaultContext, &repo_model.FindTopicOptions{})
+ topics, err := db.Find[repo_model.Topic](db.DefaultContext, &repo_model.FindTopicOptions{})
assert.NoError(t, err)
assert.Len(t, topics, totalNrOfTopics)
- topics, total, err := repo_model.FindTopics(db.DefaultContext, &repo_model.FindTopicOptions{
+ topics, total, err := db.FindAndCount[repo_model.Topic](db.DefaultContext, &repo_model.FindTopicOptions{
ListOptions: db.ListOptions{Page: 1, PageSize: 2},
})
assert.NoError(t, err)
assert.Len(t, topics, 2)
assert.EqualValues(t, 6, total)
- topics, _, err = repo_model.FindTopics(db.DefaultContext, &repo_model.FindTopicOptions{
+ topics, err = db.Find[repo_model.Topic](db.DefaultContext, &repo_model.FindTopicOptions{
RepoID: 1,
})
assert.NoError(t, err)
@@ -38,11 +38,11 @@ func TestAddTopic(t *testing.T) {
assert.NoError(t, repo_model.SaveTopics(db.DefaultContext, 2, "golang"))
repo2NrOfTopics := 1
- topics, _, err = repo_model.FindTopics(db.DefaultContext, &repo_model.FindTopicOptions{})
+ topics, err = db.Find[repo_model.Topic](db.DefaultContext, &repo_model.FindTopicOptions{})
assert.NoError(t, err)
assert.Len(t, topics, totalNrOfTopics)
- topics, _, err = repo_model.FindTopics(db.DefaultContext, &repo_model.FindTopicOptions{
+ topics, err = db.Find[repo_model.Topic](db.DefaultContext, &repo_model.FindTopicOptions{
RepoID: 2,
})
assert.NoError(t, err)
@@ -55,11 +55,11 @@ func TestAddTopic(t *testing.T) {
assert.NoError(t, err)
assert.EqualValues(t, 1, topic.RepoCount)
- topics, _, err = repo_model.FindTopics(db.DefaultContext, &repo_model.FindTopicOptions{})
+ topics, err = db.Find[repo_model.Topic](db.DefaultContext, &repo_model.FindTopicOptions{})
assert.NoError(t, err)
assert.Len(t, topics, totalNrOfTopics)
- topics, _, err = repo_model.FindTopics(db.DefaultContext, &repo_model.FindTopicOptions{
+ topics, err = db.Find[repo_model.Topic](db.DefaultContext, &repo_model.FindTopicOptions{
RepoID: 2,
})
assert.NoError(t, err)