this repo has no description
1package handler
2
3import (
4 "net/http"
5
6 "tangled.org/core/api/tangled"
7 "tangled.org/core/appview/db"
8 "tangled.org/core/appview/models"
9 "tangled.org/core/appview/pages"
10 "tangled.org/core/appview/pagination"
11 isvc "tangled.org/core/appview/service/issue"
12 rsvc "tangled.org/core/appview/service/repo"
13 "tangled.org/core/appview/session"
14 "tangled.org/core/appview/web/request"
15 "tangled.org/core/log"
16 "tangled.org/core/orm"
17)
18
19func RepoIssues(is isvc.Service, rs rsvc.Service, p *pages.Pages, d *db.DB) http.HandlerFunc {
20 return func(w http.ResponseWriter, r *http.Request) {
21 ctx := r.Context()
22 l := log.FromContext(ctx).With("handler", "RepoIssues")
23 repo, ok := request.RepoFromContext(ctx)
24 if !ok {
25 l.Error("malformed request")
26 p.Error503(w)
27 return
28 }
29 repoOwnerId, ok := request.OwnerFromContext(ctx)
30 if !ok {
31 l.Error("malformed request")
32 p.Error503(w)
33 return
34 }
35
36 query := r.URL.Query()
37 searchOpts := models.IssueSearchOptions{
38 RepoAt: repo.RepoAt().String(),
39 Keyword: query.Get("q"),
40 IsOpen: query.Get("state") != "closed",
41 Page: pagination.FromContext(ctx),
42 }
43
44 issues, err := is.GetIssues(ctx, repo, searchOpts)
45 if err != nil {
46 l.Error("failed to get issues")
47 p.Error503(w)
48 return
49 }
50
51 // render page
52 err = func() error {
53 user := session.UserFromContext(ctx)
54 repoinfo, err := rs.GetRepoInfo(ctx, repoOwnerId, repo, "", "", user)
55 if err != nil {
56 return err
57 }
58 labelDefs, err := db.GetLabelDefinitions(
59 d,
60 orm.FilterIn("at_uri", repo.Labels),
61 orm.FilterContains("scope", tangled.RepoIssueNSID),
62 )
63 if err != nil {
64 return err
65 }
66 defs := make(map[string]*models.LabelDefinition)
67 for _, l := range labelDefs {
68 defs[l.AtUri().String()] = &l
69 }
70 return p.RepoIssues(w, pages.RepoIssuesParams{
71 LoggedInUser: user,
72 RepoInfo: *repoinfo,
73
74 Issues: issues,
75 LabelDefs: defs,
76 FilteringByOpen: searchOpts.IsOpen,
77 FilterQuery: searchOpts.Keyword,
78 Page: searchOpts.Page,
79 })
80 }()
81 if err != nil {
82 l.Error("failed to render", "err", err)
83 p.Error503(w)
84 return
85 }
86 }
87}