package api import ( "fmt" db "git.nochill.in/nochill/hiling_go/db/sqlc" "git.nochill.in/nochill/hiling_go/util" "git.nochill.in/nochill/hiling_go/util/token" "github.com/gin-contrib/cors" "github.com/gin-gonic/gin" "github.com/meilisearch/meilisearch-go" ) type Server struct { Config util.Config Store db.Store TokenMaker token.Maker Router *gin.Engine MeilisearchClient *meilisearch.Client } func NewServer(config util.Config, store db.Store) (*Server, error) { tokenMaker, err := token.NewPasetoMaker(config.TokenSymmetricKey) if err != nil { return nil, fmt.Errorf("cannot create token maker: %w", err) } meiliClient := meilisearch.NewClient(meilisearch.ClientConfig{ Host: config.MeilisearchHost, APIKey: config.MeilisearchKey, }) server := &Server{ Config: config, Store: store, TokenMaker: tokenMaker, MeilisearchClient: meiliClient, } server.getRoutes() return server, nil } func (server *Server) getRoutes() { router := gin.Default() router.Use(cors.New(cors.Config{ AllowOrigins: []string{"http://localhost:5173"}, AllowCredentials: true, AllowHeaders: []string{"Content-Type", "Content-Length", "Accept-Encoding", "Authorization", "accept", "origin", "Cache-Control", "X-Requested-With", "X-XSRF-TOKEN"}, AllowMethods: []string{"POST", "PUT", "GET", "DELETE", "PATCH"}, })) router.POST("/user/signup", server.createUser) router.POST("/user/login", server.login) router.POST("/user/logout", server.logout) router.GET("/regions", server.getListRegions) router.GET("/region/provinces", server.getListProvinces) router.GET("/region/regencies", server.getListRegencies) // LOCATION router.POST("/locations", server.createLocation) router.GET("/locations/recent", server.getListRecentLocationsWithRatings) router.GET("/locations/top-ratings", server.getTopListLocations) router.GET("/locations", server.getListLocations) router.GET("/location/:location_id", server.getLocation) router.GET("/location/tags/:location_id", server.getTagsByLocation) router.GET("/location/reviews", server.getListLocationReviews) router.GET("/locations/search", server.searchLocations) //IMAGES router.GET("/images/location", server.getAllImagesByLocation) // NEWS / EVENTS router.GET("/news-events", server.GetNewsEventsList) // REQUIRE AUTH TOKEN authRoutes := router.Use(authMiddleware(server.TokenMaker)) authRoutes.POST("/review/location", server.createReview) authRoutes.PATCH("/user", server.updateUser) authRoutes.GET("/user/review/location/:location_id", server.getUserReviewByLocation) authRoutes.GET("/user/profile", server.getUserStats) authRoutes.PATCH("/user/avatar", server.updateUserAvatar) authRoutes.DELETE("/user/avatar", server.removeAvatar) authRoutes.POST("/news-events", server.createNews) server.Router = router } func (server *Server) Start(address string) error { return server.Router.Run(address) }