forked from
tangled.org/core
fork
Configure Feed
Select the types of activity you want to include in your feed.
this repo has no description
fork
Configure Feed
Select the types of activity you want to include in your feed.
1package state
2
3import (
4 "net/http"
5 "strings"
6
7 "github.com/go-chi/chi/v5"
8)
9
10func (s *State) Router() http.Handler {
11 router := chi.NewRouter()
12
13 router.HandleFunc("/*", func(w http.ResponseWriter, r *http.Request) {
14 pat := chi.URLParam(r, "*")
15 if strings.HasPrefix(pat, "did:") || strings.HasPrefix(pat, "@") {
16 s.UserRouter().ServeHTTP(w, r)
17 } else {
18 s.StandardRouter().ServeHTTP(w, r)
19 }
20 })
21
22 return router
23}
24
25func (s *State) UserRouter() http.Handler {
26 r := chi.NewRouter()
27
28 // strip @ from user
29 r.Use(StripLeadingAt)
30
31 r.With(ResolveIdent(s)).Route("/{user}", func(r chi.Router) {
32 r.Get("/", s.ProfilePage)
33 r.With(ResolveRepo(s)).Route("/{repo}", func(r chi.Router) {
34 r.Get("/", s.RepoIndex)
35 r.Get("/commits/{ref}", s.RepoLog)
36 r.Route("/tree/{ref}", func(r chi.Router) {
37 r.Get("/", s.RepoIndex)
38 r.Get("/*", s.RepoTree)
39 })
40 r.Get("/commit/{ref}", s.RepoCommit)
41 r.Get("/branches", s.RepoBranches)
42 r.Get("/tags", s.RepoTags)
43 r.Get("/blob/{ref}/*", s.RepoBlob)
44
45 r.Route("/issues", func(r chi.Router) {
46 r.Get("/", s.RepoIssues)
47 r.Get("/{issue}", s.RepoSingleIssue)
48
49 r.Group(func(r chi.Router) {
50 r.Use(AuthMiddleware(s))
51 r.Get("/new", s.NewIssue)
52 r.Post("/new", s.NewIssue)
53 r.Post("/{issue}/comment", s.IssueComment)
54 r.Post("/{issue}/close", s.CloseIssue)
55 r.Post("/{issue}/reopen", s.ReopenIssue)
56 })
57 })
58
59 r.Route("/pulls", func(r chi.Router) {
60 r.Get("/", s.RepoPulls)
61 r.With(AuthMiddleware(s)).Route("/new", func(r chi.Router) {
62 r.Get("/", s.NewPull)
63 r.Post("/", s.NewPull)
64 })
65
66 r.Route("/{pull}", func(r chi.Router) {
67 r.Use(ResolvePull(s))
68 r.Get("/", s.RepoSinglePull)
69 r.Get("/round/{round}", s.RepoPullPatch)
70
71 // authorized requests below this point
72 r.Group(func(r chi.Router) {
73 r.Use(AuthMiddleware(s))
74 r.Post("/resubmit", s.ResubmitPull)
75 r.Post("/comment", s.PullComment)
76 r.Post("/close", s.ClosePull)
77 r.Post("/reopen", s.ReopenPull)
78 // collaborators only
79 r.Group(func(r chi.Router) {
80 r.Use(RepoPermissionMiddleware(s, "repo:push"))
81 r.Post("/merge", s.MergePull)
82 // maybe lock, etc.
83 })
84 })
85 })
86 })
87
88 // These routes get proxied to the knot
89 r.Get("/info/refs", s.InfoRefs)
90 r.Post("/git-upload-pack", s.UploadPack)
91
92 // settings routes, needs auth
93 r.Group(func(r chi.Router) {
94 r.Use(AuthMiddleware(s))
95 // repo description can only be edited by owner
96 r.With(RepoPermissionMiddleware(s, "repo:owner")).Route("/description", func(r chi.Router) {
97 r.Put("/", s.RepoDescription)
98 r.Get("/", s.RepoDescription)
99 r.Get("/edit", s.RepoDescriptionEdit)
100 })
101 r.With(RepoPermissionMiddleware(s, "repo:settings")).Route("/settings", func(r chi.Router) {
102 r.Get("/", s.RepoSettings)
103 r.With(RepoPermissionMiddleware(s, "repo:invite")).Put("/collaborator", s.AddCollaborator)
104 })
105 })
106 })
107 })
108
109 r.NotFound(func(w http.ResponseWriter, r *http.Request) {
110 s.pages.Error404(w)
111 })
112
113 return r
114}
115
116func (s *State) StandardRouter() http.Handler {
117 r := chi.NewRouter()
118
119 r.Handle("/static/*", s.pages.Static())
120
121 r.Get("/", s.Timeline)
122
123 r.With(AuthMiddleware(s)).Get("/logout", s.Logout)
124
125 r.Route("/login", func(r chi.Router) {
126 r.Get("/", s.Login)
127 r.Post("/", s.Login)
128 })
129
130 r.Route("/knots", func(r chi.Router) {
131 r.Use(AuthMiddleware(s))
132 r.Get("/", s.Knots)
133 r.Post("/key", s.RegistrationKey)
134
135 r.Route("/{domain}", func(r chi.Router) {
136 r.Post("/init", s.InitKnotServer)
137 r.Get("/", s.KnotServerInfo)
138 r.Route("/member", func(r chi.Router) {
139 r.Use(KnotOwner(s))
140 r.Get("/", s.ListMembers)
141 r.Put("/", s.AddMember)
142 r.Delete("/", s.RemoveMember)
143 })
144 })
145 })
146
147 r.Route("/repo", func(r chi.Router) {
148 r.Route("/new", func(r chi.Router) {
149 r.Use(AuthMiddleware(s))
150 r.Get("/", s.NewRepo)
151 r.Post("/", s.NewRepo)
152 })
153 // r.Post("/import", s.ImportRepo)
154 })
155
156 r.With(AuthMiddleware(s)).Route("/follow", func(r chi.Router) {
157 r.Post("/", s.Follow)
158 r.Delete("/", s.Follow)
159 })
160
161 r.With(AuthMiddleware(s)).Route("/star", func(r chi.Router) {
162 r.Post("/", s.Star)
163 r.Delete("/", s.Star)
164 })
165
166 r.Route("/settings", func(r chi.Router) {
167 r.Use(AuthMiddleware(s))
168 r.Get("/", s.Settings)
169 r.Put("/keys", s.SettingsKeys)
170 })
171
172 r.Get("/keys/{user}", s.Keys)
173
174 r.NotFound(func(w http.ResponseWriter, r *http.Request) {
175 s.pages.Error404(w)
176 })
177 return r
178}