-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
254 lines (222 loc) · 8.47 KB
/
main.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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
package main
import (
"api/auth"
"api/campaign"
"api/handler"
"api/helper"
"api/payment"
"api/transaction"
"api/user"
"log"
"net/http"
"strings"
"github.com/dgrijalva/jwt-go"
"github.com/gin-contrib/cors"
"github.com/gin-gonic/gin"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func main() {
// connect to mysql
dsn := "root:@tcp(127.0.0.1:3306)/crowdfunding?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
log.Fatal(err.Error())
}
// passing db ke NewRepository pada file repository
userRepository := user.NewRepository(db)
// buat instance dari campaign repository
campaignRepository := campaign.NewRepository(db)
// instansiasi transaction repository untuk bisa passing db
transactionRepository := transaction.NewRepository(db)
// panggil semua data campaign dari database (cek manual)
// campaigns, err := campaignRepository.FindAll()
// panggil data campaign by ID
// campaigns, err := campaignRepository.FindByUserID(1)
// fmt.Println("debug")
// fmt.Println(len(campaigns)) // menampilkan jumlah campaign
// // tampilkan nama setiap campaign
// for _, campaign := range campaigns {
// fmt.Println(campaign.Name)
// // cek campaign memiliki gambar atau tidak
// if len(campaign.CampaignImages) > 0 {
// fmt.Println("jumlah gambar yg di load:", len(campaign.CampaignImages))
// // akses campaign images
// fmt.Println(campaign.CampaignImages[0].FileName)
// }
// }
// akses terhadap user repository
userService := user.NewService(userRepository)
// menampilkan data campaign
campaignService := campaign.NewService(campaignRepository)
// campaigns, _ := campaignService.GetCampaigns(0)
// fmt.Println(len(campaigns))
// memanggil service auth
authService := auth.NewService()
// payment service
paymentService := payment.NewService()
// memanggil transaction service
transactionService := transaction.NewService(transactionRepository, campaignRepository, paymentService)
// handler
// membuat router. authService yang udah dibuat, kita passing ke dalam userHandler
userHandler := handler.NewUserHandler(userService, authService)
campaignHandler := handler.NewCampaignHandler(campaignService)
transactionHandler := handler.NewTransactionHandler(transactionService)
// tes transactionService (manual)
// user, _ := userService.GetUserByID(1)
// input := transaction.CreateTransactionInput{
// CampaignID: 6,
// Amount: 3000000,
// User: user,
// }
// transactionService.CreateTransaction(input)
// panggil service function CreateCampaign untuk tes (manual)
// input := campaign.CreateCampaignInput{}
// input.Name = "Penggalangan Dana Startup"
// input.ShortDescription = "short"
// input.Description = "long description"
// input.GoalAmount = 1000000000
// input.Perks = "hadiah satu, dua, dan tiga"
// // menggunakan user 1
// inputUser, _ := userService.GetUserByID(3)
// input.User = inputUser
// // panggil CreateCampaign
// _, err = campaignService.CreateCampaign(input)
// if err != nil {
// log.Fatal(err.Error())
// }
// tes validate token (manual)
// token, err := authService.ValidateToken("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxfQ.BZcBBLhOhjA9ojwmRNMLx7x0IR83QyTeiH48psbhKLI")
// if err != nil {
// fmt.Println("ERROR")
// }
// if token.Valid {
// fmt.Println("VALID")
// } else {
// fmt.Println("INVALID")
// }
// tes hasil kembalian dari function generate token (manual)
// fmt.Println(authService.GenerateToken(1001))
// save avatar (manual)
// userService.SaveAvatar(1, "images/1-profile.png")
// login user (tes service manual)
// input := user.LoginInput{
// Email: "[email protected]",
// Password: "1234a5678",
// }
// user, err := userService.Login(input)
// if err != nil {
// fmt.Println("Terjadi Kesalahan")
// fmt.Println(err.Error())
// }
// fmt.Println(user.Email)
// fmt.Println(user.Name)
// menampilkan user by email (manual)
// userByEmail, err := userRepository.FindByEmail("[email protected]")
// if err != nil {
// fmt.Println(err.Error())
// }
// if userByEmail.ID == 0 {
// fmt.Println("User Tidak Ditemukan")
// } else {
// fmt.Println(userByEmail.Name)
// }
router := gin.Default()
// CORS (allow cors)
router.Use(cors.Default())
// set router untuk mengambil gambar user melalui folder images
router.Static("/images", "./images")
api := router.Group("/api/v1")
// register handler untuk dapat diakses pada api "/users"
// daftarkan endpoint
api.POST("/users", userHandler.RegisterUser)
api.POST("/sessions", userHandler.Login)
api.POST("/email_checkers", userHandler.CheckEmailAvaliability)
// jika kita melakukan request ke avatars, kita perlu mengirimkan jwt token sebelum menuju ke userHandler
api.POST("/avatars", authMiddleware(authService, userService), userHandler.UploadAvatar)
// create new campaign
api.POST("/campaigns", authMiddleware(authService, userService), campaignHandler.CreateCampaign)
api.POST("/campaign-images", authMiddleware(authService, userService), campaignHandler.UploadImage)
api.POST("/transactions", authMiddleware(authService, userService), transactionHandler.CreateTransaction)
api.POST("/transactions/notification", transactionHandler.GetNotification)
api.GET("/campaigns", campaignHandler.GetCampaigns)
api.GET("/campaign/:id", campaignHandler.GetCampaign)
api.GET("/campaign/:id/transactions", authMiddleware(authService, userService), transactionHandler.GetCampaignTransactions)
api.GET("/transactions", authMiddleware(authService, userService), transactionHandler.GetUserTransactions)
api.GET("/users/fetch", authMiddleware(authService, userService), userHandler.FetchUser)
// update campaign
api.PUT("/campaigns/:id", authMiddleware(authService, userService), campaignHandler.UpdateCampaign)
router.Run()
// userInput := user.RegisterUserInput{}
// userInput.Name = "Tes simpan dari service"
// userInput.Email = "[email protected]"
// userInput.Occupation = "programmer"
// userInput.Password = "pass"
// userService.RegisterUser(userInput)
// user := user.User{
// Name: "Test simpan",
// }
// userRepository.Save(user)
}
/*
Step API:
-> input
-> handler - mapping input dari user ke struct input
-> service - mapping dari struct input ke struct User
-> repository - menyimpan struct User ke db
-> db
*/
func authMiddleware(authService auth.Service, userService user.Service) gin.HandlerFunc {
return func(c *gin.Context) {
// ambil nilai header Authorization: Bearer tokentokentoken
authHeader := c.GetHeader("Authorization")
// apakah di dalam string authHeader terdapat kata Bearer
if !strings.Contains(authHeader, "Bearer") {
response := helper.APIResponse("Unauthorized 1", http.StatusUnauthorized, "error", nil)
c.AbortWithStatusJSON(http.StatusUnauthorized, response) // hentikan status jika tidak ada bearer token
return
}
// dari header Authorization, kita ambil nilai tokennya saja
// bearer token
var tokenString string
// tokenString := ""
arrayToken := strings.Split(authHeader, " ")
if len(arrayToken) == 2 {
tokenString = arrayToken[1]
}
// validasi token
token, err := authService.ValidateToken(tokenString)
if err != nil {
response := helper.APIResponse("Unauthorized 2", http.StatusUnauthorized, "error", nil)
c.AbortWithStatusJSON(http.StatusUnauthorized, response) // hentikan status jika tidak ada bearer token
return
}
// ambil data yang ada di dalam token
claim, ok := token.Claims.(jwt.MapClaims)
if !ok || !token.Valid {
response := helper.APIResponse("Unauthorized 3", http.StatusUnauthorized, "error", nil)
c.AbortWithStatusJSON(http.StatusUnauthorized, response) // hentikan status jika tidak ada bearer token
return
}
// jika berhasil maka ambil userID
userID := int(claim["user_id"].(float64))
user, err := userService.GetUserByID(userID)
// jika user tidak ditemukan
if err != nil {
response := helper.APIResponse("Unauthorized 4", http.StatusUnauthorized, "error", nil)
c.AbortWithStatusJSON(http.StatusUnauthorized, response) // hentikan status jika tidak ada bearer token
return
}
// jika tidak ada error yang lain kita set context isinya user yang melakukan request
c.Set("currentUser", user) // context-nya sudah di set, dengan key yang namanya "currentUser"
}
}
/*
Authentication Middleware Steps:
-> ambil nilai header Authorization: Bearer tokentokentoken
-> dari header Authorization, kita ambil nilai tokennya saja
-> kita validasi token
-> kita ambil user_id
-> ambil user dari db berdasarkan user_id lewat service
-> kita set context isinya user
*/