-
Notifications
You must be signed in to change notification settings - Fork 2
/
app.go
73 lines (57 loc) · 2.09 KB
/
app.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
package app
import (
"github.com/lfourky/go-rest-service-template/pkg/repository/postgres"
"github.com/lfourky/go-rest-service-template/pkg/server"
"github.com/lfourky/go-rest-service-template/pkg/server/handler"
"github.com/lfourky/go-rest-service-template/pkg/service/http"
"github.com/lfourky/go-rest-service-template/pkg/service/log"
"github.com/lfourky/go-rest-service-template/pkg/service/mail"
"github.com/lfourky/go-rest-service-template/pkg/service/time"
"github.com/lfourky/go-rest-service-template/pkg/service/validation"
"github.com/lfourky/go-rest-service-template/pkg/usecase"
)
func Run(cfg Config) {
logger, err := log.New(cfg.Logger)
if err != nil {
panic(err)
}
// Setup repository.
db, err := postgres.New(cfg.PostgresConfig, logger)
// db, err := mysql.New(cfg.MySQLConfig, logger)
if err != nil {
logger.WithError(err).Fatal("unable to connect to the database")
}
// Setup services.
clock := &time.Clock{}
smtpSender := mail.NewSMTPSender(cfg.Mail)
validator, err := validation.NewValidator()
if err != nil {
logger.WithError(err).Fatal("unable to create validator")
}
httpClient := http.NewClient(logger, http.DefaultClientOptions...)
_ = httpClient
// Setup server.
restServer := server.New(cfg.Server, clock, logger)
// Setup validation.
restServer.SetValidation(validator, &validation.Binder{})
restServer.SetErrorHandler(server.ErrorHandler(logger))
// Setup usecases.
usecase := usecase.New(db, smtpSender, logger)
// Setup handlers.
userHandler := handler.NewUser(usecase)
itemHandler := handler.NewItem(usecase)
statusHandler := handler.NewStatus(cfg.Info.Version, cfg.Info.BuildDate, cfg.Info.ServiceName, cfg.Info.CommitHash)
// Setup routes.
routes := restServer.Routes()
routes.GET("/version", statusHandler.Version)
v1 := routes.Group("v1")
items := v1.Group("/item")
items.POST("", itemHandler.CreateItem)
items.GET("", itemHandler.FindAll)
users := v1.Group("/user")
users.GET("", userHandler.FindAll)
users.POST("", userHandler.RegisterUser)
if err := restServer.Run(); err != nil {
logger.WithError(err).Error("server shutdown")
}
}