2022-07-25 18:48:19 +02:00

102 lines
2.4 KiB
Go

package http
import (
"context"
"io"
"log"
"net/http"
"strings"
"github.com/julienschmidt/httprouter"
"github.com/alice-lg/alice-lg/ui"
)
// Web Client
// Handle assets and client app preprarations
// Prepare client HTML:
// Set paths and add version to assets.
func (s *Server) webPrepareClientHTML(
ctx context.Context,
html string,
) string {
status, _ := CollectAppStatus(ctx, nil, s.routesStore, s.neighborsStore)
// Replace paths and tags
rewriter := strings.NewReplacer(
// Paths
// "js/", "/static/js/",
// "css/", "/static/css/",
// Tags
"###APP_VERSION###", status.Version,
)
html = rewriter.Replace(html)
return html
}
// Register assets handler and index handler
// at /static and /
func (s *Server) webRegisterAssets(
ctx context.Context,
router *httprouter.Router,
) error {
log.Println("Preparing and installing assets")
// Prepare client html: Rewrite paths
indexHTMLData, err := ui.Assets.ReadFile("build/index.html")
if err != nil {
return err
}
indexHTML := string(indexHTMLData)
theme := NewTheme(s.cfg.UI.Theme)
err = theme.RegisterThemeAssets(router)
if err != nil {
log.Println("Warning:", err)
}
// Update paths
indexHTML = s.webPrepareClientHTML(ctx, indexHTML)
// Register static assets
router.Handler("GET", "/manifest.json", ui.AssetsHTTPHandler("/"))
router.Handler("GET", "/static/*path", ui.AssetsHTTPHandler("/static"))
router.Handler("GET", "/assets/*path", ui.AssetsHTTPHandler("/assets"))
// Rewrite paths
// Serve index html as root...
router.GET("/",
func(res http.ResponseWriter, _ *http.Request, _ httprouter.Params) {
// Include theme, we need to update the
// hashes on reload, so we can check if the theme has
// changed without restarting the app
themedHTML := theme.PrepareClientHTML(indexHTML)
io.WriteString(res, themedHTML)
})
// ...and all alice related paths aswell
alicePaths := []string{
"/routeservers/*path",
"/search/*path",
}
for _, path := range alicePaths {
// respond with app html
router.GET(path,
func(res http.ResponseWriter, _ *http.Request, _ httprouter.Params) {
// ditto here
themedHTML := theme.PrepareClientHTML(indexHTML)
io.WriteString(res, themedHTML)
})
}
// ...install a catch all for /alice for graceful backwards compatibility
router.GET("/alice/*path",
func(res http.ResponseWriter, req *http.Request, _ httprouter.Params) {
http.Redirect(res, req, "/", http.StatusMovedPermanently)
})
return nil
}