mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 10:56:10 +01:00 
			
		
		
		
	Add AbsoluteListOptions (#17028)
				
					
				
			This PR adds a `ListOptions` type which is not paged but uses absolute values. It is implemented as discussed in Discord. Extracted from #16510 to clean that PR.
This commit is contained in:
		| @@ -97,7 +97,7 @@ func GetCommitStatuses(repo *Repository, sha string, opts *CommitStatusOptions) | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	countSession := listCommitStatusesStatement(repo, sha, opts) | 	countSession := listCommitStatusesStatement(repo, sha, opts) | ||||||
| 	countSession = opts.setSessionPagination(countSession) | 	countSession = setSessionPagination(countSession, opts) | ||||||
| 	maxResults, err := countSession.Count(new(CommitStatus)) | 	maxResults, err := countSession.Count(new(CommitStatus)) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		log.Error("Count PRs: %v", err) | 		log.Error("Count PRs: %v", err) | ||||||
| @@ -106,7 +106,7 @@ func GetCommitStatuses(repo *Repository, sha string, opts *CommitStatusOptions) | |||||||
|  |  | ||||||
| 	statuses := make([]*CommitStatus, 0, opts.PageSize) | 	statuses := make([]*CommitStatus, 0, opts.PageSize) | ||||||
| 	findSession := listCommitStatusesStatement(repo, sha, opts) | 	findSession := listCommitStatusesStatement(repo, sha, opts) | ||||||
| 	findSession = opts.setSessionPagination(findSession) | 	findSession = setSessionPagination(findSession, opts) | ||||||
| 	sortCommitStatusesSession(findSession, opts.SortType) | 	sortCommitStatusesSession(findSession, opts.SortType) | ||||||
| 	return statuses, maxResults, findSession.Find(&statuses) | 	return statuses, maxResults, findSession.Find(&statuses) | ||||||
| } | } | ||||||
| @@ -149,7 +149,7 @@ func getLatestCommitStatus(e Engine, repoID int64, sha string, listOptions ListO | |||||||
| 		Select("max( id ) as id"). | 		Select("max( id ) as id"). | ||||||
| 		GroupBy("context_hash").OrderBy("max( id ) desc") | 		GroupBy("context_hash").OrderBy("max( id ) desc") | ||||||
|  |  | ||||||
| 	sess = listOptions.setSessionPagination(sess) | 	sess = setSessionPagination(sess, &listOptions) | ||||||
|  |  | ||||||
| 	err := sess.Find(&ids) | 	err := sess.Find(&ids) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
|   | |||||||
| @@ -64,7 +64,7 @@ func ListGPGKeys(uid int64, listOptions ListOptions) ([]*GPGKey, error) { | |||||||
| func listGPGKeys(e Engine, uid int64, listOptions ListOptions) ([]*GPGKey, error) { | func listGPGKeys(e Engine, uid int64, listOptions ListOptions) ([]*GPGKey, error) { | ||||||
| 	sess := e.Table(&GPGKey{}).Where("owner_id=? AND primary_key_id=''", uid) | 	sess := e.Table(&GPGKey{}).Where("owner_id=? AND primary_key_id=''", uid) | ||||||
| 	if listOptions.Page != 0 { | 	if listOptions.Page != 0 { | ||||||
| 		sess = listOptions.setSessionPagination(sess) | 		sess = setSessionPagination(sess, &listOptions) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	keys := make([]*GPGKey, 0, 2) | 	keys := make([]*GPGKey, 0, 2) | ||||||
|   | |||||||
| @@ -1007,7 +1007,7 @@ func findComments(e Engine, opts *FindCommentsOptions) ([]*Comment, error) { | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if opts.Page != 0 { | 	if opts.Page != 0 { | ||||||
| 		sess = opts.setSessionPagination(sess) | 		sess = setSessionPagination(sess, opts) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// WARNING: If you change this order you will need to fix createCodeComment | 	// WARNING: If you change this order you will need to fix createCodeComment | ||||||
|   | |||||||
| @@ -459,7 +459,7 @@ func getLabelsByRepoID(e Engine, repoID int64, sortType string, listOptions List | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if listOptions.Page != 0 { | 	if listOptions.Page != 0 { | ||||||
| 		sess = listOptions.setSessionPagination(sess) | 		sess = setSessionPagination(sess, &listOptions) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return labels, sess.Find(&labels) | 	return labels, sess.Find(&labels) | ||||||
| @@ -576,7 +576,7 @@ func getLabelsByOrgID(e Engine, orgID int64, sortType string, listOptions ListOp | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if listOptions.Page != 0 { | 	if listOptions.Page != 0 { | ||||||
| 		sess = listOptions.setSessionPagination(sess) | 		sess = setSessionPagination(sess, &listOptions) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return labels, sess.Find(&labels) | 	return labels, sess.Find(&labels) | ||||||
|   | |||||||
| @@ -408,7 +408,7 @@ func GetMilestones(opts GetMilestonesOption) (MilestoneList, int64, error) { | |||||||
| 	sess := x.Where(opts.toCond()) | 	sess := x.Where(opts.toCond()) | ||||||
|  |  | ||||||
| 	if opts.Page != 0 { | 	if opts.Page != 0 { | ||||||
| 		sess = opts.setSessionPagination(sess) | 		sess = setSessionPagination(sess, &opts) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	switch opts.SortType { | 	switch opts.SortType { | ||||||
|   | |||||||
| @@ -87,7 +87,7 @@ func findReactions(e Engine, opts FindReactionsOptions) ([]*Reaction, error) { | |||||||
| 		In("reaction.`type`", setting.UI.Reactions). | 		In("reaction.`type`", setting.UI.Reactions). | ||||||
| 		Asc("reaction.issue_id", "reaction.comment_id", "reaction.created_unix", "reaction.id") | 		Asc("reaction.issue_id", "reaction.comment_id", "reaction.created_unix", "reaction.id") | ||||||
| 	if opts.Page != 0 { | 	if opts.Page != 0 { | ||||||
| 		e = opts.setEnginePagination(e) | 		e = setEnginePagination(e, &opts) | ||||||
|  |  | ||||||
| 		reactions := make([]*Reaction, 0, opts.PageSize) | 		reactions := make([]*Reaction, 0, opts.PageSize) | ||||||
| 		return reactions, e.Find(&reactions) | 		return reactions, e.Find(&reactions) | ||||||
|   | |||||||
| @@ -45,7 +45,7 @@ func GetUserStopwatches(userID int64, listOptions ListOptions) ([]*Stopwatch, er | |||||||
| 	sws := make([]*Stopwatch, 0, 8) | 	sws := make([]*Stopwatch, 0, 8) | ||||||
| 	sess := x.Where("stopwatch.user_id = ?", userID) | 	sess := x.Where("stopwatch.user_id = ?", userID) | ||||||
| 	if listOptions.Page != 0 { | 	if listOptions.Page != 0 { | ||||||
| 		sess = listOptions.setSessionPagination(sess) | 		sess = setSessionPagination(sess, &listOptions) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	err := sess.Find(&sws) | 	err := sess.Find(&sws) | ||||||
|   | |||||||
| @@ -113,7 +113,7 @@ func (opts *FindTrackedTimesOptions) toSession(e Engine) Engine { | |||||||
| 	sess = sess.Where(opts.toCond()) | 	sess = sess.Where(opts.toCond()) | ||||||
|  |  | ||||||
| 	if opts.Page != 0 { | 	if opts.Page != 0 { | ||||||
| 		sess = opts.setEnginePagination(sess) | 		sess = setEnginePagination(sess, opts) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return sess | 	return sess | ||||||
|   | |||||||
| @@ -111,7 +111,7 @@ func getIssueWatchers(e Engine, issueID int64, listOptions ListOptions) (IssueWa | |||||||
| 		Join("INNER", "`user`", "`user`.id = `issue_watch`.user_id") | 		Join("INNER", "`user`", "`user`.id = `issue_watch`.user_id") | ||||||
|  |  | ||||||
| 	if listOptions.Page != 0 { | 	if listOptions.Page != 0 { | ||||||
| 		sess = listOptions.setSessionPagination(sess) | 		sess = setSessionPagination(sess, &listOptions) | ||||||
| 		watches := make([]*IssueWatch, 0, listOptions.PageSize) | 		watches := make([]*IssueWatch, 0, listOptions.PageSize) | ||||||
| 		return watches, sess.Find(&watches) | 		return watches, sess.Find(&watches) | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -10,38 +10,49 @@ import ( | |||||||
| 	"xorm.io/xorm" | 	"xorm.io/xorm" | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  | // Paginator is the base for different ListOptions types | ||||||
|  | type Paginator interface { | ||||||
|  | 	GetSkipTake() (skip, take int) | ||||||
|  | 	GetStartEnd() (start, end int) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // getPaginatedSession creates a paginated database session | ||||||
|  | func getPaginatedSession(p Paginator) *xorm.Session { | ||||||
|  | 	skip, take := p.GetSkipTake() | ||||||
|  |  | ||||||
|  | 	return x.Limit(take, skip) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // setSessionPagination sets pagination for a database session | ||||||
|  | func setSessionPagination(sess *xorm.Session, p Paginator) *xorm.Session { | ||||||
|  | 	skip, take := p.GetSkipTake() | ||||||
|  |  | ||||||
|  | 	return sess.Limit(take, skip) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // setSessionPagination sets pagination for a database engine | ||||||
|  | func setEnginePagination(e Engine, p Paginator) Engine { | ||||||
|  | 	skip, take := p.GetSkipTake() | ||||||
|  |  | ||||||
|  | 	return e.Limit(take, skip) | ||||||
|  | } | ||||||
|  |  | ||||||
| // ListOptions options to paginate results | // ListOptions options to paginate results | ||||||
| type ListOptions struct { | type ListOptions struct { | ||||||
| 	PageSize int | 	PageSize int | ||||||
| 	Page     int // start from 1 | 	Page     int // start from 1 | ||||||
| } | } | ||||||
|  |  | ||||||
| func (opts *ListOptions) getPaginatedSession() *xorm.Session { | // GetSkipTake returns the skip and take values | ||||||
|  | func (opts *ListOptions) GetSkipTake() (skip, take int) { | ||||||
| 	opts.setDefaultValues() | 	opts.setDefaultValues() | ||||||
|  | 	return (opts.Page - 1) * opts.PageSize, opts.PageSize | ||||||
| 	return x.Limit(opts.PageSize, (opts.Page-1)*opts.PageSize) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (opts *ListOptions) setSessionPagination(sess *xorm.Session) *xorm.Session { |  | ||||||
| 	opts.setDefaultValues() |  | ||||||
|  |  | ||||||
| 	if opts.PageSize <= 0 { |  | ||||||
| 		return sess |  | ||||||
| 	} |  | ||||||
| 	return sess.Limit(opts.PageSize, (opts.Page-1)*opts.PageSize) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (opts *ListOptions) setEnginePagination(e Engine) Engine { |  | ||||||
| 	opts.setDefaultValues() |  | ||||||
|  |  | ||||||
| 	return e.Limit(opts.PageSize, (opts.Page-1)*opts.PageSize) |  | ||||||
| } | } | ||||||
|  |  | ||||||
| // GetStartEnd returns the start and end of the ListOptions | // GetStartEnd returns the start and end of the ListOptions | ||||||
| func (opts *ListOptions) GetStartEnd() (start, end int) { | func (opts *ListOptions) GetStartEnd() (start, end int) { | ||||||
| 	opts.setDefaultValues() | 	start, take := opts.GetSkipTake() | ||||||
| 	start = (opts.Page - 1) * opts.PageSize | 	end = start + take | ||||||
| 	end = start + opts.PageSize |  | ||||||
| 	return | 	return | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -56,3 +67,33 @@ func (opts *ListOptions) setDefaultValues() { | |||||||
| 		opts.Page = 1 | 		opts.Page = 1 | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // AbsoluteListOptions absolute options to paginate results | ||||||
|  | type AbsoluteListOptions struct { | ||||||
|  | 	skip int | ||||||
|  | 	take int | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // NewAbsoluteListOptions creates a list option with applied limits | ||||||
|  | func NewAbsoluteListOptions(skip, take int) *AbsoluteListOptions { | ||||||
|  | 	if skip < 0 { | ||||||
|  | 		skip = 0 | ||||||
|  | 	} | ||||||
|  | 	if take <= 0 { | ||||||
|  | 		take = setting.API.DefaultPagingNum | ||||||
|  | 	} | ||||||
|  | 	if take > setting.API.MaxResponseItems { | ||||||
|  | 		take = setting.API.MaxResponseItems | ||||||
|  | 	} | ||||||
|  | 	return &AbsoluteListOptions{skip, take} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetSkipTake returns the skip and take values | ||||||
|  | func (opts *AbsoluteListOptions) GetSkipTake() (skip, take int) { | ||||||
|  | 	return opts.skip, opts.take | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetStartEnd returns the start and end values | ||||||
|  | func (opts *AbsoluteListOptions) GetStartEnd() (start, end int) { | ||||||
|  | 	return opts.skip, opts.skip + opts.take | ||||||
|  | } | ||||||
|   | |||||||
							
								
								
									
										62
									
								
								models/list_options_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								models/list_options_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,62 @@ | |||||||
|  | // Copyright 2021 The Gitea Authors. All rights reserved. | ||||||
|  | // Use of this source code is governed by a MIT-style | ||||||
|  | // license that can be found in the LICENSE file. | ||||||
|  |  | ||||||
|  | package models | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"testing" | ||||||
|  |  | ||||||
|  | 	"code.gitea.io/gitea/modules/setting" | ||||||
|  |  | ||||||
|  | 	"github.com/stretchr/testify/assert" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | func TestPaginator(t *testing.T) { | ||||||
|  | 	cases := []struct { | ||||||
|  | 		Paginator | ||||||
|  | 		Skip  int | ||||||
|  | 		Take  int | ||||||
|  | 		Start int | ||||||
|  | 		End   int | ||||||
|  | 	}{ | ||||||
|  | 		{ | ||||||
|  | 			Paginator: &ListOptions{Page: -1, PageSize: -1}, | ||||||
|  | 			Skip:      0, | ||||||
|  | 			Take:      setting.API.DefaultPagingNum, | ||||||
|  | 			Start:     0, | ||||||
|  | 			End:       setting.API.DefaultPagingNum, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			Paginator: &ListOptions{Page: 2, PageSize: 10}, | ||||||
|  | 			Skip:      10, | ||||||
|  | 			Take:      10, | ||||||
|  | 			Start:     10, | ||||||
|  | 			End:       20, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			Paginator: NewAbsoluteListOptions(-1, -1), | ||||||
|  | 			Skip:      0, | ||||||
|  | 			Take:      setting.API.DefaultPagingNum, | ||||||
|  | 			Start:     0, | ||||||
|  | 			End:       setting.API.DefaultPagingNum, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			Paginator: NewAbsoluteListOptions(2, 10), | ||||||
|  | 			Skip:      2, | ||||||
|  | 			Take:      10, | ||||||
|  | 			Start:     2, | ||||||
|  | 			End:       12, | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	for _, c := range cases { | ||||||
|  | 		skip, take := c.Paginator.GetSkipTake() | ||||||
|  | 		start, end := c.Paginator.GetStartEnd() | ||||||
|  |  | ||||||
|  | 		assert.Equal(t, c.Skip, skip) | ||||||
|  | 		assert.Equal(t, c.Take, take) | ||||||
|  | 		assert.Equal(t, c.Start, start) | ||||||
|  | 		assert.Equal(t, c.End, end) | ||||||
|  | 	} | ||||||
|  | } | ||||||
| @@ -110,7 +110,7 @@ func (opts *FindNotificationOptions) ToCond() builder.Cond { | |||||||
| func (opts *FindNotificationOptions) ToSession(e Engine) *xorm.Session { | func (opts *FindNotificationOptions) ToSession(e Engine) *xorm.Session { | ||||||
| 	sess := e.Where(opts.ToCond()) | 	sess := e.Where(opts.ToCond()) | ||||||
| 	if opts.Page != 0 { | 	if opts.Page != 0 { | ||||||
| 		sess = opts.setSessionPagination(sess) | 		sess = setSessionPagination(sess, opts) | ||||||
| 	} | 	} | ||||||
| 	return sess | 	return sess | ||||||
| } | } | ||||||
|   | |||||||
| @@ -275,7 +275,7 @@ func ListOAuth2Applications(uid int64, listOptions ListOptions) ([]*OAuth2Applic | |||||||
| 		Desc("id") | 		Desc("id") | ||||||
|  |  | ||||||
| 	if listOptions.Page != 0 { | 	if listOptions.Page != 0 { | ||||||
| 		sess = listOptions.setSessionPagination(sess) | 		sess = setSessionPagination(sess, &listOptions) | ||||||
|  |  | ||||||
| 		apps := make([]*OAuth2Application, 0, listOptions.PageSize) | 		apps := make([]*OAuth2Application, 0, listOptions.PageSize) | ||||||
| 		total, err := sess.FindAndCount(&apps) | 		total, err := sess.FindAndCount(&apps) | ||||||
|   | |||||||
| @@ -569,7 +569,7 @@ func GetOrgUsersByUserID(uid int64, opts *SearchOrganizationsOptions) ([]*OrgUse | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if opts.PageSize != 0 { | 	if opts.PageSize != 0 { | ||||||
| 		sess = opts.setSessionPagination(sess) | 		sess = setSessionPagination(sess, opts) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	err := sess. | 	err := sess. | ||||||
| @@ -589,7 +589,7 @@ func getOrgUsersByOrgID(e Engine, opts *FindOrgMembersOpts) ([]*OrgUser, error) | |||||||
| 		sess.And("is_public = ?", true) | 		sess.And("is_public = ?", true) | ||||||
| 	} | 	} | ||||||
| 	if opts.ListOptions.PageSize > 0 { | 	if opts.ListOptions.PageSize > 0 { | ||||||
| 		sess = opts.setSessionPagination(sess) | 		sess = setSessionPagination(sess, opts) | ||||||
|  |  | ||||||
| 		ous := make([]*OrgUser, 0, opts.PageSize) | 		ous := make([]*OrgUser, 0, opts.PageSize) | ||||||
| 		return ous, sess.Find(&ous) | 		return ous, sess.Find(&ous) | ||||||
|   | |||||||
| @@ -168,7 +168,7 @@ func (t *Team) GetRepositories(opts *SearchTeamOptions) error { | |||||||
| 		return t.getRepositories(x) | 		return t.getRepositories(x) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return t.getRepositories(opts.getPaginatedSession()) | 	return t.getRepositories(getPaginatedSession(opts)) | ||||||
| } | } | ||||||
|  |  | ||||||
| func (t *Team) getMembers(e Engine) (err error) { | func (t *Team) getMembers(e Engine) (err error) { | ||||||
| @@ -182,7 +182,7 @@ func (t *Team) GetMembers(opts *SearchMembersOptions) (err error) { | |||||||
| 		return t.getMembers(x) | 		return t.getMembers(x) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return t.getMembers(opts.getPaginatedSession()) | 	return t.getMembers(getPaginatedSession(opts)) | ||||||
| } | } | ||||||
|  |  | ||||||
| // AddMember adds new membership of the team to the organization, | // AddMember adds new membership of the team to the organization, | ||||||
|   | |||||||
| @@ -100,7 +100,7 @@ func PullRequests(baseRepoID int64, opts *PullRequestsOptions) ([]*PullRequest, | |||||||
| 		log.Error("listPullRequestStatement: %v", err) | 		log.Error("listPullRequestStatement: %v", err) | ||||||
| 		return nil, maxResults, err | 		return nil, maxResults, err | ||||||
| 	} | 	} | ||||||
| 	findSession = opts.setSessionPagination(findSession) | 	findSession = setSessionPagination(findSession, opts) | ||||||
| 	prs := make([]*PullRequest, 0, opts.PageSize) | 	prs := make([]*PullRequest, 0, opts.PageSize) | ||||||
| 	return prs, maxResults, findSession.Find(&prs) | 	return prs, maxResults, findSession.Find(&prs) | ||||||
| } | } | ||||||
|   | |||||||
| @@ -208,7 +208,7 @@ func GetReleasesByRepoID(repoID int64, opts FindReleasesOptions) ([]*Release, er | |||||||
| 		Where(opts.toConds(repoID)) | 		Where(opts.toConds(repoID)) | ||||||
|  |  | ||||||
| 	if opts.PageSize != 0 { | 	if opts.PageSize != 0 { | ||||||
| 		sess = opts.setSessionPagination(sess) | 		sess = setSessionPagination(sess, &opts.ListOptions) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	rels := make([]*Release, 0, opts.PageSize) | 	rels := make([]*Release, 0, opts.PageSize) | ||||||
|   | |||||||
| @@ -1770,7 +1770,7 @@ func GetUserRepositories(opts *SearchRepoOptions) ([]*Repository, int64, error) | |||||||
|  |  | ||||||
| 	sess.Where(cond).OrderBy(opts.OrderBy.String()) | 	sess.Where(cond).OrderBy(opts.OrderBy.String()) | ||||||
| 	repos := make([]*Repository, 0, opts.PageSize) | 	repos := make([]*Repository, 0, opts.PageSize) | ||||||
| 	return repos, count, opts.setSessionPagination(sess).Find(&repos) | 	return repos, count, setSessionPagination(sess, opts).Find(&repos) | ||||||
| } | } | ||||||
|  |  | ||||||
| // GetUserMirrorRepositories returns a list of mirror repositories of given user. | // GetUserMirrorRepositories returns a list of mirror repositories of given user. | ||||||
| @@ -2061,7 +2061,7 @@ func (repo *Repository) GetForks(listOptions ListOptions) ([]*Repository, error) | |||||||
| 		return forks, x.Find(&forks, &Repository{ForkID: repo.ID}) | 		return forks, x.Find(&forks, &Repository{ForkID: repo.ID}) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	sess := listOptions.getPaginatedSession() | 	sess := getPaginatedSession(&listOptions) | ||||||
| 	forks := make([]*Repository, 0, listOptions.PageSize) | 	forks := make([]*Repository, 0, listOptions.PageSize) | ||||||
| 	return forks, sess.Find(&forks, &Repository{ForkID: repo.ID}) | 	return forks, sess.Find(&forks, &Repository{ForkID: repo.ID}) | ||||||
| } | } | ||||||
|   | |||||||
| @@ -65,7 +65,7 @@ func (repo *Repository) getCollaborations(e Engine, listOptions ListOptions) ([] | |||||||
| 		return collaborations, e.Find(&collaborations, &Collaboration{RepoID: repo.ID}) | 		return collaborations, e.Find(&collaborations, &Collaboration{RepoID: repo.ID}) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	e = listOptions.setEnginePagination(e) | 	e = setEnginePagination(e, &listOptions) | ||||||
|  |  | ||||||
| 	collaborations := make([]*Collaboration, 0, listOptions.PageSize) | 	collaborations := make([]*Collaboration, 0, listOptions.PageSize) | ||||||
| 	return collaborations, e.Find(&collaborations, &Collaboration{RepoID: repo.ID}) | 	return collaborations, e.Find(&collaborations, &Collaboration{RepoID: repo.ID}) | ||||||
|   | |||||||
| @@ -165,7 +165,7 @@ func (repo *Repository) GetWatchers(opts ListOptions) ([]*User, error) { | |||||||
| 		Join("LEFT", "watch", "`user`.id=`watch`.user_id"). | 		Join("LEFT", "watch", "`user`.id=`watch`.user_id"). | ||||||
| 		And("`watch`.mode<>?", RepoWatchModeDont) | 		And("`watch`.mode<>?", RepoWatchModeDont) | ||||||
| 	if opts.Page > 0 { | 	if opts.Page > 0 { | ||||||
| 		sess = opts.setSessionPagination(sess) | 		sess = setSessionPagination(sess, &opts) | ||||||
| 		users := make([]*User, 0, opts.PageSize) | 		users := make([]*User, 0, opts.PageSize) | ||||||
|  |  | ||||||
| 		return users, sess.Find(&users) | 		return users, sess.Find(&users) | ||||||
|   | |||||||
| @@ -195,7 +195,7 @@ func findReviews(e Engine, opts FindReviewOptions) ([]*Review, error) { | |||||||
| 	reviews := make([]*Review, 0, 10) | 	reviews := make([]*Review, 0, 10) | ||||||
| 	sess := e.Where(opts.toCond()) | 	sess := e.Where(opts.toCond()) | ||||||
| 	if opts.Page > 0 { | 	if opts.Page > 0 { | ||||||
| 		sess = opts.ListOptions.setSessionPagination(sess) | 		sess = setSessionPagination(sess, &opts) | ||||||
| 	} | 	} | ||||||
| 	return reviews, sess. | 	return reviews, sess. | ||||||
| 		Asc("created_unix"). | 		Asc("created_unix"). | ||||||
|   | |||||||
| @@ -195,7 +195,7 @@ func SearchPublicKey(uid int64, fingerprint string) ([]*PublicKey, error) { | |||||||
| func ListPublicKeys(uid int64, listOptions ListOptions) ([]*PublicKey, error) { | func ListPublicKeys(uid int64, listOptions ListOptions) ([]*PublicKey, error) { | ||||||
| 	sess := x.Where("owner_id = ? AND type != ?", uid, KeyTypePrincipal) | 	sess := x.Where("owner_id = ? AND type != ?", uid, KeyTypePrincipal) | ||||||
| 	if listOptions.Page != 0 { | 	if listOptions.Page != 0 { | ||||||
| 		sess = listOptions.setSessionPagination(sess) | 		sess = setSessionPagination(sess, &listOptions) | ||||||
|  |  | ||||||
| 		keys := make([]*PublicKey, 0, listOptions.PageSize) | 		keys := make([]*PublicKey, 0, listOptions.PageSize) | ||||||
| 		return keys, sess.Find(&keys) | 		return keys, sess.Find(&keys) | ||||||
|   | |||||||
| @@ -295,7 +295,7 @@ func listDeployKeys(e Engine, opts *ListDeployKeysOptions) ([]*DeployKey, error) | |||||||
| 	sess := e.Where(opts.toCond()) | 	sess := e.Where(opts.toCond()) | ||||||
|  |  | ||||||
| 	if opts.Page != 0 { | 	if opts.Page != 0 { | ||||||
| 		sess = opts.setSessionPagination(sess) | 		sess = setSessionPagination(sess, opts) | ||||||
|  |  | ||||||
| 		keys := make([]*DeployKey, 0, opts.PageSize) | 		keys := make([]*DeployKey, 0, opts.PageSize) | ||||||
| 		return keys, sess.Find(&keys) | 		return keys, sess.Find(&keys) | ||||||
|   | |||||||
| @@ -114,7 +114,7 @@ func CheckPrincipalKeyString(user *User, content string) (_ string, err error) { | |||||||
| func ListPrincipalKeys(uid int64, listOptions ListOptions) ([]*PublicKey, error) { | func ListPrincipalKeys(uid int64, listOptions ListOptions) ([]*PublicKey, error) { | ||||||
| 	sess := x.Where("owner_id = ? AND type = ?", uid, KeyTypePrincipal) | 	sess := x.Where("owner_id = ? AND type = ?", uid, KeyTypePrincipal) | ||||||
| 	if listOptions.Page != 0 { | 	if listOptions.Page != 0 { | ||||||
| 		sess = listOptions.setSessionPagination(sess) | 		sess = setSessionPagination(sess, &listOptions) | ||||||
|  |  | ||||||
| 		keys := make([]*PublicKey, 0, listOptions.PageSize) | 		keys := make([]*PublicKey, 0, listOptions.PageSize) | ||||||
| 		return keys, sess.Find(&keys) | 		return keys, sess.Find(&keys) | ||||||
|   | |||||||
| @@ -73,7 +73,7 @@ func (repo *Repository) GetStargazers(opts ListOptions) ([]*User, error) { | |||||||
| 	sess := x.Where("star.repo_id = ?", repo.ID). | 	sess := x.Where("star.repo_id = ?", repo.ID). | ||||||
| 		Join("LEFT", "star", "`user`.id = star.uid") | 		Join("LEFT", "star", "`user`.id = star.uid") | ||||||
| 	if opts.Page > 0 { | 	if opts.Page > 0 { | ||||||
| 		sess = opts.setSessionPagination(sess) | 		sess = setSessionPagination(sess, &opts) | ||||||
|  |  | ||||||
| 		users := make([]*User, 0, opts.PageSize) | 		users := make([]*User, 0, opts.PageSize) | ||||||
| 		return users, sess.Find(&users) | 		return users, sess.Find(&users) | ||||||
|   | |||||||
| @@ -145,7 +145,7 @@ func ListAccessTokens(opts ListAccessTokensOptions) ([]*AccessToken, error) { | |||||||
| 	sess = sess.Desc("id") | 	sess = sess.Desc("id") | ||||||
|  |  | ||||||
| 	if opts.Page != 0 { | 	if opts.Page != 0 { | ||||||
| 		sess = opts.setSessionPagination(sess) | 		sess = setSessionPagination(sess, &opts) | ||||||
|  |  | ||||||
| 		tokens := make([]*AccessToken, 0, opts.PageSize) | 		tokens := make([]*AccessToken, 0, opts.PageSize) | ||||||
| 		return tokens, sess.Find(&tokens) | 		return tokens, sess.Find(&tokens) | ||||||
|   | |||||||
| @@ -190,7 +190,7 @@ func FindTopics(opts *FindTopicOptions) ([]*Topic, int64, error) { | |||||||
| 		sess.Join("INNER", "repo_topic", "repo_topic.topic_id = topic.id") | 		sess.Join("INNER", "repo_topic", "repo_topic.topic_id = topic.id") | ||||||
| 	} | 	} | ||||||
| 	if opts.PageSize != 0 && opts.Page != 0 { | 	if opts.PageSize != 0 && opts.Page != 0 { | ||||||
| 		sess = opts.setSessionPagination(sess) | 		sess = setSessionPagination(sess, opts) | ||||||
| 	} | 	} | ||||||
| 	topics := make([]*Topic, 0, 10) | 	topics := make([]*Topic, 0, 10) | ||||||
| 	total, err := sess.Desc("topic.repo_count").FindAndCount(&topics) | 	total, err := sess.Desc("topic.repo_count").FindAndCount(&topics) | ||||||
|   | |||||||
| @@ -332,7 +332,7 @@ func (u *User) GetFollowers(listOptions ListOptions) ([]*User, error) { | |||||||
| 		Join("LEFT", "follow", "`user`.id=follow.user_id") | 		Join("LEFT", "follow", "`user`.id=follow.user_id") | ||||||
|  |  | ||||||
| 	if listOptions.Page != 0 { | 	if listOptions.Page != 0 { | ||||||
| 		sess = listOptions.setSessionPagination(sess) | 		sess = setSessionPagination(sess, &listOptions) | ||||||
|  |  | ||||||
| 		users := make([]*User, 0, listOptions.PageSize) | 		users := make([]*User, 0, listOptions.PageSize) | ||||||
| 		return users, sess.Find(&users) | 		return users, sess.Find(&users) | ||||||
| @@ -354,7 +354,7 @@ func (u *User) GetFollowing(listOptions ListOptions) ([]*User, error) { | |||||||
| 		Join("LEFT", "follow", "`user`.id=follow.follow_id") | 		Join("LEFT", "follow", "`user`.id=follow.follow_id") | ||||||
|  |  | ||||||
| 	if listOptions.Page != 0 { | 	if listOptions.Page != 0 { | ||||||
| 		sess = listOptions.setSessionPagination(sess) | 		sess = setSessionPagination(sess, &listOptions) | ||||||
|  |  | ||||||
| 		users := make([]*User, 0, listOptions.PageSize) | 		users := make([]*User, 0, listOptions.PageSize) | ||||||
| 		return users, sess.Find(&users) | 		return users, sess.Find(&users) | ||||||
| @@ -1670,7 +1670,7 @@ func SearchUsers(opts *SearchUserOptions) (users []*User, _ int64, _ error) { | |||||||
|  |  | ||||||
| 	sess := x.Where(cond).OrderBy(opts.OrderBy.String()) | 	sess := x.Where(cond).OrderBy(opts.OrderBy.String()) | ||||||
| 	if opts.Page != 0 { | 	if opts.Page != 0 { | ||||||
| 		sess = opts.setSessionPagination(sess) | 		sess = setSessionPagination(sess, opts) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	users = make([]*User, 0, opts.PageSize) | 	users = make([]*User, 0, opts.PageSize) | ||||||
| @@ -1686,7 +1686,7 @@ func GetStarredRepos(userID int64, private bool, listOptions ListOptions) ([]*Re | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if listOptions.Page != 0 { | 	if listOptions.Page != 0 { | ||||||
| 		sess = listOptions.setSessionPagination(sess) | 		sess = setSessionPagination(sess, &listOptions) | ||||||
|  |  | ||||||
| 		repos := make([]*Repository, 0, listOptions.PageSize) | 		repos := make([]*Repository, 0, listOptions.PageSize) | ||||||
| 		return repos, sess.Find(&repos) | 		return repos, sess.Find(&repos) | ||||||
| @@ -1706,7 +1706,7 @@ func GetWatchedRepos(userID int64, private bool, listOptions ListOptions) ([]*Re | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if listOptions.Page != 0 { | 	if listOptions.Page != 0 { | ||||||
| 		sess = listOptions.setSessionPagination(sess) | 		sess = setSessionPagination(sess, &listOptions) | ||||||
|  |  | ||||||
| 		repos := make([]*Repository, 0, listOptions.PageSize) | 		repos := make([]*Repository, 0, listOptions.PageSize) | ||||||
| 		total, err := sess.FindAndCount(&repos) | 		total, err := sess.FindAndCount(&repos) | ||||||
|   | |||||||
| @@ -415,7 +415,7 @@ func listWebhooksByOpts(e Engine, opts *ListWebhookOptions) ([]*Webhook, error) | |||||||
| 	sess := e.Where(opts.toCond()) | 	sess := e.Where(opts.toCond()) | ||||||
|  |  | ||||||
| 	if opts.Page != 0 { | 	if opts.Page != 0 { | ||||||
| 		sess = opts.setSessionPagination(sess) | 		sess = setSessionPagination(sess, opts) | ||||||
| 		webhooks := make([]*Webhook, 0, opts.PageSize) | 		webhooks := make([]*Webhook, 0, opts.PageSize) | ||||||
| 		err := sess.Find(&webhooks) | 		err := sess.Find(&webhooks) | ||||||
| 		return webhooks, err | 		return webhooks, err | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user