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)
17
18func RepoIssues(is isvc.Service, rs rsvc.Service, p *pages.Pages, d *db.DB) http.HandlerFunc {
19 return func(w http.ResponseWriter, r *http.Request) {
20 ctx := r.Context()
21 l := log.FromContext(ctx).With("handler", "RepoIssues")
22 repo, ok := request.RepoFromContext(ctx)
23 if !ok {
24 l.Error("malformed request")
25 p.Error503(w)
26 return
27 }
28
29 query := r.URL.Query()
30 searchOpts := models.IssueSearchOptions{
31 RepoAt: repo.RepoAt().String(),
32 Keyword: query.Get("q"),
33 IsOpen: query.Get("state") != "closed",
34 Page: pagination.FromContext(ctx),
35 }
36
37 issues, err := is.GetIssues(ctx, repo, searchOpts)
38 if err != nil {
39 l.Error("failed to get issues")
40 p.Error503(w)
41 return
42 }
43
44 // render page
45 err = func() error {
46 user := session.UserFromContext(ctx)
47 repoinfo, err := rs.GetRepoInfo(ctx, repo, user)
48 if err != nil {
49 return err
50 }
51 labelDefs, err := db.GetLabelDefinitions(
52 d,
53 db.FilterIn("at_uri", repo.Labels),
54 db.FilterContains("scope", tangled.RepoIssueNSID),
55 )
56 if err != nil {
57 return err
58 }
59 defs := make(map[string]*models.LabelDefinition)
60 for _, l := range labelDefs {
61 defs[l.AtUri().String()] = &l
62 }
63 return p.RepoIssues(w, pages.RepoIssuesParams{
64 LoggedInUser: user,
65 RepoInfo: *repoinfo,
66
67 Issues: issues,
68 LabelDefs: defs,
69 FilteringByOpen: searchOpts.IsOpen,
70 FilterQuery: searchOpts.Keyword,
71 Page: searchOpts.Page,
72 })
73 }()
74 if err != nil {
75 l.Error("failed to render", "err", err)
76 p.Error503(w)
77 return
78 }
79 }
80}