This repository has been archived by the owner on Dec 31, 2023. It is now read-only.
/
server.go
115 lines (92 loc) · 3.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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
package server
import (
"net"
"net/http"
"time"
"github.com/ccuetoh/libreapi/pkg/config"
"github.com/ccuetoh/libreapi/pkg/economy"
"github.com/ccuetoh/libreapi/pkg/env"
"github.com/ccuetoh/libreapi/pkg/rut"
"github.com/ccuetoh/libreapi/pkg/weather"
"github.com/chenyahui/gin-cache"
"github.com/chenyahui/gin-cache/persist"
"github.com/gin-gonic/gin"
contextNrLogrus "github.com/newrelic/go-agent/v3/integrations/logcontext-v2/nrlogrus"
"github.com/newrelic/go-agent/v3/integrations/nrlogrus"
"github.com/newrelic/go-agent/v3/newrelic"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
)
type Server struct {
engine *gin.Engine
env *env.Env
}
func NewServer(cfgOpts ...config.Option) (*Server, error) {
cfg := config.Build(cfgOpts...)
logger := logrus.New()
var newRelicApp *newrelic.Application
if cfg.NewRelic.Licence != "" {
var err error
newRelicApp, err = newNewRelic(cfg, logger)
if err != nil {
return nil, errors.Wrap(err, "unable to create NewRelic instance")
}
formatter := contextNrLogrus.NewFormatter(newRelicApp, &logrus.TextFormatter{})
logger.SetFormatter(formatter)
}
server := &Server{
engine: newEngine(cfg),
env: &env.Env{
Logger: logger,
Cfg: cfg,
NewRelic: newRelicApp,
},
}
setupMiddlewares(server)
addEndpoints(server)
return server, nil
}
func (s *Server) Start() error {
return s.engine.Run(net.JoinHostPort(s.env.Cfg.HTTP.Address, s.env.Cfg.HTTP.Port))
}
func newNewRelic(cfg *config.Config, logger *logrus.Logger) (*newrelic.Application, error) {
return newrelic.NewApplication(
newrelic.ConfigAppName(cfg.NewRelic.AppName),
newrelic.ConfigLicense(cfg.NewRelic.Licence),
newrelic.ConfigAppLogForwardingEnabled(cfg.NewRelic.LogForwardingEnabled),
func(config *newrelic.Config) {
logger.SetLevel(logrus.InfoLevel)
config.Logger = nrlogrus.Transform(logger)
},
)
}
func newEngine(cfg *config.Config) *gin.Engine {
if cfg.HTTP.DebugEnabled {
gin.SetMode(gin.DebugMode)
} else {
gin.SetMode(gin.ReleaseMode)
}
return gin.New()
}
func addEndpoints(server *Server) {
store := persist.NewMemoryStore(time.Minute)
server.engine.GET("/ping", func(c *gin.Context) {
c.String(http.StatusOK, "pong")
})
rutHandler := rut.NewHandler(server.env, rut.NewDefaultService())
rutGroup := server.engine.Group("/rut")
rutGroup.GET("/random", rutHandler.Generate())
rutGroup.Use(cache.CacheByRequestURI(store, time.Hour))
rutGroup.GET("/validate", rutHandler.Validate())
rutGroup.GET("/digit", rutHandler.VD())
rutGroup.GET("/activities", rutHandler.Activity())
economyHandler := economy.NewHandler(server.env, economy.NewDefaultService())
economyGroup := server.engine.Group("/economy")
economyGroup.Use(cache.CacheByRequestURI(store, time.Minute*5))
economyGroup.GET("/indicators", economyHandler.Indicators())
economyGroup.GET("/currencies", economyHandler.Currencies())
weatherHandler := weather.NewHandler(server.env, weather.NewDefaultService())
weatherGroup := server.engine.Group("/weather")
weatherGroup.Use(cache.CacheByRequestURI(store, time.Minute*5))
weatherGroup.GET("/stations", weatherHandler.Stations())
}