This repository has no description
1package repo
2
3import (
4 "net/http"
5
6 "github.com/go-chi/chi/v5"
7 "tangled.org/core/appview/middleware"
8 "tangled.org/core/appview/pipelines"
9)
10
11func (rp *Repo) Router(mw *middleware.Middleware) http.Handler {
12 r := chi.NewRouter()
13 r.Get("/", rp.Index)
14 r.Get("/commit-statuses", pipelines.StatusesHandler(rp.oauth, rp.repoResolver, rp.pages, rp.logger))
15 r.Get("/opengraph", rp.Opengraph)
16 r.Get("/feed.atom", rp.AtomFeed)
17 r.Get("/commits/{ref}", rp.Log)
18 r.Route("/tree/{ref}", func(r chi.Router) {
19 r.Get("/", rp.Index)
20 r.Get("/*", rp.Tree)
21 })
22 r.Get("/commit/{ref}.diff", rp.CommitRawDiff)
23 r.Get("/commit/{ref}.patch", rp.CommitRawPatch)
24 r.Get("/commit/{ref}", rp.Commit)
25 r.Get("/branches", rp.Branches)
26 r.Delete("/branches", rp.DeleteBranch)
27 r.Route("/tags", func(r chi.Router) {
28 r.Get("/", rp.Tags)
29 r.Route("/{tag}", func(r chi.Router) {
30 r.Get("/", rp.Tag)
31 r.Get("/download/{file}", rp.DownloadArtifact)
32
33 // require repo:push to upload or delete artifacts
34 //
35 // additionally: only the uploader can truly delete an artifact
36 // (record+blob will live on their pds)
37 r.Group(func(r chi.Router) {
38 r.Use(middleware.AuthMiddleware(rp.oauth))
39 r.Use(mw.RepoPermissionMiddleware("repo:push"))
40 r.Post("/upload", rp.AttachArtifact)
41 r.Delete("/{file}", rp.DeleteArtifact)
42 })
43 })
44 })
45 r.Get("/blob/{ref}/*", rp.Blob)
46 r.Get("/raw/{ref}/*", rp.RepoBlobRaw)
47
48 r.Get(archiveRoute, rp.DownloadArchive)
49
50 r.With(middleware.Paginate).Get("/stars", rp.Stars)
51 r.With(middleware.Paginate).Get("/forks", rp.Forks)
52
53 r.Route("/fork", func(r chi.Router) {
54 r.Use(middleware.AuthMiddleware(rp.oauth))
55 r.Get("/", rp.ForkRepo)
56 r.Post("/", rp.ForkRepo)
57 r.With(mw.RepoPermissionMiddleware("repo:owner")).Route("/sync", func(r chi.Router) {
58 r.Post("/", rp.SyncRepoFork)
59 })
60 })
61
62 r.Route("/compare", func(r chi.Router) {
63 r.Get("/", rp.CompareNew) // start an new comparison
64
65 // we have to wildcard here since we want to support GitHub's compare syntax
66 // /compare/{ref1}...{ref2}
67 // for example:
68 // /compare/master...some/feature
69 // /compare/master...example.com:another/feature <- this is a fork
70 r.Get("/*", rp.Compare)
71 })
72
73 // label panel in issues/pulls/discussions/tasks
74 r.Route("/label", func(r chi.Router) {
75 r.Get("/", rp.LabelPanel)
76 r.Get("/edit", rp.EditLabelPanel)
77 })
78
79 r.Get("/search", rp.Search)
80
81 // settings routes, needs auth
82 r.Group(func(r chi.Router) {
83 r.Use(middleware.AuthMiddleware(rp.oauth))
84 r.With(mw.RepoPermissionMiddleware("repo:settings")).Route("/settings", func(r chi.Router) {
85 r.Get("/", rp.Settings)
86 r.With(mw.RepoPermissionMiddleware("repo:owner")).Put("/base", rp.EditBaseSettings)
87 r.With(mw.RepoPermissionMiddleware("repo:owner")).Post("/spindle", rp.EditSpindle)
88 r.With(mw.RepoPermissionMiddleware("repo:owner")).Put("/label", rp.AddLabelDef)
89 r.With(mw.RepoPermissionMiddleware("repo:owner")).Delete("/label", rp.DeleteLabelDef)
90 r.With(mw.RepoPermissionMiddleware("repo:owner")).Post("/label/subscribe", rp.SubscribeLabel)
91 r.With(mw.RepoPermissionMiddleware("repo:owner")).Post("/label/unsubscribe", rp.UnsubscribeLabel)
92 r.With(mw.RepoPermissionMiddleware("repo:invite")).Put("/collaborator", rp.AddCollaborator)
93 r.With(mw.RepoPermissionMiddleware("repo:invite")).Delete("/collaborator", rp.RemoveCollaborator)
94 r.With(mw.RepoPermissionMiddleware("repo:delete")).Delete("/delete", rp.DeleteRepo)
95 r.With(mw.RepoPermissionMiddleware("repo:owner")).Post("/rename", rp.RenameRepo)
96 r.Put("/branches/default", rp.SetDefaultBranch)
97 r.Put("/secrets", rp.Secrets)
98 r.Delete("/secrets", rp.Secrets)
99 r.With(mw.RepoPermissionMiddleware("repo:owner")).Route("/sites", func(r chi.Router) {
100 r.Put("/", rp.SaveRepoSiteConfig)
101 r.Delete("/", rp.DeleteRepoSiteConfig)
102 })
103 r.With(mw.RepoPermissionMiddleware("repo:owner")).Route("/hooks", func(r chi.Router) {
104 r.Get("/", rp.Webhooks)
105 r.Post("/", rp.AddWebhook)
106 r.Put("/{id}", rp.UpdateWebhook)
107 r.Delete("/{id}", rp.DeleteWebhook)
108 r.Post("/{id}/toggle", rp.ToggleWebhook)
109 r.Get("/{id}/deliveries", rp.WebhookDeliveries)
110 })
111 })
112 })
113
114 return r
115}