gohome

Форк
0
/
server.go 
99 строк · 1.9 Кб
1
package server
2

3
import (
4
	"context"
5
	"errors"
6
	"log"
7
	"log/slog"
8
	"net/http"
9
	"time"
10

11
	"github.com/go-chi/chi/v5"
12
	"github.com/go-chi/chi/v5/middleware"
13
	"github.com/go-chi/cors"
14
	"github.com/go-chi/httplog/v2"
15
	"go.uber.org/fx"
16

17
	"gohome.4gophers.ru/getapp/gohome/app/handlers/home"
18
)
19

20
type Config struct {
21
	Addr string
22
}
23

24
type Server struct {
25
	server *http.Server
26

27
	home *home.Handler
28
}
29

30
func New(lc fx.Lifecycle, cfg Config, home *home.Handler) *Server {
31
	s := Server{
32
		home: home,
33
		server: &http.Server{
34
			Addr: cfg.Addr,
35
		},
36
	}
37

38
	lc.Append(fx.Hook{
39
		OnStart: func(ctx context.Context) error {
40
			s.server.Handler = s.routing()
41
			s.Start()
42
			return nil
43
		},
44
		OnStop: func(ctx context.Context) error {
45
			s.Stop(ctx)
46
			return nil
47
		},
48
	})
49

50
	return &Server{}
51
}
52

53
func (s *Server) Start() {
54
	go func() {
55
		log.Printf("start server on %s\n", s.server.Addr)
56
		err := s.server.ListenAndServe()
57
		if err != nil && !errors.Is(err, http.ErrServerClosed) {
58
			log.Fatal(err)
59
		}
60
	}()
61
}
62

63
func (s *Server) Stop(ctx context.Context) {
64
	s.server.Shutdown(ctx)
65
}
66

67
func (s *Server) routing() http.Handler {
68
	logger := httplog.NewLogger("gohome", httplog.Options{
69
		JSON:             true,
70
		LogLevel:         slog.LevelDebug,
71
		Concise:          true,
72
		RequestHeaders:   true,
73
		MessageFieldName: "message",
74
		// TimeFieldFormat: time.RFC850,
75
		QuietDownRoutes: []string{
76
			"/",
77
			"/ping",
78
		},
79
		QuietDownPeriod: 10 * time.Second,
80
		// SourceFieldName: "source",
81
	})
82

83
	r := chi.NewRouter()
84

85
	r.Use(middleware.RequestID)
86
	r.Use(httplog.RequestLogger(logger))
87
	r.Use(cors.New(cors.Options{
88
		AllowedOrigins:   []string{"*"},
89
		AllowedMethods:   []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"},
90
		AllowedHeaders:   []string{"Accept", "Authorization", "Content-Type", "X-CSRF-Token"},
91
		ExposedHeaders:   []string{"Link"},
92
		AllowCredentials: true,
93
		MaxAge:           300,
94
	}).Handler, middleware.Recoverer, middleware.NoCache)
95

96
	r.Get("/*", s.home.Home)
97

98
	return r
99
}
100

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.