/
rest.go
116 lines (103 loc) · 2.58 KB
/
rest.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
116
package rest
import (
// "github.com/gorilla/mux"
"fmt"
"net/http"
"time"
"github.com/labstack/echo/v4"
"github.com/labstack/echo/v4/middleware"
"github.com/rs/zerolog/log"
nsqcfg "github.com/sfgrp/lognsq/config"
"github.com/sfgrp/lognsq/ent/nsq"
"github.com/sfgrp/lognsq/io/nsqio"
)
// Run creates and runs a RESTful API service of gnmatcher.
// this API is described by OpenAPI schema at
// https://app.swaggerhub.com/apis/dimus/gnmatcher/1.0.0
func Run(m MatcherService) {
log.Info().Int("port", m.Port()).Msg("Starting HTTP API server")
e := echo.New()
e.Use(middleware.Gzip())
e.Use(middleware.CORS())
loggerNSQ := setLogger(e, m)
if loggerNSQ != nil {
defer loggerNSQ.Stop()
}
e.GET("/", root)
e.GET("/api/v1/ping", ping(m))
e.GET("/api/v1/version", ver(m))
e.POST("/api/v1/matches", matchPOST(m))
addr := fmt.Sprintf(":%d", m.Port())
s := &http.Server{
Addr: addr,
ReadTimeout: 5 * time.Minute,
WriteTimeout: 5 * time.Minute,
}
e.Logger.Fatal(e.StartServer(s))
}
func root(c echo.Context) error {
return c.String(http.StatusOK,
`The OpenAPI is described at
https://apidoc.globalnames.org/gnmatcher`)
}
func ping(m MatcherService) func(echo.Context) error {
return func(c echo.Context) error {
result := m.Ping()
return c.String(http.StatusOK, result)
}
}
func ver(m MatcherService) func(echo.Context) error {
return func(c echo.Context) error {
result := m.GetVersion()
return c.JSON(http.StatusOK, result)
}
}
func matchPOST(m MatcherService) func(echo.Context) error {
return func(c echo.Context) error {
var names []string
if err := c.Bind(&names); err != nil {
return err
}
result := m.MatchNames(names)
if l := len(names); l > 0 {
log.Info().
Int("namesNum", l).
Str("example", names[0]).
Str("method", "POST").
Msg("Name Match")
}
return c.JSON(http.StatusOK, result)
}
}
func setLogger(e *echo.Echo, m MatcherService) nsq.NSQ {
cfg := m.GetConfig()
nsqAddr := cfg.NsqdTCPAddress
withLogs := cfg.WithWebLogs
contains := cfg.NsqdContainsFilter
regex := cfg.NsqdRegexFilter
if nsqAddr != "" {
cfg := nsqcfg.Config{
StderrLogs: withLogs,
Topic: "gnmatcher",
Address: nsqAddr,
Contains: contains,
Regex: regex,
}
remote, err := nsqio.New(cfg)
logCfg := middleware.DefaultLoggerConfig
if err == nil {
logCfg.Output = remote
// set app logger too
log.Logger = log.Output(remote)
}
e.Use(middleware.LoggerWithConfig(logCfg))
if err != nil {
log.Warn().Err(err)
}
return remote
} else if withLogs {
e.Use(middleware.Logger())
return nil
}
return nil
}