package rest import ( "context" "fmt" "net/http" "predictor-refactored/internal/transport/middleware" "predictor-refactored/internal/transport/rest/handler" api "predictor-refactored/pkg/rest" "go.uber.org/zap" ) // Transport wraps the ogen HTTP server. type Transport struct { srv *api.Server handler *handler.Handler port int log *zap.Logger } // New creates a new REST transport. func New(h *handler.Handler, port int, log *zap.Logger) (*Transport, error) { srv, err := api.NewServer( h, api.WithMiddleware(middleware.Logging(log)), ) if err != nil { return nil, fmt.Errorf("create ogen server: %w", err) } return &Transport{ srv: srv, handler: h, port: port, log: log, }, nil } // Run starts the HTTP server. Blocks until the server stops. func (t *Transport) Run() error { mux := http.NewServeMux() mux.Handle("/", t.srv) httpSrv := &http.Server{ Addr: fmt.Sprintf(":%d", t.port), Handler: corsMiddleware(mux), } t.log.Info("starting HTTP server", zap.Int("port", t.port)) return httpSrv.ListenAndServe() } // Shutdown gracefully stops the HTTP server. func (t *Transport) Shutdown(ctx context.Context) error { // The ogen server doesn't have a shutdown method; // shutdown is handled by the http.Server in main.go return nil } func corsMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Access-Control-Allow-Origin", "*") w.Header().Set("Access-Control-Allow-Methods", "GET, OPTIONS") w.Header().Set("Access-Control-Allow-Headers", "Content-Type") if r.Method == http.MethodOptions { w.WriteHeader(http.StatusNoContent) return } next.ServeHTTP(w, r) }) }