-
Notifications
You must be signed in to change notification settings - Fork 0
/
app.go
88 lines (70 loc) · 2.32 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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package app
import (
"log"
"github.com/gin-gonic/gin"
"github.com/nguyenaivuong/litebank/config"
"github.com/nguyenaivuong/litebank/internal/handlers"
"github.com/nguyenaivuong/litebank/internal/middleware"
"github.com/nguyenaivuong/litebank/internal/models"
"github.com/nguyenaivuong/litebank/internal/services"
"github.com/nguyenaivuong/litebank/internal/token"
"gorm.io/driver/postgres"
"gorm.io/gorm"
)
const (
AccountIDPath = "/accounts/:id"
)
func Start() {
config, err := config.LoadConfig(".")
if err != nil {
log.Panic("cannot load config")
}
log.Printf(config.Environment)
// Initialize database and Gorm
db := initializeDatabase(config)
// Initialize token maker
tokenMaker, err := token.NewJWTMaker(config.TokenSymmetricKey)
if err != nil {
log.Panic("cannot make token", err)
}
// Initialize services
loginService := services.NewLoginService(db)
signupService := services.NewSignupService(db)
accountService := services.NewAccountService(db)
sessionService := services.NewSessionService(db)
transferService := services.NewTransferService(db)
// Initialize handlers
loginHandler := handlers.NewLoginHandler(loginService)
signupHandler := handlers.NewSignupHandler(signupService)
accountHandler := handlers.NewAccountHandler(accountService)
tokenHandler := handlers.NewTokenHandler(tokenMaker, config, sessionService)
transferHandler := handlers.NewTransferHandlers(transferService)
// Initialize Gin router
r := gin.Default()
// login
r.POST("/login", loginHandler.LoginHandler)
r.POST("/signup", signupHandler.SignupHandler)
r.POST("/tokens/renew_access", tokenHandler.RenewAccessTokenHandler)
// account
authRoutes := r.Group("/").Use(middleware.AuthMiddleware)
authRoutes.GET(AccountIDPath, accountHandler.GetAccountByID)
authRoutes.PUT(AccountIDPath, accountHandler.UpdateAccount)
authRoutes.DELETE(AccountIDPath, accountHandler.DeleteAccount)
authRoutes.POST("/transfers", transferHandler.TransferHandler)
// Start server
log.Fatal(r.Run(":8080"))
}
func initializeDatabase(cfg config.Config) *gorm.DB {
db, err := gorm.Open(postgres.Open(cfg.DBSource), &gorm.Config{
SkipDefaultTransaction: true,
})
if err != nil {
panic("Failed to connect database")
}
// Migrate the schema
err = db.AutoMigrate(&models.User{}, &models.Account{})
if err != nil {
return nil
}
return db
}