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 mux.HandleFunc(fmt.Sprintf("/static/theme%s.css", templates.Slug), cssStaticHandler) // add slug so css file can be cached forever.
59 mux.HandleFunc("/{name}/about/{$}", gitHandler.About)
60 mux.HandleFunc("/{name}", gitHandler.Multiplex)
61 mux.HandleFunc("/{name}/{rest...}", gitHandler.Multiplex)
62 mux.HandleFunc("/{name}/refs/{$}", gitHandler.Refs)
63 mux.HandleFunc("/{name}/tree/{ref}/{rest...}", gitHandler.Tree)
64 mux.HandleFunc("/{name}/blob/{ref}/{rest...}", gitHandler.Blob)
65 mux.HandleFunc("/{name}/log/{ref}/", gitHandler.Log)
66 mux.HandleFunc("/{name}/commit/{ref}/", gitHandler.Commit)
67 mux.HandleFunc("/{name}/ref/{ref}/", gitHandler.Ref)
68 mux.HandleFunc("/{name}/archive/{file}", gitHandler.Archive)
69 mux.HandleFunc("/about", aboutHandler.About)
70 mux.HandleFunc("/", gitHandler.List)
71 return mux.Handler(), nil
72}