cerrado @ v0.4

 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}