1package repo
2
3import (
4 "net/http"
5
6 "github.com/go-chi/chi/v5"
7 "tangled.sh/tangled.sh/core/appview/middleware"
8)
9
10func (rp *Repo) Router(mw *middleware.Middleware) http.Handler {
11 r := chi.NewRouter()
12 r.Get("/", rp.RepoIndex)
13 r.Get("/commits/{ref}", rp.RepoLog)
14 r.Route("/tree/{ref}", func(r chi.Router) {
15 r.Get("/", rp.RepoIndex)
16 r.Get("/*", rp.RepoTree)
17 })
18 r.Get("/commit/{ref}", rp.RepoCommit)
19 r.Get("/branches", rp.RepoBranches)
20 r.Route("/tags", func(r chi.Router) {
21 r.Get("/", rp.RepoTags)
22 r.Route("/{tag}", func(r chi.Router) {
23 r.Use(middleware.AuthMiddleware(rp.oauth))
24 // require auth to download for now
25 r.Get("/download/{file}", rp.DownloadArtifact)
26
27 // require repo:push to upload or delete artifacts
28 //
29 // additionally: only the uploader can truly delete an artifact
30 // (record+blob will live on their pds)
31 r.Group(func(r chi.Router) {
32 r.With(mw.RepoPermissionMiddleware("repo:push"))
33 r.Post("/upload", rp.AttachArtifact)
34 r.Delete("/{file}", rp.DeleteArtifact)
35 })
36 })
37 })
38 r.Get("/blob/{ref}/*", rp.RepoBlob)
39 r.Get("/raw/{ref}/*", rp.RepoBlobRaw)
40
41 r.Route("/issues", func(r chi.Router) {
42 r.With(middleware.Paginate).Get("/", rp.RepoIssues)
43 r.Get("/{issue}", rp.RepoSingleIssue)
44
45 r.Group(func(r chi.Router) {
46 r.Use(middleware.AuthMiddleware(rp.oauth))
47 r.Get("/new", rp.NewIssue)
48 r.Post("/new", rp.NewIssue)
49 r.Post("/{issue}/comment", rp.NewIssueComment)
50 r.Route("/{issue}/comment/{comment_id}/", func(r chi.Router) {
51 r.Get("/", rp.IssueComment)
52 r.Delete("/", rp.DeleteIssueComment)
53 r.Get("/edit", rp.EditIssueComment)
54 r.Post("/edit", rp.EditIssueComment)
55 })
56 r.Post("/{issue}/close", rp.CloseIssue)
57 r.Post("/{issue}/reopen", rp.ReopenIssue)
58 })
59 })
60
61 r.Route("/fork", func(r chi.Router) {
62 r.Use(middleware.AuthMiddleware(rp.oauth))
63 r.Get("/", rp.ForkRepo)
64 r.Post("/", rp.ForkRepo)
65 r.With(mw.RepoPermissionMiddleware("repo:owner")).Route("/sync", func(r chi.Router) {
66 r.Post("/", rp.SyncRepoFork)
67 })
68 })
69
70 r.Route("/compare", func(r chi.Router) {
71 r.Get("/", rp.RepoCompareNew) // start an new comparison
72
73 // we have to wildcard here since we want to support GitHub's compare syntax
74 // /compare/{ref1}...{ref2}
75 // for example:
76 // /compare/master...some/feature
77 // /compare/master...example.com:another/feature <- this is a fork
78 r.Get("/{base}/{head}", rp.RepoCompare)
79 r.Get("/*", rp.RepoCompare)
80 })
81
82 // settings routes, needs auth
83 r.Group(func(r chi.Router) {
84 r.Use(middleware.AuthMiddleware(rp.oauth))
85 // repo description can only be edited by owner
86 r.With(mw.RepoPermissionMiddleware("repo:owner")).Route("/description", func(r chi.Router) {
87 r.Put("/", rp.RepoDescription)
88 r.Get("/", rp.RepoDescription)
89 r.Get("/edit", rp.RepoDescriptionEdit)
90 })
91 r.With(mw.RepoPermissionMiddleware("repo:settings")).Route("/settings", func(r chi.Router) {
92 r.Get("/", rp.RepoSettings)
93 r.With(mw.RepoPermissionMiddleware("repo:invite")).Put("/collaborator", rp.AddCollaborator)
94 r.With(mw.RepoPermissionMiddleware("repo:delete")).Delete("/delete", rp.DeleteRepo)
95 r.Put("/branches/default", rp.SetDefaultBranch)
96 })
97 })
98
99 return r
100}