80 lines
2.2 KiB
Go

package infrastructure
import (
"git.markbailey.dev/cervers/ptpp/lib/database"
"net/http"
"sync"
"git.markbailey.dev/cervers/ptpp/handlers"
"git.markbailey.dev/cervers/ptpp/handlers/admin"
"git.markbailey.dev/cervers/ptpp/lib/logger"
mw "git.markbailey.dev/cervers/ptpp/lib/middleware"
"git.markbailey.dev/cervers/ptpp/lib/session"
)
var (
globalSessions *session.Manager
commonRouter *http.ServeMux
adminStack mw.Func
commonStack mw.Func
lock = &sync.Mutex{}
il logger.ILogger
)
func GetRouter() http.Handler {
commonStack = mw.Compose(
mw.WithLogger,
mw.WithUsername,
)
if commonRouter == nil {
lock.Lock()
defer lock.Unlock()
adminStack = mw.Compose(
mw.WithAuth,
)
commonRouter = http.NewServeMux()
adminRouter := http.NewServeMux()
// Serve static files
fs := http.FileServer(http.Dir("./public/"))
commonRouter.Handle("GET /public/", http.StripPrefix("/public", fs))
commonRouter.HandleFunc("/favicon.ico", func(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, "./public/assets/favicon/favicon.ico")
})
// Homepage routes
homepageHandler := handlers.NewHomePageHandler(il)
commonRouter.Handle("/", mw.ErrHandler(homepageHandler.Homepage))
if env == "production" {
return commonStack(commonRouter)
}
// User routes
userHandler := handlers.NewUserHandler(il, globalSessions, database.ChooseDB())
commonRouter.Handle("GET /signup", mw.ErrHandler(userHandler.SignUp))
commonRouter.Handle("POST /signup", mw.ErrHandler(userHandler.SignUp))
commonRouter.Handle("GET /signin", mw.ErrHandler(userHandler.SignIn))
commonRouter.Handle("POST /signin", mw.ErrHandler(userHandler.SignIn))
commonRouter.Handle("GET /signout", mw.ErrHandler(userHandler.SignOut))
commonRouter.Handle("GET /populate", mw.ErrHandler(userHandler.Populate))
// Admin routes
adminIndexHandler := admin.NewAdminIndexHandler(il, globalSessions)
adminRouter.Handle("GET /", mw.ErrHandler(adminIndexHandler.Index))
commonRouter.Handle("/admin/", http.StripPrefix("/admin", adminStack(adminRouter)))
}
return commonStack(commonRouter)
}
func init() {
globalSessions, _ = session.NewManager("memory", "ptpp", 3600)
go globalSessions.GC()
il = logger.NewCompositeLogger()
}