package httpserver import ( "errors" "fmt" "log/slog" "net/http" "bunker/server/internal/application" "bunker/server/internal/services/core" ) var ( _ = core.HTTPServer(&httpServer{}) errHTTPServer = errors.New("HTTP server core service") ) type httpServer struct { app *application.Application logger *slog.Logger db core.Database httpSrv *http.Server } // Initialize initializes service. func Initialize(app *application.Application) error { httpSrv := &httpServer{ app: app, } if err := app.RegisterService(httpSrv); err != nil { return fmt.Errorf("%w: %w", errHTTPServer, err) } return nil } func (h *httpServer) Configure() error { h.logger.Debug("Configuring service...") if err := h.configureHTTPServer(); err != nil { return fmt.Errorf("configure: %w", err) } return nil } func (h *httpServer) ConnectDependencies() error { databaseRaw := h.app.Service(core.ServiceNameDatabase) if databaseRaw == nil { return fmt.Errorf("connect dependencies: get database service: %w", application.ErrServiceNotFound) } database, valid := databaseRaw.(core.Database) if !valid { return fmt.Errorf("connect dependencies: type assert database service: %w", core.ErrDatabaseIsInvalid) } h.db = database return nil } func (h *httpServer) Initialize() error { h.logger = h.app.NewLogger("service", core.ServiceNameHTTPServer) h.logger.Info("Initializing...") return nil } func (h *httpServer) Name() string { return core.ServiceNameHTTPServer } func (h *httpServer) LaunchStartupTasks() error { h.logger.Debug("Launching startup tasks...") go h.startHTTPServer() return nil } func (h *httpServer) Shutdown() error { if err := h.stopHTTPServer(); err != nil { return fmt.Errorf("%w: Shutdown: %w", errHTTPServer, err) } return nil }