package routes import ( "context" "enshi/middleware" "enshi/middleware/getters" "enshi/routes/authRoutes" "enshi/routes/blogRoutes" bookmarksroutes "enshi/routes/bookmarksRoutes" "enshi/routes/postsRoutes" "enshi/routes/userProfileRoutes" userroutes "enshi/routes/userRoutes" voteroutes "enshi/routes/voteRoutes" "log" "net/http" "os" "strings" "github.com/gin-gonic/gin" "go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/exporters/otlp/otlptrace" "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc" "google.golang.org/grpc/credentials" "go.opentelemetry.io/otel/sdk/resource" sdktrace "go.opentelemetry.io/otel/sdk/trace" ) var ( serviceName = os.Getenv("SERVICE_NAME") collectorURL = os.Getenv("OTEL_EXPORTER_OTLP_ENDPOINT") insecure = os.Getenv("INSECURE_MODE") ) func testCookie(c *gin.Context) { cock, _ := c.Cookie("auth_cookie") c.IndentedJSON(http.StatusOK, gin.H{"token": "SLESAR' U STASA " + strings.Split(cock, "_")[0]}) } func testAdmin(c *gin.Context) { c.IndentedJSON(http.StatusOK, gin.H{"message": "you are an admin, congrats!"}) } func testAuth(c *gin.Context) { userInfo, err := getters.GetClaimsFromContext(c) if err != nil { c.IndentedJSON(http.StatusUnauthorized, gin.H{"message": "you are not logged in"}) } c.IndentedJSON( http.StatusOK, gin.H{ "message": "you are logged in, congrats!", "username": userInfo.Username, "is_admin": userInfo.IsAdmin, "id": userInfo.Id, }, ) } func initTracer() func(context.Context) error { var secureOption otlptracegrpc.Option if strings.ToLower(insecure) == "false" || insecure == "0" || strings.ToLower(insecure) == "f" { secureOption = otlptracegrpc.WithTLSCredentials(credentials.NewClientTLSFromCert(nil, "")) } else { secureOption = otlptracegrpc.WithInsecure() } exporter, err := otlptrace.New( context.Background(), otlptracegrpc.NewClient( secureOption, otlptracegrpc.WithEndpoint(collectorURL), ), ) if err != nil { log.Fatalf("Failed to create exporter: %v", err) } resources, err := resource.New( context.Background(), resource.WithAttributes( attribute.String("service.name", serviceName), attribute.String("library.language", "go"), ), ) if err != nil { log.Fatalf("Could not set resources: %v", err) } otel.SetTracerProvider( sdktrace.NewTracerProvider( sdktrace.WithSampler(sdktrace.AlwaysSample()), sdktrace.WithBatcher(exporter), sdktrace.WithResource(resources), ), ) return exporter.Shutdown } func SetupRotes(g *gin.Engine) error { InitMiddlewareProvider() cleanup := initTracer() defer cleanup(context.Background()) g.Use(otelgin.Middleware(serviceName)) g.Use(middleware.CORSMiddleware()) g.Use(middleware.TargetMiddleware()) testGroup := g.Group("/test/") testGroup.Use(MiddlewareProvider.GetMiddleware(POST_MIDDLEWARE)) testGroup.GET( "posts/:post-id", postsRoutes.GetPost, ) testGroup.GET( "posts/random", postsRoutes.GetRandomPost, ) testGroup.PUT( "posts/:post-id", postsRoutes.UpdatePost, ) testGroup.POST( "posts", postsRoutes.CreatePost, ) testGroup.DELETE( "posts/:post-id", postsRoutes.DeletePost, ) // Free group routes freeGroup := g.Group("/") freeGroup.GET("getCookie", testCookie) freeGroup.POST( "login", authRoutes.Login, ) freeGroup.POST( "users", authRoutes.RegisterUser, ) postsGroup := g.Group("/") postsGroup.Use(middleware.PostsMiddleware()) postsGroup.GET( "posts/:post-id", postsRoutes.GetPost, ) postsGroup.GET( "posts/random", postsRoutes.GetRandomPost, ) postsGroup.PUT( "posts/:post-id", postsRoutes.UpdatePost, ) postsGroup.PUT( "posts/:post-id/blogs/:blog-id", postsRoutes.UpdatePostBlog, ) postsGroup.POST( "posts", postsRoutes.CreatePost, ) postsGroup.DELETE( "posts/:post-id", postsRoutes.DeletePost, ) postsGroup.DELETE( "posts/:post-id/blogs", postsRoutes.DeletePostBlog, ) blogGroup := g.Group("/") blogGroup.Use(MiddlewareProvider.GetMiddleware(BLOG_MIDDLEWARE)) blogGroup.POST( "blogs", blogRoutes.CreateBlog, ) blogGroup.PUT( "blogs/:blog-id", blogRoutes.UpdateBlog, ) blogGroup.DELETE( "blogs/:blog-id", blogRoutes.DeleteBlog, ) blogGroup.GET( "blogs/:blog-id", blogRoutes.GetBlog, ) profilesGroup := g.Group("/") profilesGroup.Use(middleware.ProfileMiddleware()) profilesGroup.PUT( "profiles", userProfileRoutes.UpdateUserProfile, ) bookmarksGroup := g.Group("/") bookmarksGroup.Use(middleware.BookmarksMiddleware()) bookmarksGroup.POST( "bookmarks/:post-id", bookmarksroutes.CreateBookmark, ) bookmarksGroup.DELETE( "bookmarks/:post-id", bookmarksroutes.DeleteBookmark, ) bookmarksGroup.GET( "bookmarks/:post-id", bookmarksroutes.GetBookmark, ) postVoteGroup := g.Group("/") postVoteGroup.Use(middleware.PostVotesMiddleware()) postVoteGroup.POST( "post-votes/:post-id", voteroutes.CreateVote, ) postVoteGroup.DELETE( "post-votes/:post-id", voteroutes.DeleteVote, ) postVoteGroup.GET( "post-vote/:post-id", voteroutes.GetVote, ) postVoteGroup.GET( "post-votes/:post-id", voteroutes.GetVotes, ) userGroup := g.Group("/users/") userGroup.Use(MiddlewareProvider.GetMiddleware(USER_MIDDLEWARE)) userGroup.GET( "/info/:user-id", userroutes.GetUserInfo, ) // Admin group routes adminGroup := g.Group("/admin/") adminGroup.Use(middleware.AdminMiddleware()) adminGroup.GET("check", testAdmin) authGroup := g.Group("/auth/") authGroup.Use(middleware.AuthMiddleware()) authGroup.GET("check", testAuth) authGroup.DELETE( "logout", authRoutes.Logout, ) temporal := g.Group("/") temporal.Use(middleware.AuthMiddleware()) temporal.GET( "/user/blogs", blogRoutes.GetUserBlogs, ) freeGroup.GET( "/user/:user-id", userroutes.GetUserUsername, ) return nil }