Skip to content

Commit a5a33a7

Browse files
committed
♻️ Refactor: Infrastructure package is reorganized
1 parent ec557cb commit a5a33a7

File tree

4 files changed

+77
-35
lines changed

4 files changed

+77
-35
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package middlewares
2+
3+
import (
4+
"encoding/base64"
5+
"net/http"
6+
7+
"github.com/gin-gonic/gin"
8+
"github.com/oswaldom-code/api-template-gin/pkg/config"
9+
)
10+
11+
var BasicAuthorizationMiddleware MiddlewareFunc = func(c *gin.Context) {
12+
// get token from header
13+
token := c.GetHeader("Authorization")
14+
// validate token
15+
if token != "Basic "+base64.StdEncoding.EncodeToString([]byte(config.GetAuthenticationKey().Secret)) {
16+
// response unauthorized status code
17+
c.Redirect(http.StatusFound, "/authorization")
18+
}
19+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package middlewares
2+
3+
import "github.com/gin-gonic/gin"
4+
5+
type MiddlewareFunc func(c *gin.Context)

src/adapters/http/rest/infrastructure/routes/routes.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
1-
package infrastructure
1+
package routes
22

3-
import "github.com/gin-gonic/gin"
3+
import (
4+
"github.com/gin-gonic/gin"
5+
"github.com/oswaldom-code/api-template-gin/src/adapters/http/rest/infrastructure/middlewares"
6+
)
47

58
// ServerInterface represents all server handlers.
69
type ServerInterface interface {
@@ -10,11 +13,9 @@ type ServerInterface interface {
1013
// ServerInterfaceWrapper converts contexts to parameters.
1114
type ServerInterfaceWrapper struct {
1215
Handler ServerInterface
13-
HandlerMiddlewares []MiddlewareFunc
16+
HandlerMiddlewares []middlewares.MiddlewareFunc
1417
}
1518

16-
type MiddlewareFunc func(c *gin.Context)
17-
1819
// Health operation middleware
1920
func (siw *ServerInterfaceWrapper) Health(c *gin.Context) {
2021
siw.Handler.Health(c)
@@ -23,7 +24,7 @@ func (siw *ServerInterfaceWrapper) Health(c *gin.Context) {
2324
// GinServerOptions provides options for the Gin server.
2425
type GinServerOptions struct {
2526
BaseURL string
26-
Middlewares []MiddlewareFunc
27+
Middlewares []middlewares.MiddlewareFunc
2728
}
2829

2930
// RegisterHandlers creates http.Handler with routing matching OpenAPI spec.

src/adapters/http/rest/infrastructure/server.go

Lines changed: 46 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,73 +1,90 @@
11
package infrastructure
22

33
import (
4-
"encoding/base64"
54
"io"
6-
"net/http"
75
"os"
86

97
"github.com/gin-gonic/gin"
108
metrics "github.com/penglongli/gin-metrics/ginmetrics"
119

1210
"github.com/oswaldom-code/api-template-gin/pkg/config"
11+
"github.com/oswaldom-code/api-template-gin/pkg/log"
1312
"github.com/oswaldom-code/api-template-gin/src/adapters/http/rest/handlers"
13+
"github.com/oswaldom-code/api-template-gin/src/adapters/http/rest/infrastructure/middlewares"
14+
"github.com/oswaldom-code/api-template-gin/src/adapters/http/rest/infrastructure/routes"
1415
)
1516

16-
var basicAuthorizationMiddleware MiddlewareFunc = func(c *gin.Context) {
17-
// get token from header
18-
token := c.GetHeader("Authorization")
19-
// validate token
20-
if token != "Basic "+base64.StdEncoding.EncodeToString([]byte(config.GetAuthenticationKey().Secret)) {
21-
// response unauthorized status code
22-
c.Redirect(http.StatusFound, "/authorization")
23-
}
24-
}
25-
2617
func setMetrics(router *gin.Engine) {
27-
// get global Monitor object
2818
monitor := metrics.GetMonitor()
29-
// +optional set metric path, default /debug/metrics
19+
if monitor == nil {
20+
log.Error("[ERROR] No se pudo obtener el monitor de métricas")
21+
return
22+
}
23+
3024
monitor.SetMetricPath("/metrics")
31-
// +optional set slow time, default 5s
32-
monitor.SetSlowTime(10)
33-
// +optional set request duration, default {0.1, 0.3, 1.2, 5, 10}
34-
// used to p95, p99
35-
monitor.SetDuration([]float64{0.1, 0.3, 1.2, 5, 10})
25+
slowTime := int32(5)
26+
monitor.SetSlowTime(slowTime) // default is 5 seconds TODO: make it configurable
27+
durationThresholds := []float64{0.5, 1, 3, 5, 10}
28+
monitor.SetDuration(durationThresholds)
29+
3630
monitor.Use(router)
31+
32+
log.Info("Métricas configuradas correctamente", log.Fields{
33+
"metric_path": "/metrics",
34+
"slow_time": slowTime,
35+
"duration_percentiles": durationThresholds,
36+
})
3737
}
3838

3939
// NewGinServer creates a new Gin server.
40-
func NewGinServer(handler ServerInterface) *gin.Engine {
40+
func NewGinServer(handler routes.ServerInterface) *gin.Engine {
4141
// get configuration
4242
serverConfig := config.GetServerConfig()
4343
// validate parameters configuration
4444
if ok := serverConfig.Validate(); ok != nil {
4545
panic("[ERROR] server configuration is not valid")
4646
}
4747

48-
// set gin mode (debug or release)
48+
log.Info("Running in mode: ", log.Fields{"mode": serverConfig.Mode})
4949
gin.SetMode(serverConfig.Mode)
50+
5051
// if debug mode is release write the logs to a file
5152
if serverConfig.Mode == "release" {
5253
// Disable Console Color, you don't need console color when writing the logs to file.
5354
gin.DisableConsoleColor()
54-
// Logging to a file. // TODO: add current date to log file name
55+
56+
if err := os.MkdirAll("log", os.ModePerm); err != nil {
57+
log.Error("[ERROR] failed to create log directory", log.Fields{"error": err})
58+
return nil
59+
}
60+
5561
f, ok := os.Create("log/error.log")
5662
if ok != nil {
57-
panic("[ERROR] error creating log file")
63+
log.Error("[ERROR] error creating log file", log.Fields{"error": ok})
64+
return nil
5865
}
59-
gin.DefaultWriter = io.MultiWriter(f)
66+
defer f.Close()
67+
68+
// Usa un writer para los logs de Gin y tu paquete de logs
69+
multiWriter := io.MultiWriter(f, os.Stdout) // También puedes redirigir a stdout o a tu logger personalizado
70+
gin.DefaultWriter = multiWriter
6071
}
6172

6273
// create routes
6374
router := gin.Default()
64-
// set metrics
75+
if router == nil {
76+
log.Error("[ERROR] failed to create gin router")
77+
return nil
78+
}
79+
6580
setMetrics(router)
66-
// set middleware
67-
ginServerOptions := GinServerOptions{BaseURL: "/"}
68-
ginServerOptions.Middlewares = append(ginServerOptions.Middlewares, basicAuthorizationMiddleware)
81+
82+
ginServerOptions := routes.GinServerOptions{BaseURL: "/"}
83+
ginServerOptions.Middlewares = append(ginServerOptions.Middlewares, middlewares.BasicAuthorizationMiddleware)
84+
6985
// register Handler, router and middleware to gin
70-
RegisterHandlersWithOptions(router, handler, ginServerOptions)
86+
routes.RegisterHandlersWithOptions(router, handler, ginServerOptions)
87+
7188
return router
7289
}
7390

0 commit comments

Comments
 (0)