swagger.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package application
  2. import (
  3. "context"
  4. "net/http"
  5. "github.com/go-chi/chi/v5"
  6. "github.com/go-chi/cors"
  7. httpSwagger "github.com/swaggo/http-swagger"
  8. )
  9. type SwaggerConf struct {
  10. Enabled bool
  11. Addr string
  12. URI string
  13. Prefix string
  14. SSL bool
  15. TLSKeyPath string
  16. TLSCertPath string
  17. }
  18. func NewSwagger(conf *SwaggerConf) *Swagger {
  19. swagger := &Swagger{
  20. conf: conf,
  21. }
  22. return swagger
  23. }
  24. type Swagger struct {
  25. conf *SwaggerConf
  26. ctx context.Context
  27. cancel context.CancelFunc
  28. server *http.Server
  29. }
  30. func (s *Swagger) Start(ctx context.Context) {
  31. r := chi.NewRouter()
  32. cors := cors.New(cors.Options{
  33. AllowedOrigins: []string{"*"}, // Разрешить все домены, для продакшена лучше указать конкретные домены
  34. AllowedMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"},
  35. AllowedHeaders: []string{"Accept", "Authorization", "Content-Type", "X-CSRF-Token"},
  36. ExposedHeaders: []string{"Link"},
  37. AllowCredentials: false,
  38. MaxAge: 300, // Максимальный срок предварительного кэширования (в секундах)
  39. })
  40. r.Use(cors.Handler)
  41. // Настройка сервера для обслуживания содержимого директории docs
  42. fileServer := http.FileServer(http.Dir("./docs"))
  43. r.Handle("/docs/*", http.StripPrefix("/docs", fileServer))
  44. r.Get(s.conf.Prefix, httpSwagger.Handler(
  45. httpSwagger.URL(s.conf.URI), //The url pointing to API definition
  46. ))
  47. s.server = &http.Server{
  48. Addr: s.conf.Addr,
  49. Handler: r,
  50. }
  51. s.ctx, s.cancel = context.WithCancel(ctx)
  52. go func() {
  53. <-s.ctx.Done()
  54. s.Stop()
  55. }()
  56. if s.conf.SSL {
  57. s.server.ListenAndServeTLS(s.conf.TLSCertPath, s.conf.TLSKeyPath)
  58. } else {
  59. s.server.ListenAndServe()
  60. }
  61. //http.ListenAndServe(s.conf.Addr, r)
  62. }
  63. func (s *Swagger) Stop() {
  64. s.cancel()
  65. }