dbots/internal/server/server.go

58 lines
1.4 KiB
Go

package server
import (
"fmt"
"log/slog"
"net/http"
"os"
"codeberg.org/nextgo/dbots/internal/config"
"codeberg.org/nextgo/dbots/internal/db"
customMiddlewares "codeberg.org/nextgo/dbots/internal/middleware"
"codeberg.org/nextgo/dbots/services/admin"
"codeberg.org/nextgo/dbots/services/bot"
"github.com/go-chi/chi/v5"
"github.com/go-chi/chi/v5/middleware"
"github.com/go-chi/httplog/v3"
)
type Server struct {
router *chi.Mux
queries *db.Queries
config config.Config
}
func NewServer(queries *db.Queries, config config.Config) *Server {
router := chi.NewMux()
router.Use(httplog.RequestLogger(slog.Default(), &httplog.Options{}))
router.Use(middleware.Recoverer)
router.Use(middleware.RequestID)
router.Use(middleware.RealIP)
router.Use(customMiddlewares.AuthMiddleware(queries)) // todo: use this middleware only when necessary
// i am using this globally cus it uses mocked data lol
return &Server{
router: router,
queries: queries,
config: config,
}
}
func (s *Server) Register() {
botRouter := bot.NewRouter(s.queries, s.config)
adminRouter := admin.NewRouter(s.queries)
s.router.Mount("/bots", botRouter.Routes())
s.router.Mount("/admin", adminRouter.Routes())
}
func (s *Server) Start(port int) {
s.Register()
slog.Info("server started", "port", port)
if err := http.ListenAndServe(fmt.Sprintf(":%d", port), s.router); err != nil {
slog.Error("error starting server", "port", port, "err", err)
os.Exit(1)
}
}