diff options
Diffstat (limited to 'pkg')
-rw-r--r-- | pkg/app/handler/maintainer/show.go | 344 | ||||
-rw-r--r-- | pkg/app/serve.go | 118 |
2 files changed, 254 insertions, 208 deletions
diff --git a/pkg/app/handler/maintainer/show.go b/pkg/app/handler/maintainer/show.go index ac19e71..8b66a18 100644 --- a/pkg/app/handler/maintainer/show.go +++ b/pkg/app/handler/maintainer/show.go @@ -12,27 +12,22 @@ import ( "github.com/go-pg/pg/v10" ) -// Show renders a template to show a given maintainer page -func Show(w http.ResponseWriter, r *http.Request) { - maintainerEmail, pageName, _ := strings.Cut(r.URL.Path[len("/maintainer/"):], "/") +func common(w http.ResponseWriter, r *http.Request) (maintainer models.Maintainer, packagesQuery *pg.Query, packagesCount int, err error) { + maintainerEmail := r.PathValue("email") if !strings.Contains(maintainerEmail, "@") { maintainerEmail += "@gentoo.org" } - var gpackages []*models.Package - query := database.DBCon.Model(&gpackages). - Column("atom") + packagesQuery = database.DBCon.Model((*models.Package)(nil)).Column("atom") if maintainerEmail == "maintainer-needed@gentoo.org" { - query = query.Where("NULLIF(maintainers, '[]') IS null") + packagesQuery = packagesQuery.Where("NULLIF(maintainers, '[]') IS null") } else { - query = query.Where("maintainers @> ?", `[{"Email": "`+maintainerEmail+`"}]`) + packagesQuery = packagesQuery.Where("maintainers @> ?", `[{"Email": "`+maintainerEmail+`"}]`) } - maintainer := models.Maintainer{ - Email: maintainerEmail, - } - err := database.DBCon.Model(&maintainer).WherePK().Relation("Project").Relation("Projects").Select() + maintainer = models.Maintainer{Email: maintainerEmail} + err = database.DBCon.Model(&maintainer).WherePK().Relation("Project").Relation("Projects").Select() if err != nil { http.NotFound(w, r) return @@ -43,156 +38,199 @@ func Show(w http.ResponseWriter, r *http.Request) { excludeList := strings.Join(userPreferences.Maintainers.ExcludedProjects, ",") for _, proj := range maintainer.Projects { if !strings.Contains(excludeList, proj.Email) { - query = query.WhereOr("maintainers @> ?", `[{"Email": "`+proj.Email+`"}]`) + packagesQuery = packagesQuery.WhereOr("maintainers @> ?", `[{"Email": "`+proj.Email+`"}]`) } } } - packagesCount, err := query.Clone().Count() + packagesCount, err = packagesQuery.Clone().Count() + if err != nil { + http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError) + return + } + + return +} + +func ShowChangelog(w http.ResponseWriter, r *http.Request) { + maintainer, query, packagesCount, err := common(w, r) + if err != nil { + return + } + var commits []*models.Commit + err = database.DBCon.Model(&commits). + Join("JOIN commit_to_packages").JoinOn("commit.id = commit_to_packages.commit_id"). + Where("commit_to_packages.package_atom IN (?)", query). + Order("preceding_commits DESC"). + Limit(50). + Select() + if err != nil { + http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError) + return + } + layout.Layout(maintainer.Name, "maintainers", + show(packagesCount, &maintainer, "Changelog", components.Changelog("", commits)), + ).Render(r.Context(), w) +} + +func ShowOutdated(w http.ResponseWriter, r *http.Request) { + maintainer, query, packagesCount, err := common(w, r) + if err != nil { + return + } + var outdated []components.OutdatedItem + descriptionQuery := database.DBCon.Model((*models.Version)(nil)). + Column("description"). + Where("atom = outdated_packages.atom"). + Limit(1) + err = database.DBCon.Model((*models.OutdatedPackages)(nil)). + Column("atom").ColumnExpr("(?) AS description", descriptionQuery). + Where("atom IN (?)", query). + Order("atom"). + Select(&outdated) + if err != nil { + http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError) + return + } + layout.Layout(maintainer.Name, "maintainers", + show(packagesCount, &maintainer, "Outdated", components.Outdated(outdated)), + ).Render(r.Context(), w) +} + +func ShowPullRequests(w http.ResponseWriter, r *http.Request) { + maintainer, query, packagesCount, err := common(w, r) + if err != nil { + return + } + var pullRequests []*models.GithubPullRequest + err = database.DBCon.Model(&pullRequests). + DistinctOn("github_pull_request.id"). + OrderExpr("github_pull_request.id DESC"). + Join("JOIN package_to_github_pull_requests").JoinOn("github_pull_request.id = package_to_github_pull_requests.github_pull_request_id"). + Where("package_atom IN (?)", query). + Select() + if err != nil { + http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError) + return + } + layout.Layout(maintainer.Name, "maintainers", + show(packagesCount, &maintainer, "Pull requests", components.PullRequests(len(pullRequests) > 0, pullRequests)), + ).Render(r.Context(), w) +} + +func ShowStabilization(w http.ResponseWriter, r *http.Request) { + maintainer, query, packagesCount, err := common(w, r) + if err != nil { + return + } + var results []*models.PkgCheckResult + err = database.DBCon.Model(&results). + Column("atom", "cpv", "message"). + Where("class = ?", "StableRequest"). + Where("atom IN (?)", query). + OrderExpr("cpv"). + Select() + if err != nil { + http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError) + return + } + layout.Layout(maintainer.Name, "maintainers", + show(packagesCount, &maintainer, "Stabilization", components.Stabilizations(len(results) > 0, results)), + ).Render(r.Context(), w) +} + +func ShowBugs(w http.ResponseWriter, r *http.Request) { + maintainer, query, packagesCount, err := common(w, r) + if err != nil { + return + } + var bugs []*models.Bug + err = database.DBCon.Model(&bugs). + DistinctOn("id::INT"). + Column("id", "summary", "component", "assignee"). + OrderExpr("id::INT"). + With("wanted", query). + Where("id IN (?)", + database.DBCon.Model((*models.PackageToBug)(nil)). + Column("bug_id"). + Join("JOIN wanted").JoinOn("package_atom = wanted.atom")). + WhereOr("id IN (?)", + database.DBCon.Model((*models.VersionToBug)(nil)). + Column("bug_id"). + Join("JOIN versions").JoinOn("version_id = versions.id"). + Join("JOIN wanted").JoinOn("versions.atom = wanted.atom")). + Select() + if err != nil { + http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError) + return + } + generalCount, stabilizationCount, keywordingCount := countBugsCategories(bugs) + layout.Layout(maintainer.Name, "maintainers", + show(packagesCount, &maintainer, "Bugs", components.Bugs(generalCount, stabilizationCount, keywordingCount, bugs)), + ).Render(r.Context(), w) +} + +func ShowSecurity(w http.ResponseWriter, r *http.Request) { + maintainer, query, packagesCount, err := common(w, r) + if err != nil { + return + } + var bugs []*models.Bug + err = database.DBCon.Model(&bugs). + DistinctOn("id::INT"). + Column("id", "summary", "component", "assignee"). + OrderExpr("id::INT"). + With("wanted", query). + Where("component = ?", "Vulnerabilities"). + Where("id IN (?)", + database.DBCon.Model((*models.PackageToBug)(nil)). + Column("bug_id"). + Join("JOIN wanted").JoinOn("package_atom = wanted.atom")). + Select() + if err != nil { + http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError) + return + } + layout.Layout(maintainer.Name, "maintainers", + show(packagesCount, &maintainer, "Security", components.SecurityBugs(len(bugs) > 0, bugs)), + ).Render(r.Context(), w) +} + +func ShowStabilizationFile(w http.ResponseWriter, r *http.Request) { + _, query, _, err := common(w, r) + if err != nil { + return + } + pageName := r.URL.Path[strings.LastIndexByte(r.URL.Path, '/')+1:] + + var gpackages []*models.Package + err = query.Model(&gpackages). + Relation("Versions"). + Relation("Versions.PkgCheckResults", func(q *pg.Query) (*pg.Query, error) { + return q.Where("class = ?", "StableRequest"), nil + }).Select() if err != nil { http.NotFound(w, r) return } + utils.StabilizationExport(w, pageName, gpackages) +} - switch pageName { - case "changelog": - var commits []*models.Commit - err = database.DBCon.Model(&commits). - Join("JOIN commit_to_packages").JoinOn("commit.id = commit_to_packages.commit_id"). - Where("commit_to_packages.package_atom IN (?)", query). - Order("preceding_commits DESC"). - Limit(50). - Select() - if err != nil { - http.NotFound(w, r) - return - } - layout.Layout(maintainer.Name, "maintainers", - show(packagesCount, &maintainer, "Changelog", components.Changelog("", commits)), - ).Render(r.Context(), w) - return - case "outdated": - var outdated []components.OutdatedItem - descriptionQuery := database.DBCon.Model((*models.Version)(nil)). - Column("description"). - Where("atom = outdated_packages.atom"). - Limit(1) - err := database.DBCon.Model((*models.OutdatedPackages)(nil)). - Column("atom").ColumnExpr("(?) AS description", descriptionQuery). - Where("atom IN (?)", query). - Order("atom"). - Select(&outdated) - if err != nil { - http.NotFound(w, r) - return - } - layout.Layout(maintainer.Name, "maintainers", - show(packagesCount, &maintainer, "Outdated", components.Outdated(outdated)), - ).Render(r.Context(), w) - return - case "pull-requests": - var pullRequests []*models.GithubPullRequest - err = database.DBCon.Model(&pullRequests). - DistinctOn("github_pull_request.id"). - OrderExpr("github_pull_request.id DESC"). - Join("JOIN package_to_github_pull_requests").JoinOn("github_pull_request.id = package_to_github_pull_requests.github_pull_request_id"). - Where("package_atom IN (?)", query). - Select() - if err != nil { - http.NotFound(w, r) - return - } - layout.Layout(maintainer.Name, "maintainers", - show(packagesCount, &maintainer, "Pull requests", components.PullRequests(len(pullRequests) > 0, pullRequests)), - ).Render(r.Context(), w) - return - case "stabilization": - var results []*models.PkgCheckResult - err = database.DBCon.Model(&results). - Column("atom", "cpv", "message"). - Where("class = ?", "StableRequest"). - Where("atom IN (?)", query). - OrderExpr("cpv"). - Select() - if err != nil { - http.NotFound(w, r) - return - } - layout.Layout(maintainer.Name, "maintainers", - show(packagesCount, &maintainer, "Stabilization", components.Stabilizations(len(results) > 0, results)), - ).Render(r.Context(), w) - return - case "bugs": - var bugs []*models.Bug - err = database.DBCon.Model(&bugs). - DistinctOn("id::INT"). - Column("id", "summary", "component", "assignee"). - OrderExpr("id::INT"). - With("wanted", query). - Where("id IN (?)", - database.DBCon.Model((*models.PackageToBug)(nil)). - Column("bug_id"). - Join("JOIN wanted").JoinOn("package_atom = wanted.atom")). - WhereOr("id IN (?)", - database.DBCon.Model((*models.VersionToBug)(nil)). - Column("bug_id"). - Join("JOIN versions").JoinOn("version_id = versions.id"). - Join("JOIN wanted").JoinOn("versions.atom = wanted.atom")). - Select() - if err != nil { - http.NotFound(w, r) - return - } - generalCount, stabilizationCount, keywordingCount := countBugsCategories(bugs) - layout.Layout(maintainer.Name, "maintainers", - show(packagesCount, &maintainer, "Bugs", components.Bugs(generalCount, stabilizationCount, keywordingCount, bugs)), - ).Render(r.Context(), w) - return - case "security": - var bugs []*models.Bug - err = database.DBCon.Model(&bugs). - DistinctOn("id::INT"). - Column("id", "summary", "component", "assignee"). - OrderExpr("id::INT"). - With("wanted", query). - Where("component = ?", "Vulnerabilities"). - Where("id IN (?)", - database.DBCon.Model((*models.PackageToBug)(nil)). - Column("bug_id"). - Join("JOIN wanted").JoinOn("package_atom = wanted.atom")). - Select() - if err != nil { - http.NotFound(w, r) - return - } - layout.Layout(maintainer.Name, "maintainers", - show(packagesCount, &maintainer, "Security", components.SecurityBugs(len(bugs) > 0, bugs)), - ).Render(r.Context(), w) - return - case "stabilization.json", "stabilization.xml", "stabilization.list": - err = query. - Relation("Versions"). - Relation("Versions.PkgCheckResults", func(q *pg.Query) (*pg.Query, error) { - return q.Where("class = ?", "StableRequest"), nil - }).Select() - if err != nil { - http.NotFound(w, r) - return - } - utils.StabilizationExport(w, pageName, gpackages) - return - default: - pageName = "packages" - err = query.Column("category"). - Order("category", "name"). - Relation("Versions").Select() - if err != nil { - http.NotFound(w, r) - return - } - layout.Layout(maintainer.Name, "maintainers", - show(packagesCount, &maintainer, "Packages", showPackages(gpackages, &maintainer)), - ).Render(r.Context(), w) +func ShowPackages(w http.ResponseWriter, r *http.Request) { + maintainer, query, packagesCount, err := common(w, r) + if err != nil { + return + } + var gpackages []*models.Package + err = query.Model(&gpackages). + Column("category"). + Order("category", "name"). + Relation("Versions").Select() + if err != nil { + http.NotFound(w, r) return } + layout.Layout(maintainer.Name, "maintainers", + show(packagesCount, &maintainer, "Packages", showPackages(gpackages, &maintainer)), + ).Render(r.Context(), w) } diff --git a/pkg/app/serve.go b/pkg/app/serve.go index 66bd220..f9d964b 100644 --- a/pkg/app/serve.go +++ b/pkg/app/serve.go @@ -31,60 +31,69 @@ func Serve() { database.Connect() defer database.DBCon.Close() - setRoute("/categories", categories.Index) - setRoute("/categories.json", categories.JSONCategories) - setRoute("/categories/", categories.Show) - - setRoute("/useflags/popular.json", useflags.Popular) - setRoute("/useflags/suggest.json", useflags.Suggest) - setRoute("/useflags/search", useflags.Search) - setRoute("/useflags/global", useflags.Global) - setRoute("/useflags/local", useflags.Local) - setRoute("/useflags/expand", useflags.Expand) - setRoute("/useflags/popular", useflags.PopularPage) - setRoute("/useflags", useflags.Default) - setRoute("/useflags/", useflags.Show) - - setRoute("/arches", arches.Index) - setRoute("/arches/", arches.Show) - - setRoute("/about", about.Index) - setRoute("/about/help", about.Help) - setRoute("/about/feedback", about.Feedback) - setRoute("/about/feeds", about.Feeds) - setRoute("/about/status", about.Status) - - setRoute("/maintainers", maintainer.BrowseProjects) - redirect("/maintainers/gentoo-projects", "/maintainers") - setRoute("/maintainers/gentoo-developers", maintainer.BrowseDevs) - setRoute("/maintainers/proxied-maintainers", maintainer.BrowseProxyDevs) - setRoute("/maintainer/", maintainer.Show) - - setRoute("/packages/search", packages.Search) - setRoute("/packages/suggest.json", packages.Suggest) - setRoute("/packages/resolve.json", packages.Resolve) - setRoute("/packages/added", packages.Added) - setRoute("/packages/updated", packages.Updated) - setRoute("/packages/stable", packages.Stabilized) - setRoute("/packages/keyworded", packages.Keyworded) - setRoute("/packages/", packages.Show) - setRoute("/", index.Show) - - setRoute("/packages/added.atom", packages.AddedFeed) - setRoute("/packages/updated.atom", packages.UpdatedFeed) - setRoute("/packages/keyworded.atom", packages.KeywordedFeed) - setRoute("/packages/stable.atom", packages.StabilizedFeed) - // Added for backwards compability - redirect("/packages/stabilized.atom", "/packages/stable.atom") - setRoute("/packages/search.atom", packages.SearchFeed) - - setRoute("/user", user.Preferences("General")) - setRoute("/user/preferences", user.Preferences("General")) - setRoute("/user/preferences/general", user.Preferences("General")) - setRoute("/user/preferences/packages", user.Preferences("Packages")) - setRoute("/user/preferences/maintainers", user.Preferences("Maintainers")) - setRoute("/user/preferences/useflags", user.Preferences("USE flags")) - setRoute("/user/preferences/arches", user.Preferences("Architectures")) + setRoute("GET /categories", categories.Index) + setRoute("GET /categories.json", categories.JSONCategories) + setRoute("GET /categories/", categories.Show) + + setRoute("GET /useflags/popular.json", useflags.Popular) + setRoute("GET /useflags/suggest.json", useflags.Suggest) + setRoute("GET /useflags/search", useflags.Search) + setRoute("GET /useflags/global", useflags.Global) + setRoute("GET /useflags/local", useflags.Local) + setRoute("GET /useflags/expand", useflags.Expand) + setRoute("GET /useflags/popular", useflags.PopularPage) + setRoute("GET /useflags", useflags.Default) + setRoute("GET /useflags/", useflags.Show) + + setRoute("GET /arches", arches.Index) + setRoute("GET /arches/", arches.Show) + + setRoute("GET /about", about.Index) + setRoute("GET /about/help", about.Help) + setRoute("GET /about/feedback", about.Feedback) + setRoute("GET /about/feeds", about.Feeds) + setRoute("GET /about/status", about.Status) + + setRoute("GET /maintainers", maintainer.BrowseProjects) + redirect("GET /maintainers/gentoo-projects", "/maintainers") + setRoute("GET /maintainers/gentoo-developers", maintainer.BrowseDevs) + setRoute("GET /maintainers/proxied-maintainers", maintainer.BrowseProxyDevs) + setRoute("GET /maintainer/{email}", maintainer.ShowPackages) + setRoute("GET /maintainer/{email}/bugs", maintainer.ShowBugs) + setRoute("GET /maintainer/{email}/changelog", maintainer.ShowChangelog) + setRoute("GET /maintainer/{email}/outdated", maintainer.ShowOutdated) + setRoute("GET /maintainer/{email}/pull-requests", maintainer.ShowPullRequests) + setRoute("GET /maintainer/{email}/security", maintainer.ShowSecurity) + setRoute("GET /maintainer/{email}/stabilization", maintainer.ShowStabilization) + setRoute("GET /maintainer/{email}/stabilization.json", maintainer.ShowStabilizationFile) + setRoute("GET /maintainer/{email}/stabilization.list", maintainer.ShowStabilizationFile) + setRoute("GET /maintainer/{email}/stabilization.xml", maintainer.ShowStabilizationFile) + + setRoute("GET /packages/search", packages.Search) + setRoute("GET /packages/suggest.json", packages.Suggest) + setRoute("GET /packages/resolve.json", packages.Resolve) + setRoute("GET /packages/added", packages.Added) + setRoute("GET /packages/updated", packages.Updated) + setRoute("GET /packages/stable", packages.Stabilized) + setRoute("GET /packages/keyworded", packages.Keyworded) + setRoute("GET /packages/", packages.Show) + setRoute("GET /{$}", index.Show) + + setRoute("GET /packages/added.atom", packages.AddedFeed) + setRoute("GET /packages/updated.atom", packages.UpdatedFeed) + setRoute("GET /packages/keyworded.atom", packages.KeywordedFeed) + setRoute("GET /packages/stable.atom", packages.StabilizedFeed) + // Added for backwards compatibility + redirect("GET /packages/stabilized.atom", "/packages/stable.atom") + setRoute("GET /packages/search.atom", packages.SearchFeed) + + redirect("GET /user", "/user/preferences/general") + redirect("GET /user/preferences", "/user/preferences/general") + setRoute("GET /user/preferences/general", user.Preferences("General")) + setRoute("GET /user/preferences/packages", user.Preferences("Packages")) + setRoute("GET /user/preferences/maintainers", user.Preferences("Maintainers")) + setRoute("GET /user/preferences/useflags", user.Preferences("USE flags")) + setRoute("GET /user/preferences/arches", user.Preferences("Architectures")) setRoute("/user/preferences/general/layout", user.General) setRoute("/user/preferences/general/reset", user.ResetGeneral) @@ -119,7 +128,6 @@ func Serve() { logger.Info.Println("Serving on port: " + config.Port()) log.Fatal(http.ListenAndServe(":"+config.Port(), nil)) - } // define a route using the default middleware and the given handler |