package application import ( "context" "net/http" "github.com/go-chi/chi/v5" "github.com/go-chi/cors" httpSwagger "github.com/swaggo/http-swagger" ) type SwaggerConf struct { Enabled bool Addr string URI string Prefix string SSL bool TLSKeyPath string TLSCertPath string } func NewSwagger(conf *SwaggerConf) *Swagger { swagger := &Swagger{ conf: conf, } return swagger } type Swagger struct { conf *SwaggerConf ctx context.Context cancel context.CancelFunc server *http.Server } func (s *Swagger) Start(ctx context.Context) { r := chi.NewRouter() cors := cors.New(cors.Options{ AllowedOrigins: []string{"*"}, // Разрешить все домены, для продакшена лучше указать конкретные домены AllowedMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"}, AllowedHeaders: []string{"Accept", "Authorization", "Content-Type", "X-CSRF-Token"}, ExposedHeaders: []string{"Link"}, AllowCredentials: false, MaxAge: 300, // Максимальный срок предварительного кэширования (в секундах) }) r.Use(cors.Handler) // Настройка сервера для обслуживания содержимого директории docs fileServer := http.FileServer(http.Dir("./docs")) r.Handle("/docs/*", http.StripPrefix("/docs", fileServer)) r.Get(s.conf.Prefix, httpSwagger.Handler( httpSwagger.URL(s.conf.URI), //The url pointing to API definition )) s.server = &http.Server{ Addr: s.conf.Addr, Handler: r, } s.ctx, s.cancel = context.WithCancel(ctx) go func() { <-s.ctx.Done() s.Stop() }() if s.conf.SSL { s.server.ListenAndServeTLS(s.conf.TLSCertPath, s.conf.TLSKeyPath) } else { s.server.ListenAndServe() } //http.ListenAndServe(s.conf.Addr, r) } func (s *Swagger) Stop() { s.cancel() }