package service
import (
"net/http"
"github.com/go-chi/chi"
chimiddleware "github.com/go-chi/chi/middleware"
"go.uber.org/zap"
"git.ssns.se/git/frozendragon/minecraft-ui/internal/config"
"git.ssns.se/git/frozendragon/minecraft-ui/internal/rest"
"git.ssns.se/git/frozendragon/minecraft-ui/internal/server"
"context"
"git.ssns.se/git/frozendragon/minecraft-ui/internal/resource/minecraft-log"
"strings"
"git.ssns.se/git/frozendragon/minecraft-ui/internal/resource/minecraft-status"
)
// Service defines the service instance.
type Service struct {
logger *zap.Logger
server *server.Server
}
// New instantiates a new service instance.
func New(conf *config.Config) (*Service, error) {
logResource := minecraft_log.Resource{
Logger: conf.Logger,
}
statusResource := minecraft_status.Resource{
Logger: conf.Logger,
}
// Routes
r := chi.NewRouter()
//r.Get("/robots.txt", router.ServeRobots)
// Simple Authenticated routes
r.Group(func(r chi.Router) {
r.Handle("/logger", conf.LoggerConfig.Level)
})
FileServer(r, "/ui", http.Dir("etc/static"))
// API routes
r.Route("/", func(r chi.Router) {
//r.Use(middleware.SimpleBasicAuth(conf.BasicAuthUser, conf.BasicAuthPass))
r.Use(chimiddleware.StripSlashes)
r.Get("/minecraft-log", logResource.Get)
r.Get("/minecraft-status", statusResource.Get)
r.Post("/minecraft-status", statusResource.Post)
})
h := chi.ServerBaseContext(context.Background(), r)
s := server.New(conf.Addr, h, server.WithErrorLog(conf.StdLogger))
return &Service{
logger: conf.Logger,
server: s,
}, nil
}
// Start starts the service.
func (s *Service) Start() error {
return s.server.Start()
}
// Stop stops the service.
func (s *Service) Stop() error {
return s.server.Stop()
}
// rootHandler is the root handler for request to `/`.
func rootHandler(w http.ResponseWriter, req *http.Request) {
rest.JSON(w, req, struct{}{})
}
func FileServer(r chi.Router, path string, root http.FileSystem) {
if strings.ContainsAny(path, "{}*") {
panic("router: FileServer does not permit URL parameters.")
}
fs := http.StripPrefix(path, http.FileServer(root))
if path != "/" && !strings.HasSuffix(path, "/") {
r.Get(path, http.RedirectHandler(path+"/", 301).ServeHTTP)
path += "/"
}
path += "*"
r.Get(path, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fs.ServeHTTP(w, r)
}))
}