1package handler
2
3import (
4 "fmt"
5 "net/http"
6
7 serverconfig "git.gabrielgio.me/cerrado/pkg/config"
8 "git.gabrielgio.me/cerrado/pkg/ext"
9 "git.gabrielgio.me/cerrado/pkg/handler/about"
10 "git.gabrielgio.me/cerrado/pkg/handler/auth"
11 "git.gabrielgio.me/cerrado/pkg/handler/git"
12 "git.gabrielgio.me/cerrado/pkg/handler/static"
13 "git.gabrielgio.me/cerrado/pkg/service"
14 "git.gabrielgio.me/cerrado/templates"
15)
16
17// Mount handler gets the requires service and repository to build the handlers
18// This functons wraps the whole handler package and wraps it into one part so
19// its sub package don't leak in other places.
20func MountHandler(
21 gitService *service.GitService,
22 authService *service.AuthService,
23 configRepo *serverconfig.ConfigurationRepository,
24) (http.Handler, error) {
25 var (
26 gitHandler = git.NewGitHandler(gitService, configRepo)
27 aboutHandler = about.NewAboutHandler(configRepo)
28 loginHandler = auth.NewLoginHandler(authService)
29 )
30
31 staticHandler, err := static.ServeStaticHandler()
32 if err != nil {
33 return nil, err
34 }
35
36 cssStaticHandler, err := static.ServeStaticCSSHandler(
37 configRepo.GetSyntaxHighlight(),
38 configRepo.GetSyntaxHighlightDark(),
39 )
40 if err != nil {
41 return nil, err
42 }
43
44 mux := ext.NewRouter()
45 mux.AddMiddleware(ext.Compress)
46 mux.AddMiddleware(ext.Log)
47 mux.AddMiddleware(ext.VerifyRespository(configRepo))
48
49 if configRepo.IsAuthEnabled() {
50 mux.AddMiddleware(ext.Authenticate(authService))
51 mux.HandleFunc("/login/{$}", loginHandler.Login)
52 mux.HandleFunc("/logout/{$}", loginHandler.Logout)
53 } else {
54 mux.AddMiddleware(ext.DisableAuthentication)
55 }
56
57 mux.HandleFunc("/static/{file}", staticHandler)
58 // add slug and session so css file can be cached forever.
59 // Slug follow commit id, which is update every new version
60 // Session is update every time server restarts, this allows the css to be
61 // cached forever but refresh if the admin updates the server configuration.
62 mux.HandleFunc(fmt.Sprintf("/static/theme.%s%s.css", templates.Session, templates.Slug), cssStaticHandler)
63 mux.HandleFunc("/{name}/about/{$}", gitHandler.About)
64 mux.HandleFunc("/{name}", gitHandler.Multiplex)
65 mux.HandleFunc("/{name}/{rest...}", gitHandler.Multiplex)
66 mux.HandleFunc("/{name}/refs/{$}", gitHandler.Refs)
67 mux.HandleFunc("/{name}/tree/{ref}/{rest...}", gitHandler.Tree)
68 mux.HandleFunc("/{name}/blob/{ref}/{rest...}", gitHandler.Blob)
69 mux.HandleFunc("/{name}/log/{ref}/", gitHandler.Log)
70 mux.HandleFunc("/{name}/commit/{ref}/", gitHandler.Commit)
71 mux.HandleFunc("/{name}/ref/{ref}/", gitHandler.Ref)
72 mux.HandleFunc("/{name}/archive/{file}", gitHandler.Archive)
73 mux.HandleFunc("/about", aboutHandler.About)
74 mux.HandleFunc("/", gitHandler.List)
75 return mux.Handler(), nil
76}