// 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() }) }