goshort/internal/server/static/handler.go
2023-08-26 11:47:46 -03:00

57 lines
1.1 KiB
Go

package staticssterver
import (
"fmt"
"net/http"
"os"
"git.maronato.dev/maronato/goshort/frontend"
"git.maronato.dev/maronato/goshort/internal/config"
)
type StaticHandler struct {
assetServer http.Handler
}
func NewStaticHandler(_ *config.Config) *StaticHandler {
// Get the assets from the frontend
assets, _ := frontend.Assets()
// Create the root filesystem
root := http.FS(assets)
// Create the SPA filesystem
root = &spaFileSystem{root}
// Build the asset server
assetServer := http.StripPrefix("/", http.FileServer(root))
return &StaticHandler{
assetServer: assetServer,
}
}
func (h *StaticHandler) ServeFiles(w http.ResponseWriter, r *http.Request) {
// Serve the files
h.assetServer.ServeHTTP(w, r)
}
// spaFileSystem overrides the Open method to use index.html as the default file.
type spaFileSystem struct {
root http.FileSystem
}
func (fs *spaFileSystem) Open(name string) (http.File, error) {
file, err := fs.root.Open(name)
if os.IsNotExist(err) {
file, err = fs.root.Open("index.html")
}
if err != nil {
return nil, fmt.Errorf("could not open spa file: %w", err)
}
return file, nil
}