123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- 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()
- }
|