85 lines
2.2 KiB
Go
85 lines
2.2 KiB
Go
// Copyright 2024 Patial Tech. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
"strings"
|
|
|
|
"gitserver.in/patialtech/mux"
|
|
"gitserver.in/patialtech/mux/middleware"
|
|
"gitserver.in/patialtech/rano/bin/server/handler"
|
|
"gitserver.in/patialtech/rano/config"
|
|
"gitserver.in/patialtech/rano/graph"
|
|
"gitserver.in/patialtech/rano/util/logger"
|
|
"gitserver.in/patialtech/rano/web"
|
|
)
|
|
|
|
func main() {
|
|
r := mux.NewRouter()
|
|
|
|
r.Use(handler.Request())
|
|
|
|
// CORS
|
|
r.Use(middleware.CORS(middleware.CORSOption{
|
|
AllowedHeaders: []string{"Content-Type"},
|
|
AllowedOrigins: []string{config.Read().WebURL},
|
|
MaxAge: 60,
|
|
}))
|
|
// Secure Headers
|
|
r.Use(middleware.Helmet(middleware.HelmetOption{
|
|
ContentSecurityPolicy: middleware.CSP{
|
|
ScriptSrc: []string{"self", "https://cdn.jsdelivr.net", "unsafe-inline"},
|
|
},
|
|
}))
|
|
|
|
// graphiql
|
|
r.GET("/graphiql", graph.GraphiQL("/query"))
|
|
// graph query
|
|
r.POST("/query", graph.Query)
|
|
|
|
// catch all
|
|
r.GET("/", func(w http.ResponseWriter, r *http.Request) {
|
|
var (
|
|
resourcePath string
|
|
path = r.URL.Path
|
|
)
|
|
|
|
if strings.HasPrefix(path, "/_app") {
|
|
resourcePath = "public/build" + path
|
|
} else if strings.HasSuffix(path, ".png") ||
|
|
strings.HasSuffix(path, ".ico") ||
|
|
strings.HasSuffix(path, ".svg") ||
|
|
strings.HasSuffix(path, "robot.txt") ||
|
|
strings.HasSuffix(path, "site.webmanifest") {
|
|
resourcePath = "public" + path
|
|
} else {
|
|
resourcePath = "public/build/fallback.html"
|
|
}
|
|
|
|
if b, err := web.Public.ReadFile(resourcePath); err != nil {
|
|
_, _ = w.Write([]byte("hello there"))
|
|
} else {
|
|
if strings.HasSuffix(path, ".js") {
|
|
w.Header().Set("Content-Type", "text/javascript")
|
|
} else if strings.HasSuffix(path, ".css") {
|
|
w.Header().Set("Content-Type", "text/css")
|
|
} else {
|
|
w.Header().Set("Content-Type", http.DetectContentType(b))
|
|
}
|
|
|
|
w.WriteHeader(http.StatusOK)
|
|
_, _ = w.Write(b)
|
|
}
|
|
})
|
|
|
|
r.Serve(func(srv *http.Server) error {
|
|
srv.Addr = fmt.Sprintf(":%d", config.Read().GraphPort)
|
|
logger.Info("graph server listening on %s", srv.Addr)
|
|
return srv.ListenAndServe()
|
|
})
|
|
}
|