-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.go
187 lines (157 loc) · 8.84 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
package main
import (
"go01-airbnb/cache"
"go01-airbnb/config"
amenityhttp "go01-airbnb/internal/amenity/delivery/http"
amenityrepository "go01-airbnb/internal/amenity/repository"
amenityusecase "go01-airbnb/internal/amenity/usecase"
bookinghttp "go01-airbnb/internal/booking/delivery/http"
bookingrepository "go01-airbnb/internal/booking/repository"
bookingusecase "go01-airbnb/internal/booking/usecase"
locationhttp "go01-airbnb/internal/location/delivery/http"
locationrepository "go01-airbnb/internal/location/repository"
locationusecase "go01-airbnb/internal/location/usecase"
"go01-airbnb/internal/middleware"
placehttp "go01-airbnb/internal/place/delivery/http"
placerepository "go01-airbnb/internal/place/repository"
placeusecase "go01-airbnb/internal/place/usecase"
placeamenitieshttp "go01-airbnb/internal/placeamenities/delivery/http"
placeamenitiesrepository "go01-airbnb/internal/placeamenities/repository"
placeamenitiesusecase "go01-airbnb/internal/placeamenities/usecase"
placelikehttp "go01-airbnb/internal/placelike/delivery/http"
placelikerepository "go01-airbnb/internal/placelike/repository"
placelikeusecase "go01-airbnb/internal/placelike/usecase"
reviewhttp "go01-airbnb/internal/review/delivery/http"
reviewrepository "go01-airbnb/internal/review/repository"
reviewusecase "go01-airbnb/internal/review/usecase"
uploadhttp "go01-airbnb/internal/upload/delivery/http"
userhttp "go01-airbnb/internal/user/delivery/http"
userrepository "go01-airbnb/internal/user/repository"
userusecase "go01-airbnb/internal/user/usecase"
"go01-airbnb/pkg/db/mysql"
dbredis "go01-airbnb/pkg/db/redis"
"go01-airbnb/pkg/logger"
"go01-airbnb/pkg/upload"
"go01-airbnb/pkg/utils"
"log"
"github.com/gin-contrib/cors"
"github.com/gin-gonic/gin"
)
func main() {
// dsn := "root:109339Lam@@tcp(127.0.0.1:3306)/airbnb?charset=utf8mb4&parseTime=True&loc=Local"
// db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
// if err != nil {
// log.Fatalln("Failed connect to MySQL")
// }
// log.Println("MySQL connected", db)
cfg, err := config.LoadConfig()
if err != nil {
log.Fatalln("Get config error", err)
return
}
// Declare DB
db, err := mysql.NewMySQL(cfg)
if err != nil {
log.Fatalln("Can not connect mysql: ", err)
}
db = db.Debug()
utils.RunDBMigration(cfg)
// Declare redis
redis, err := dbredis.NewRedisClient(cfg)
if err != nil {
log.Fatalln("Can not connect redis: ", err)
}
// Declare S3 AWS
s3Provider := upload.NewS3Provider(cfg)
// Declare logger
sugarLogger := logger.NewZapLogger()
// Declare hashids
hasher := utils.NewHashIds(cfg.App.Secret, 10)
//db.AutoMigrate(placemodel.Place{})
// declare dependencies
placeRepo := placerepository.NewPlaceRepository(db, sugarLogger)
placeUC := placeusecase.NewPlaceUseCase(placeRepo)
placeHdl := placehttp.NewPlaceHandler(placeUC, hasher)
userRepo := userrepository.NewUserRepository(db)
userCache := cache.NewAuthUserCache(userRepo, cache.NewRedisCache(redis))
userUC := userusecase.NewUserUseCase(cfg, userRepo)
userHdl := userhttp.NewUserHandler(userUC)
uploadHdl := uploadhttp.NewUploadHandler(s3Provider)
placeLikeRepo := placelikerepository.NewPlaceLikeRepository(db, sugarLogger)
placeLikeUC := placelikeusecase.NewUserLikePlaceUseCase(placeLikeRepo)
placeLikeHdl := placelikehttp.NewUserLikePlaceHandler(placeLikeUC, hasher)
amenityRepo := amenityrepository.NewAmenityRepository(db, sugarLogger)
amenityUC := amenityusecase.NewAmenityUseCase(amenityRepo)
amenityHdl := amenityhttp.NewAmenityHandler(amenityUC, hasher)
checkPlaceOwner := placerepository.NewPlaceRepository(db, sugarLogger)
placeAmenityRepo := placeamenitiesrepository.NewPlaceAmenitiesRepo(db, sugarLogger)
placeAmenityUC := placeamenitiesusecase.NewPlaceAmenitiesUseCase(placeAmenityRepo, checkPlaceOwner)
placeAmenityHdl := placeamenitieshttp.NewPlaceAmenitiesHandler(placeAmenityUC, hasher)
bookingRepo := bookingrepository.NewBookingRepository(db, sugarLogger)
bookingUC := bookingusecase.NewBookingUseCase(bookingRepo)
bookingHdl := bookinghttp.NewBookingHandler(bookingUC, hasher)
reviewRepo := reviewrepository.NewReviewRepository(db, sugarLogger)
reviewUC := reviewusecase.NewReviewUseCase(reviewRepo)
reviewHdl := reviewhttp.NewReviewHandler(reviewUC, hasher)
locationRepo := locationrepository.NewLocationRepository(db, sugarLogger)
locationUC := locationusecase.NewLocationUseCase(locationRepo)
locationHdl := locationhttp.NewLocationHandler(locationUC, hasher)
middlewares := middleware.NewMiddlewareManager(cfg, userCache)
router := gin.Default()
// fix error CORS
configCORS := cors.DefaultConfig()
configCORS.AllowOrigins = []string{"http://localhost:5173"}
configCORS.AllowMethods = []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"}
router.Use(cors.New(configCORS))
// Global middleware, nghĩa là tất cả các routers đều phải đi qua middleware này
router.Use(middlewares.Recover())
router.Static("/static", "./static")
v1 := router.Group("/api/v1")
v1.POST("upload", uploadHdl.Upload())
v1.POST("/places", middlewares.RequiredAuth(), middlewares.RequiredRoles("admin", "host"), placeHdl.CreatePlace())
v1.GET("/places", placeHdl.GetPlaces())
v1.GET("/places/:id", placeHdl.GetPlaceById())
v1.PUT("/places/:id", middlewares.RequiredAuth(), middlewares.RequiredRoles("admin", "host"), placeHdl.UpdatePlace())
v1.DELETE("places/:id", middlewares.RequiredAuth(), middlewares.RequiredRoles("admin", "host"), placeHdl.DeletePlace())
//User
v1.GET("/profiles", middlewares.RequiredAuth(), userHdl.Profiles())
v1.GET("/admin", middlewares.RequiredAuth(), middlewares.RequiredRoles("admin", "host"), userHdl.Profiles())
v1.POST("/register", userHdl.Register())
v1.POST("/login", userHdl.Login())
v1.PUT("/user", middlewares.RequiredAuth(), userHdl.UpdateProfile())
// Place Like
v1.POST("/like/:id", middlewares.RequiredAuth(), placeLikeHdl.UserLikePlace())
v1.DELETE("/unlike/:id", middlewares.RequiredAuth(), placeLikeHdl.UserUnLikePlace())
v1.GET("/like", middlewares.RequiredAuth(), placeLikeHdl.GetPlacesLikedByUser())
// Amenity
v1.POST("/amenities", middlewares.RequiredAuth(), middlewares.RequiredRoles("admin", "host"), amenityHdl.CreateAmenity())
v1.GET("/amenities", amenityHdl.GetAmenities())
v1.GET("/amenities/:id", amenityHdl.GetAmenityById())
v1.DELETE("/amenities/:id", middlewares.RequiredAuth(), middlewares.RequiredRoles("admin", "host"), amenityHdl.DeleteAmenity())
v1.PUT("/amenities/:id", middlewares.RequiredAuth(), middlewares.RequiredRoles("admin", "host"), amenityHdl.UpdateAmenity())
// PlaceAmenities
v1.POST("/place_amenities/:pid/:aid", middlewares.RequiredAuth(), middlewares.RequiredRoles("admin", "host"), placeAmenityHdl.CreatePlaceAmenities())
v1.DELETE("/place_amenities/:pid/:aid", middlewares.RequiredAuth(), placeAmenityHdl.DeletePlaceAmenities())
v1.GET("/place_amenities", middlewares.RequiredAuth(), middlewares.RequiredRoles("admin", "host"), placeAmenityHdl.GetPlaceAmenities())
v1.GET("/place_amenities/:place_id", middlewares.RequiredAuth(), middlewares.RequiredRoles("admin", "host"), placeAmenityHdl.GetAmenitiesByPlaceId())
// Bookings
v1.POST("/bookings/:place_id", middlewares.RequiredAuth(), bookingHdl.CreateBooking())
v1.GET("/bookings", middlewares.RequiredAuth(), middlewares.RequiredRoles("admin", "host"), bookingHdl.GetAllBooking())
v1.GET("/bookings/:id", middlewares.RequiredAuth(), middlewares.RequiredRoles("admin", "host"), bookingHdl.GetBookingById())
v1.PUT("/bookings/:id", middlewares.RequiredAuth(), middlewares.RequiredRoles("admin", "host"), bookingHdl.UpdateBooking())
v1.DELETE("/bookings/:id", middlewares.RequiredAuth(), middlewares.RequiredRoles("admin", "host"), bookingHdl.DeleteBooking())
//Reviews
v1.POST("/reviews/:booking_id", middlewares.RequiredAuth(), reviewHdl.CreateReview())
v1.DELETE("/reviews/:id", middlewares.RequiredAuth(), middlewares.RequiredRoles("host", "admin"), reviewHdl.DeleteReview())
v1.GET("/reviews", middlewares.RequiredAuth(), middlewares.RequiredRoles("host", "admin"), reviewHdl.GetAllReview())
v1.GET("/reviews/:id", middlewares.RequiredAuth(), middlewares.RequiredRoles("host", "admin"), reviewHdl.GetReviewById())
v1.GET("/place_reviews/:place_id", middlewares.RequiredAuth(), reviewHdl.GetAllReviewByPlaceId())
//Locations
v1.POST("/locations", middlewares.RequiredAuth(), middlewares.RequiredRoles("host", "admin"), locationHdl.CreateLocation())
v1.DELETE("/locations/:id", middlewares.RequiredAuth(), middlewares.RequiredRoles("host", "admin"), locationHdl.DeleteLocation())
v1.GET("/locations", middlewares.RequiredAuth(), middlewares.RequiredRoles("host", "admin"), locationHdl.GetAllLocation())
v1.PUT("/locations/:id", middlewares.RequiredAuth(), middlewares.RequiredRoles("host", "admin"), locationHdl.UpdateLocation())
v1.GET("/locations/:id", middlewares.RequiredAuth(), middlewares.RequiredRoles("host", "admin"), locationHdl.GetLocationById())
//router.Run()
router.Run(":" + cfg.App.Port)
}