feat(backend): serve static frontend files

This commit is contained in:
2025-03-11 18:50:10 +01:00
parent 9088916f92
commit bbf83ef811
4 changed files with 55 additions and 17 deletions

View File

@ -1,16 +1,12 @@
package api
import (
"fmt"
"log"
"log/slog"
"net/http"
"strconv"
"github.com/HexCardGames/HexDeck/db"
"github.com/HexCardGames/HexDeck/game"
"github.com/HexCardGames/HexDeck/types"
"github.com/HexCardGames/HexDeck/utils"
"github.com/gin-gonic/gin"
)
@ -37,10 +33,7 @@ type LeaveRoomRequest struct {
SessionToken string
}
func InitApi() {
server := gin.Default()
server.SetTrustedProxies(nil)
func RegisterApi(server *gin.Engine) {
server.GET("/api/stats", func(c *gin.Context) {
stats := game.CalculateStats()
c.JSON(http.StatusOK, StatsReply{
@ -142,12 +135,4 @@ func InitApi() {
// Handle WebSocket connections using Socket.io
wsHandler := initWS()
server.Any("/socket.io/", gin.WrapH(wsHandler))
listenHost := utils.Getenv("LISTEN_HOST", "0.0.0.0")
listenPort, err := strconv.Atoi(utils.Getenv("LISTEN_PORT", "3000"))
if err != nil {
log.Fatal("Value of variable PORT is not a valid integer!")
}
slog.Info(fmt.Sprintf("HexDeck server listening on http://%s:%d", listenHost, listenPort))
server.Run(fmt.Sprintf("%s:%d", listenHost, listenPort))
}

26
backend/api/static.go Normal file
View File

@ -0,0 +1,26 @@
package api
import (
"embed"
"net/http"
"strings"
"github.com/gin-gonic/gin"
)
func SPAMiddleware(fs embed.FS, prefix string, notFoundPath string) gin.HandlerFunc {
fileServer := http.FileServerFS(fs)
return func(c *gin.Context) {
if strings.HasPrefix(c.Request.URL.Path, "/api/") {
c.Next()
return
}
c.Request.URL.Path = prefix + c.Request.URL.Path
_, err := fs.Open(c.Request.URL.Path)
if err != nil {
c.Request.URL.Path = prefix + notFoundPath
}
fileServer.ServeHTTP(c.Writer, c.Request)
}
}

View File

@ -1,16 +1,24 @@
package main
import (
"embed"
"fmt"
"log"
"log/slog"
"os"
"strconv"
"time"
"github.com/HexCardGames/HexDeck/api"
"github.com/HexCardGames/HexDeck/db"
"github.com/HexCardGames/HexDeck/game"
"github.com/HexCardGames/HexDeck/utils"
"github.com/gin-gonic/gin"
)
//go:embed all:public/*
var public embed.FS
func main() {
logHandler := slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{
Level: slog.LevelDebug,
@ -39,5 +47,17 @@ func main() {
}
}()
api.InitApi()
server := gin.Default()
server.SetTrustedProxies(nil)
api.RegisterApi(server)
server.Use(api.SPAMiddleware(public, "public", "/"))
listenHost := utils.Getenv("LISTEN_HOST", "0.0.0.0")
listenPort, err := strconv.Atoi(utils.Getenv("LISTEN_PORT", "3000"))
if err != nil {
log.Fatal("Value of variable PORT is not a valid integer!")
}
slog.Info(fmt.Sprintf("HexDeck server listening on http://%s:%d", listenHost, listenPort))
server.Run(fmt.Sprintf("%s:%d", listenHost, listenPort))
}

7
backend/public/README.md Normal file
View File

@ -0,0 +1,7 @@
# Static Frontend Hosting
All files in this directory will be merged into the server binary and served as static assets by the HexDeck server.
When building with docker, the compiled frontend will be copied here automatically.
If you are building manually, you can copy the contents of the `dist/client/` folder here after building the frontend.