-
Notifications
You must be signed in to change notification settings - Fork 0
/
server.go
99 lines (84 loc) · 2.31 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
package api
import (
"context"
"fmt"
"log"
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
"github.com/go-playground/validator/v10"
"github.com/hhow09/simple_bank/api/controllers"
"github.com/hhow09/simple_bank/api/middlewares"
"github.com/hhow09/simple_bank/api/routes"
db "github.com/hhow09/simple_bank/db/sqlc"
"github.com/hhow09/simple_bank/lib"
"github.com/hhow09/simple_bank/token"
"github.com/hhow09/simple_bank/util"
"go.uber.org/fx"
)
// @title Simple Bank API
// @version 1.0
// @description A simple bank service.
// @contact.name API Support
// @contact.url https://github.com/hhow09/simple_bank/issues
// @contact.email [email protected]
// @host localhost:8080
// @BasePath /
// @securityDefinitions.basic BasicAuth
// @securityDefinitions.apikey authorization
// @in header
// @name Authorization
type Server struct {
config util.Config
store db.Store
router *gin.Engine
tokenMaker token.Maker
}
func NewServer(config util.Config, store db.Store, tokenMaker token.Maker, requestHandler lib.RequestHandler) (*Server, error) {
server := &Server{store: store, tokenMaker: tokenMaker, config: config, router: requestHandler.Gin}
//binding custom validator
if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
//registor validator to gin
v.RegisterValidation("currency", validCurrency)
}
// server.setupRouter()
return server, nil
}
// func (server *Server) setupRouter() {
// authRoutes.POST("/transfers", server.CreateTransfer)
// }
func (server *Server) Start(address string) error {
return server.router.Run(address)
}
func registerHooks(lc fx.Lifecycle, server *Server) {
lc.Append(fx.Hook{
OnStart: func(ctx context.Context) error {
go func() error {
err := server.Start(server.config.ServerAddress)
if err != nil {
log.Fatal("error starting server: ", err)
}
return nil
}()
return nil
},
OnStop: func(ctx context.Context) error {
fmt.Println("Stopping server")
return nil
},
})
}
func setupRoutes(lc fx.Lifecycle, r routes.Routes) {
r.Setup()
}
func setupMiddleware(lc fx.Lifecycle, m middlewares.Middlewares) {
m.Setup()
}
var Module = fx.Options(
controllers.Module,
routes.Module,
middlewares.Module,
fx.Provide(NewServer),
fx.Invoke(setupRoutes),
fx.Invoke(setupMiddleware),
fx.Invoke(registerHooks),
)