From f8ae161c743f3249e4b580cddc46da41b98652a9 Mon Sep 17 00:00:00 2001 From: Unknwon Date: Fri, 13 Nov 2015 17:37:02 -0500 Subject: [PATCH] fix #1302 --- models/access.go | 24 ++++++++++++++++++------ routers/api/v1/repo.go | 4 ++-- routers/user/home.go | 20 +++++++++----------- 3 files changed, 29 insertions(+), 19 deletions(-) diff --git a/models/access.go b/models/access.go index fe8bf2c17e..9e8c2dfe69 100644 --- a/models/access.go +++ b/models/access.go @@ -67,9 +67,8 @@ func HasAccess(u *User, repo *Repository, testMode AccessMode) (bool, error) { return hasAccess(x, u, repo, testMode) } -// GetAccessibleRepositories finds all repositories where a user has access to, -// besides he/she owns. -func (u *User) GetAccessibleRepositories() (map[*Repository]AccessMode, error) { +// GetRepositoryAccesses finds all repositories with their access mode where a user has access but does not own. +func (u *User) GetRepositoryAccesses() (map[*Repository]AccessMode, error) { accesses := make([]*Access, 0, 10) if err := x.Find(&accesses, &Access{UserID: u.Id}); err != nil { return nil, err @@ -80,7 +79,7 @@ func (u *User) GetAccessibleRepositories() (map[*Repository]AccessMode, error) { repo, err := GetRepositoryByID(access.RepoID) if err != nil { if IsErrRepoNotExist(err) { - log.Error(4, "%v", err) + log.Error(4, "GetRepositoryByID: %v", err) continue } return nil, err @@ -92,11 +91,24 @@ func (u *User) GetAccessibleRepositories() (map[*Repository]AccessMode, error) { } repos[repo] = access.Mode } - - // FIXME: should we generate an ordered list here? Random looks weird. return repos, nil } +// GetAccessibleRepositories finds all repositories where a user has access but does not own. +func (u *User) GetAccessibleRepositories() ([]*Repository, error) { + accesses := make([]*Access, 0, 10) + if err := x.Find(&accesses, &Access{UserID: u.Id}); err != nil { + return nil, err + } + + repoIDs := make([]int64, 0, len(accesses)) + for _, access := range accesses { + repoIDs = append(repoIDs, access.RepoID) + } + repos := make([]*Repository, 0, len(repoIDs)) + return repos, x.Where("owner_id != ?", u.Id).In("id", repoIDs).Desc("updated").Find(&repos) +} + func maxAccessMode(modes ...AccessMode) AccessMode { max := ACCESS_MODE_NONE for _, mode := range modes { diff --git a/routers/api/v1/repo.go b/routers/api/v1/repo.go index 2341e28878..b4da4c6ff4 100644 --- a/routers/api/v1/repo.go +++ b/routers/api/v1/repo.go @@ -106,9 +106,9 @@ func ListMyRepos(ctx *middleware.Context) { } numOwnRepos := len(ownRepos) - accessibleRepos, err := ctx.User.GetAccessibleRepositories() + accessibleRepos, err := ctx.User.GetRepositoryAccesses() if err != nil { - ctx.APIError(500, "GetAccessibleRepositories", err) + ctx.APIError(500, "GetRepositoryAccesses", err) return } diff --git a/routers/user/home.go b/routers/user/home.go index fc94dfc9e2..b98d7e1157 100644 --- a/routers/user/home.go +++ b/routers/user/home.go @@ -62,23 +62,21 @@ func Dashboard(ctx *middleware.Context) { return } - // Check context type. if !ctxUser.IsOrganization() { - // Normal user. - ctxUser = ctx.User - collaborates, err := ctx.User.GetAccessibleRepositories() + collaborateRepos, err := ctx.User.GetAccessibleRepositories() if err != nil { ctx.Handle(500, "GetAccessibleRepositories", err) return } - repositories := make([]*models.Repository, 0, len(collaborates)) - for repo := range collaborates { - repositories = append(repositories, repo) + for i := range collaborateRepos { + if err = collaborateRepos[i].GetOwner(); err != nil { + ctx.Handle(500, "GetOwner: "+collaborateRepos[i].Name, err) + return + } } - - ctx.Data["CollaborateCount"] = len(repositories) - ctx.Data["CollaborativeRepos"] = repositories + ctx.Data["CollaborateCount"] = len(collaborateRepos) + ctx.Data["CollaborativeRepos"] = collaborateRepos } repos, err := models.GetRepositories(ctxUser.Id, true) @@ -89,7 +87,7 @@ func Dashboard(ctx *middleware.Context) { ctx.Data["Repos"] = repos // Get mirror repositories. - mirrors := make([]*models.Repository, 0, len(repos)/2) + mirrors := make([]*models.Repository, 0, 5) for _, repo := range repos { if repo.IsMirror { if err = repo.GetMirror(); err != nil {