package ginserver import ( "john/handler" "john/internal/storage/dao/postgresql" "john/internal/user" "john/middleware" "net/http" "time" "github.com/gin-gonic/gin" "github.com/gin-contrib/cors" ) func NewRouter(config *handler.Config) *gin.Engine { gin.SetMode(gin.ReleaseMode) router := gin.New() router.HandleMethodNotAllowed = true router.Use(cors.New(cors.Config{ AllowOrigins: []string{"http://localhost:8080/", "http://localhost:8080"}, AllowMethods: []string{"*"}, AllowHeaders: []string{"*"}, ExposeHeaders: []string{"*"}, AllowCredentials: true, MaxAge: 12 * time.Hour, })) router.Use(gin.Recovery()) router.Use(GetLoggerMiddleware()) router.Use(GetHTTPLoggerMiddleware()) db := postgresql.NewDatabasePostgreSQL(config.DBConnectionURI) hc := handler.NewContext() uh := user.NewHandler(hc, db) mv := middleware.NewValidator(hc, db) public := router.Group("/") public.Handle(http.MethodGet, "/_health", hc.GetHealth) userRoute := public.Group("/users") userRoute.Handle("GET", "", uh.ConnectUser) userRoute.Handle(http.MethodPost, "", uh.CreateUser) securedUserRoute := userRoute.Group("/") securedUserRoute.Use(middleware.ValidateOAuthToken) //TODO add secure auth securedUserRoute.Handle(http.MethodGet, "/:userId", uh.GetUser) securedMatchingToken := securedUserRoute.Group("/:userId") securedMatchingToken.Use(mv.HasValidUserId) securedMatchingToken.Use(mv.UserdIdMatchOAuthToken) return router }