package server import ( "apjournal/config" "apjournal/internal/database/repos" "apjournal/internal/handlers" "context" "log/slog" "os" "os/signal" "syscall" ) // Server interface type Server interface { Listen() } type server struct { config config.Config actions *handlers.Handlers ctx context.Context close context.CancelFunc } func (srv *server) stopOnSignal(close context.CancelFunc) { // listen for termination signals sigc := make(chan os.Signal, 1) signal.Notify(sigc, os.Interrupt, syscall.SIGINT) signal.Notify(sigc, os.Interrupt, syscall.SIGTERM) sig := <-sigc log := slog.New(slog.NewJSONHandler(os.Stdout, nil)) log.Info("Shutting down services", "section", "server", "app_event", "terminate", "signal", sig.String()) close() os.Exit(0) } func NewServer(cfg config.Config, log *slog.Logger, repo repos.FullRepo) Server { ctx, close := context.WithCancel(context.Background()) actions := handlers.NewHandlers(cfg, log, repo) return &server{ config: cfg, actions: actions, ctx: ctx, close: close, } } // Listen for new events that affect the market and process them func (srv *server) Listen() { // start the http server go srv.ListenToRequests() srv.stopOnSignal(srv.close) }