This commit is contained in:
+1
-1
@@ -1,2 +1,2 @@
|
||||
nucleus
|
||||
/nucleus
|
||||
cmd/nucleus/dist
|
||||
@@ -0,0 +1,69 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"embed"
|
||||
"io/fs"
|
||||
"log"
|
||||
"net/http"
|
||||
"os"
|
||||
|
||||
"nucleus/internal/api"
|
||||
"nucleus/internal/db"
|
||||
"nucleus/internal/scheduler"
|
||||
)
|
||||
|
||||
//go:embed dist/*
|
||||
var staticFiles embed.FS
|
||||
|
||||
type spaHandler struct {
|
||||
staticPath string
|
||||
indexPath string
|
||||
fs http.FileSystem
|
||||
}
|
||||
|
||||
func (h spaHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||
path := r.URL.Path
|
||||
|
||||
// Check if file exists
|
||||
f, err := h.fs.Open(path)
|
||||
if os.IsNotExist(err) {
|
||||
// fallback to index.html
|
||||
r.URL.Path = "/"
|
||||
} else if err != nil {
|
||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||
return
|
||||
} else {
|
||||
// If file exists, check if it's a directory
|
||||
stat, err := f.Stat()
|
||||
if err == nil && stat.IsDir() {
|
||||
r.URL.Path = "/"
|
||||
}
|
||||
f.Close()
|
||||
}
|
||||
|
||||
http.FileServer(h.fs).ServeHTTP(w, r)
|
||||
}
|
||||
|
||||
func main() {
|
||||
db.InitDB("app.db")
|
||||
scheduler.InitScheduler()
|
||||
|
||||
mux := http.NewServeMux()
|
||||
|
||||
api.RegisterRoutes(mux)
|
||||
|
||||
// Setup embedded SPA
|
||||
distFS, err := fs.Sub(staticFiles, "dist")
|
||||
if err != nil {
|
||||
// If running locally without build, this might fail, fallback to a simple message
|
||||
log.Println("dist/ not found in embedded filesystem. Ensure frontend is built before compiling. Serving API only.")
|
||||
} else {
|
||||
spa := spaHandler{staticPath: "/", indexPath: "index.html", fs: http.FS(distFS)}
|
||||
mux.Handle("/", spa)
|
||||
}
|
||||
|
||||
log.Println("Starting server on :8080")
|
||||
if err := http.ListenAndServe(":8080", mux); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user