package server import ( "fmt" "log/slog" "net/http" "os" "git.elisiei.xyz/elisiei/dbots/internal/config" "git.elisiei.xyz/elisiei/dbots/internal/db" "git.elisiei.xyz/elisiei/dbots/internal/discord" customMiddlewares "git.elisiei.xyz/elisiei/dbots/internal/middleware" "git.elisiei.xyz/elisiei/dbots/services/admin" "git.elisiei.xyz/elisiei/dbots/services/auth" "git.elisiei.xyz/elisiei/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, config.Auth.PasetoKey)) return &Server{ router: router, queries: queries, config: config, } } func (s *Server) Register() { discordClient := discord.NewClient( s.config.Discord.ClientID, s.config.Discord.ClientSecret, s.config.Discord.RedirectURI, ) authRouter := auth.NewRouter(s.queries, discordClient, s.config) botRouter := bot.NewRouter(s.queries, discordClient) adminRouter := admin.NewRouter(s.queries) s.router.Mount("/auth", authRouter.Routes()) s.router.Mount("/bots", botRouter.Routes()) s.router.Mount("/admin", adminRouter.Routes()) } func (s *Server) Start(addr string, port int) { s.Register() slog.Info("server started", "addr", addr, "port", port) if err := http.ListenAndServe(fmt.Sprintf("%s:%d", addr, port), s.router); err != nil { slog.Error("error starting server", "port", port, "err", err) os.Exit(1) } }