aboutsummaryrefslogtreecommitdiff
path: root/routers/user/home.go
diff options
context:
space:
mode:
authorhgaiser <hansg91@gmail.com>2016-12-27 11:54:24 +0100
committer无闻 <u@gogs.io>2016-12-27 18:54:24 +0800
commite6ef75204bed1fc5438d1e0aefb62838c29d4829 (patch)
treeadf76820a0f14ac286e6b4af69016b9029877209 /routers/user/home.go
parentd674cb7f20e62f7f1c68465768b3fc7784008897 (diff)
Fix assigned/created issues in dashboard. (#3560)
* Fix assigned/created issues in dashboard. * Use GetUserIssueStats for getting all Dashboard stats. * Use gofmt to format the file properly. * Replace &Issue{} with new(Issue). * Check if user has access to given repository. * Remove unnecessary filtering of issues. * Return 404 error if invalid repository is given. * Use correct number of issues in paginater.
Diffstat (limited to 'routers/user/home.go')
-rw-r--r--routers/user/home.go165
1 files changed, 101 insertions, 64 deletions
diff --git a/routers/user/home.go b/routers/user/home.go
index 83b4b261..df178a93 100644
--- a/routers/user/home.go
+++ b/routers/user/home.go
@@ -172,35 +172,39 @@ func Issues(ctx *context.Context) {
var (
viewType string
sortType = ctx.Query("sort")
- filterMode = models.FM_ALL
- assigneeID int64
- posterID int64
+ filterMode = models.FM_YOUR_REPOSITORIES
)
if ctxUser.IsOrganization() {
- viewType = "all"
+ viewType = "your_repositories"
} else {
viewType = ctx.Query("type")
- types := []string{"assigned", "created_by"}
+ types := []string{"your_repositories", "assigned", "created_by"}
if !com.IsSliceContainsStr(types, viewType) {
- viewType = "all"
+ viewType = "your_repositories"
}
switch viewType {
+ case "your_repositories":
+ filterMode = models.FM_YOUR_REPOSITORIES
case "assigned":
filterMode = models.FM_ASSIGN
- assigneeID = ctxUser.ID
case "created_by":
filterMode = models.FM_CREATE
- posterID = ctxUser.ID
}
}
+ page := ctx.QueryInt("page")
+ if page <= 1 {
+ page = 1
+ }
+
repoID := ctx.QueryInt64("repo")
isShowClosed := ctx.Query("state") == "closed"
// Get repositories.
var err error
var repos []*models.Repository
+ userRepoIDs := make([]int64, 0, len(repos))
if ctxUser.IsOrganization() {
repos, _, err = ctxUser.GetUserRepositories(ctx.User.ID, 1, ctxUser.NumRepos)
if err != nil {
@@ -215,9 +219,6 @@ func Issues(ctx *context.Context) {
repos = ctxUser.Repos
}
- allCount := 0
- repoIDs := make([]int64, 0, len(repos))
- showRepos := make([]*models.Repository, 0, len(repos))
for _, repo := range repos {
if (isPullList && repo.NumPulls == 0) ||
(!isPullList &&
@@ -225,83 +226,119 @@ func Issues(ctx *context.Context) {
continue
}
- repoIDs = append(repoIDs, repo.ID)
+ userRepoIDs = append(userRepoIDs, repo.ID)
+ }
- if isPullList {
- allCount += repo.NumOpenPulls
- repo.NumOpenIssues = repo.NumOpenPulls
- repo.NumClosedIssues = repo.NumClosedPulls
- } else {
- allCount += repo.NumOpenIssues
+ var issues []*models.Issue
+ switch filterMode {
+ case models.FM_YOUR_REPOSITORIES:
+ // Get all issues from repositories from this user.
+ issues, err = models.Issues(&models.IssuesOptions{
+ RepoIDs: userRepoIDs,
+ RepoID: repoID,
+ Page: page,
+ IsClosed: isShowClosed,
+ IsPull: isPullList,
+ SortType: sortType,
+ })
+
+ case models.FM_ASSIGN:
+ // Get all issues assigned to this user.
+ issues, err = models.Issues(&models.IssuesOptions{
+ RepoID: repoID,
+ AssigneeID: ctxUser.ID,
+ Page: page,
+ IsClosed: isShowClosed,
+ IsPull: isPullList,
+ SortType: sortType,
+ })
+
+ case models.FM_CREATE:
+ // Get all issues created by this user.
+ issues, err = models.Issues(&models.IssuesOptions{
+ RepoID: repoID,
+ PosterID: ctxUser.ID,
+ Page: page,
+ IsClosed: isShowClosed,
+ IsPull: isPullList,
+ SortType: sortType,
+ })
+ }
+
+ if err != nil {
+ ctx.Handle(500, "Issues", err)
+ return
+ }
+
+ showRepos := make([]*models.Repository, 0, len(issues))
+ showReposSet := make(map[int64]bool)
+
+ if repoID > 0 {
+ repo, err := models.GetRepositoryByID(repoID)
+ if err != nil {
+ ctx.Handle(500, "GetRepositoryByID", fmt.Errorf("[#%d]%v", repoID, err))
+ return
}
- if filterMode != models.FM_ALL {
- // Calculate repository issue count with filter mode.
- numOpen, numClosed := repo.IssueStats(ctxUser.ID, filterMode, isPullList)
- repo.NumOpenIssues, repo.NumClosedIssues = int(numOpen), int(numClosed)
+ if err = repo.GetOwner(); err != nil {
+ ctx.Handle(500, "GetOwner", fmt.Errorf("[#%d]%v", repoID, err))
+ return
}
- if repo.ID == repoID ||
- (isShowClosed && repo.NumClosedIssues > 0) ||
- (!isShowClosed && repo.NumOpenIssues > 0) {
- showRepos = append(showRepos, repo)
+ // Check if user has access to given repository.
+ if !repo.IsOwnedBy(ctxUser.ID) && !repo.HasAccess(ctxUser) {
+ ctx.Handle(404, "Issues", fmt.Errorf("#%d", repoID))
+ return
}
+
+ showReposSet[repoID] = true
+ showRepos = append(showRepos, repo)
}
- ctx.Data["Repos"] = showRepos
- issueStats := models.GetUserIssueStats(repoID, ctxUser.ID, repoIDs, filterMode, isPullList)
- issueStats.AllCount = int64(allCount)
+ for _, issue := range issues {
+ // Get Repository data.
+ issue.Repo, err = models.GetRepositoryByID(issue.RepoID)
+ if err != nil {
+ ctx.Handle(500, "GetRepositoryByID", fmt.Errorf("[#%d]%v", issue.RepoID, err))
+ return
+ }
- page := ctx.QueryInt("page")
- if page <= 1 {
- page = 1
+ // Get Owner data.
+ if err = issue.Repo.GetOwner(); err != nil {
+ ctx.Handle(500, "GetOwner", fmt.Errorf("[#%d]%v", issue.RepoID, err))
+ return
+ }
+
+ // Append repo to list of shown repos
+ if filterMode == models.FM_YOUR_REPOSITORIES {
+ // Use a map to make sure we don't add the same Repository twice.
+ _, ok := showReposSet[issue.RepoID]
+ if !ok {
+ showReposSet[issue.RepoID] = true
+ // Append to list of shown Repositories.
+ showRepos = append(showRepos, issue.Repo)
+ }
+ }
}
+ issueStats := models.GetUserIssueStats(repoID, ctxUser.ID, userRepoIDs, filterMode, isPullList)
+
var total int
if !isShowClosed {
total = int(issueStats.OpenCount)
} else {
total = int(issueStats.ClosedCount)
}
- ctx.Data["Page"] = paginater.New(total, setting.UI.IssuePagingNum, page, 5)
- // Get issues.
- issues, err := models.Issues(&models.IssuesOptions{
- UserID: ctxUser.ID,
- AssigneeID: assigneeID,
- RepoID: repoID,
- PosterID: posterID,
- RepoIDs: repoIDs,
- Page: page,
- IsClosed: isShowClosed,
- IsPull: isPullList,
- SortType: sortType,
- })
- if err != nil {
- ctx.Handle(500, "Issues", err)
- return
- }
-
- // Get posters and repository.
- for i := range issues {
- issues[i].Repo, err = models.GetRepositoryByID(issues[i].RepoID)
- if err != nil {
- ctx.Handle(500, "GetRepositoryByID", fmt.Errorf("[#%d]%v", issues[i].ID, err))
- return
- }
-
- if err = issues[i].Repo.GetOwner(); err != nil {
- ctx.Handle(500, "GetOwner", fmt.Errorf("[#%d]%v", issues[i].ID, err))
- return
- }
- }
ctx.Data["Issues"] = issues
-
+ ctx.Data["Repos"] = showRepos
+ ctx.Data["Page"] = paginater.New(total, setting.UI.IssuePagingNum, page, 5)
ctx.Data["IssueStats"] = issueStats
ctx.Data["ViewType"] = viewType
ctx.Data["SortType"] = sortType
ctx.Data["RepoID"] = repoID
ctx.Data["IsShowClosed"] = isShowClosed
+
if isShowClosed {
ctx.Data["State"] = "closed"
} else {