homepage/server/main.go
2026-01-13 21:31:43 +01:00

73 lines
1.7 KiB
Go

package main
import (
"context"
"homepage/antispam"
"log/slog"
"net"
"net/http"
"os"
"path"
"github.com/AlessandroSechi/zammad-go"
)
type rootPathKey struct{}
type zammadKey struct{}
func getRootPath(r *http.Request) string {
if rootPath, ok := r.Context().Value(rootPathKey{}).(string); ok {
return rootPath
}
panic("missing root path in request context")
}
func main() {
slog.SetDefault(slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{
Level: slog.LevelDebug,
})))
rootPath := path.Clean("../dist")
slog.Info("Found root path for static assets", "path", rootPath)
var zammadClient *zammad.Client
if zammadUrl := os.Getenv("ZAMMAD_URL"); zammadUrl != "" {
zammadClient = zammad.New(zammadUrl)
token := os.Getenv("ZAMMAD_TOKEN")
if token == "" {
slog.Error("No Zammad token available, set ZAMMAD_TOKEN accordingly")
os.Exit(1)
}
slog.Info("Using Zammad integration", "url", zammadUrl)
zammadClient.Token = token
} else {
slog.Warn("Zammad integration disabled, set ZAMMAD_URL to enable")
}
mux := http.NewServeMux()
setupSite(mux)
mux.Handle("/", http.FileServer(http.Dir(rootPath)))
var handler http.Handler
handler = ProtectCsrf(mux, []byte("fasdf"))
handler = antispam.WithAntispam(handler)
server := http.Server{
Addr: "localhost:8080",
Handler: handler,
BaseContext: func(_ net.Listener) context.Context {
ctx := context.Background()
ctx = context.WithValue(ctx, rootPathKey{}, rootPath)
if zammadClient != nil {
ctx = context.WithValue(ctx, zammadKey{}, zammadClient)
}
return ctx
},
}
slog.Info("Starting HTTP server", "addr", server.Addr)
if err := server.ListenAndServe(); err != nil {
slog.Error("Failed to start HTTP server", "error", err)
}
}