Files
filething/server.go
2024-09-30 01:11:42 -05:00

76 lines
1.5 KiB
Go

//go:build !dev && !ssr
// +build !dev,!ssr
package main
import (
"filething/ui"
"io/fs"
"net/http"
"path/filepath"
"strings"
"github.com/labstack/echo/v4"
)
type embeddedFS struct {
baseFS fs.FS
prefix string
}
func (fs *embeddedFS) Open(name string) (fs.File, error) {
// Prepend the prefix to the requested file name
publicPath := filepath.Join(fs.prefix, name)
return fs.baseFS.Open(publicPath)
}
var publicFS = &embeddedFS{
baseFS: ui.DistDirFS,
prefix: "public/",
}
func init() {
initUi = func(e *echo.Echo) {
e.GET("/*", echo.StaticDirectoryHandler(publicFS, false))
e.HTTPErrorHandler = customHTTPErrorHandler
}
}
// Custom Error handling since Nuxt relies on the 404 page for dynamic pages we still want api routes to use the default
// error handling built into echo
func customHTTPErrorHandler(err error, c echo.Context) {
if he, ok := err.(*echo.HTTPError); ok && he.Code == http.StatusNotFound {
path := c.Request().URL.Path
if !strings.HasPrefix(path, "/api") {
file, err := publicFS.Open("404.html")
if err != nil {
c.Logger().Error(err)
}
fileInfo, err := file.Stat()
if err != nil {
c.Logger().Error(err)
}
fileBuf := make([]byte, fileInfo.Size())
_, err = file.Read(fileBuf)
defer func() {
if err := file.Close(); err != nil {
panic(err)
}
}()
if err != nil {
c.Logger().Error(err)
panic(err)
}
c.HTML(http.StatusNotFound, string(fileBuf))
return
}
}
c.Echo().DefaultHTTPErrorHandler(err, c)
}