/
server.go
86 lines (71 loc) · 2.09 KB
/
server.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
package server
import (
"fmt"
"github.com/go-playground/validator/v10"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/recover"
"github.com/samber/do"
"github.com/telle-bots/bot-runner/pkg/bot"
"github.com/telle-bots/bot-runner/pkg/config"
"go.uber.org/zap"
)
type Server struct {
cfg *config.Config
log *zap.SugaredLogger
app *fiber.App
validate *validator.Validate
botRepository *bot.Repository
botTaskClient *bot.TaskClient
botTaskInspector *bot.TaskInspector
}
func NewServer(in *do.Injector) (*Server, error) {
cfg := do.MustInvoke[*config.Config](in)
log := do.MustInvoke[*zap.SugaredLogger](in)
validate := do.MustInvoke[*validator.Validate](in)
botRepository, err := do.Invoke[*bot.Repository](in)
if err != nil {
return nil, fmt.Errorf("bot manager: %w", err)
}
botTaskClient, err := do.Invoke[*bot.TaskClient](in)
if err != nil {
return nil, fmt.Errorf("bot task clinet: %w", err)
}
botTaskInspector, err := do.Invoke[*bot.TaskInspector](in)
if err != nil {
return nil, fmt.Errorf("bot task inspector: %w", err)
}
srv := &Server{
cfg: cfg,
log: log,
app: fiber.New(fiber.Config{
AppName: "Bot Manager",
DisableStartupMessage: true,
}),
validate: validate,
botRepository: botRepository,
botTaskClient: botTaskClient,
botTaskInspector: botTaskInspector,
}
srv.init()
return srv, nil
}
func (s *Server) Start() error {
return s.app.Listen(s.cfg.ManagerListenAddress)
}
func (s *Server) Shutdown() error {
return s.app.ShutdownWithTimeout(s.cfg.ShutdownTimeout)
}
func (s *Server) init() {
s.app.Use(recover.New(recover.Config{
EnableStackTrace: true,
StackTraceHandler: func(ctx *fiber.Ctx, panicErr any) {
s.log.Errorw("Panic", "recover", panicErr, "path", ctx.Path(), "method", ctx.Method())
},
}))
s.app.Get("/health", s.healthCheck)
s.app.Post("/bots", s.newBot)
s.app.Get("/bots", s.bots)
s.app.Post("/bots/:botID<int>/enable", s.enableBot)
s.app.Post("/bots/:botID<int>/disable", s.disableBot)
s.app.Get("/logic/nodes", s.nodes)
}