package main import ( "fmt" "io" "log" "os" "runtime/debug" "github.com/Caknoooo/go-gin-clean-starter/config" "github.com/Caknoooo/go-gin-clean-starter/docs" "github.com/Caknoooo/go-gin-clean-starter/middlewares" "github.com/Caknoooo/go-gin-clean-starter/modules/aisle" "github.com/Caknoooo/go-gin-clean-starter/modules/assignment" "github.com/Caknoooo/go-gin-clean-starter/modules/auth" "github.com/Caknoooo/go-gin-clean-starter/modules/category" "github.com/Caknoooo/go-gin-clean-starter/modules/client" inventoryissue "github.com/Caknoooo/go-gin-clean-starter/modules/inventory_issue" inventorymovement "github.com/Caknoooo/go-gin-clean-starter/modules/inventory_movement" inventoryreceipt "github.com/Caknoooo/go-gin-clean-starter/modules/inventory_receipt" inventoryrequest "github.com/Caknoooo/go-gin-clean-starter/modules/inventory_request" inventoryreturn "github.com/Caknoooo/go-gin-clean-starter/modules/inventory_return" inventorystorage "github.com/Caknoooo/go-gin-clean-starter/modules/inventory_storage" inventorytransaction "github.com/Caknoooo/go-gin-clean-starter/modules/inventory_transaction" maintenancegroup "github.com/Caknoooo/go-gin-clean-starter/modules/maintenance_group" "github.com/Caknoooo/go-gin-clean-starter/modules/menu" "github.com/Caknoooo/go-gin-clean-starter/modules/monitoring" "github.com/Caknoooo/go-gin-clean-starter/modules/mvendor" "github.com/Caknoooo/go-gin-clean-starter/modules/permissions" "github.com/Caknoooo/go-gin-clean-starter/modules/product" "github.com/Caknoooo/go-gin-clean-starter/modules/quarantine" "github.com/Caknoooo/go-gin-clean-starter/modules/role" "github.com/Caknoooo/go-gin-clean-starter/modules/uom" "github.com/Caknoooo/go-gin-clean-starter/modules/warehouse" "github.com/Caknoooo/go-gin-clean-starter/modules/zona" "github.com/Caknoooo/go-gin-clean-starter/pkg/constants" "github.com/sirupsen/logrus" "github.com/spf13/viper" swaggerFiles "github.com/swaggo/files" ginSwagger "github.com/swaggo/gin-swagger" "github.com/Caknoooo/go-gin-clean-starter/modules/logs" "github.com/Caknoooo/go-gin-clean-starter/modules/user" "github.com/Caknoooo/go-gin-clean-starter/providers" "github.com/Caknoooo/go-gin-clean-starter/script" "github.com/samber/do" // "github.com/common-nighthawk/go-figure" "github.com/gin-gonic/gin" ) func args(injector *do.Injector) bool { if len(os.Args) > 1 { flag := script.Commands(injector) return flag } return true } func run(server *gin.Engine) { server.Static("/assets", "./assets") port := viper.GetString("GOLANG_PORT") if port == "" { port = "8888" } var serve string if viper.GetString("APP_ENV") == "localhost" { serve = "0.0.0.0:" + port } else { serve = ":" + port } // myFigure := figure.NewColorFigure("Hafaro", "", "green", true) // myFigure.Print() if err := server.Run(serve); err != nil { log.Fatalf("error running server: %v", err) } } // @title WMS Wareify API Docs // @version 1.0 // @description This is a sample server celler server. // @termsOfService http://swagger.io/terms/ // @contact.name API Support // @contact.url http://www.swagger.io/support // @contact.email support@swagger.io // @license.name Apache 2.0 // @license.url http://www.apache.org/licenses/LICENSE-2.0.html // @host localhost:8888 // @BasePath /api/v1 // @securityDefinitions.apikey BearerAuth // @in header // @name Authorization // @description Bearer token for authentication // @tokenUrl http://localhost:3000/auth/login // @externalDocs.description OpenAPI // @externalDocs.url https://swagger.io/resources/open-api/ func main() { viper.SetConfigFile(".env") err := viper.ReadInConfig() if err != nil { log.Fatal("Error loading .env file") } viper.AutomaticEnv() var ( injector = do.New() ) // Inisialisasi RabbitMQ config.InitRabbitMQ() // Register dependencies (termasuk logger) providers.RegisterDependencies(injector) // Ambil logger dari injector logger := do.MustInvokeNamed[*logrus.Logger](injector, constants.LOGGER) // 🔹 Tangkap panic global di luar Gin (worker, cron, dsb.) defer func() { if r := recover(); r != nil { // Convert panic value ke string untuk menghindari serialization error panicMsg := fmt.Sprintf("%v", r) logger.WithFields(logrus.Fields{ "panic": panicMsg, "stack": string(debug.Stack()), }).Error("Uncaught panic at main") } }() // set Swagger info (opsional) docs.SwaggerInfo.Title = "WMS Wareify API" docs.SwaggerInfo.Version = "1.0" docs.SwaggerInfo.Host = "localhost:8888" docs.SwaggerInfo.BasePath = "/api/v1" if !args(injector) { return } // Logging to a file. f, _ := os.Create("gin.log") gin.DefaultWriter = io.MultiWriter(f) gin.SetMode(gin.DebugMode) server := gin.Default() //db := do.MustInvokeNamed[*gorm.DB](injector, constants.DB) //scheduler.Start(db) // Load template dari root server.LoadHTMLFiles("logs.html") // Atur trusted proxies, misal hanya localhost dan IP proxy tertentu // server.SetTrustedProxies([]string{"127.0.0.1"}) server.SetTrustedProxies(nil) // disable trusted proxies server.RedirectTrailingSlash = false // Enable middleware server.Use(middlewares.CORSMiddleware()) server.Use(middlewares.GinRecoveryWithLogrus(logger)) // Register module routes monitoring.RegisterRoutes(server) user.RegisterRoutes(server, injector) auth.RegisterRoutes(server, injector) role.RegisterRoutes(server, injector) logs.RegisterRoutes(server, injector) menu.RegisterRoutes(server, injector) maintenancegroup.RegisterRoutes(server, injector) client.RegisterRoutes(server, injector) permissions.RegisterRoutes(server, injector) product.RegisterRoutes(server, injector) category.RegisterRoutes(server, injector) uom.RegisterRoutes(server, injector) mvendor.RegisterRoutes(server, injector) warehouse.RegisterRoutes(server, injector) zona.RegisterRoutes(server, injector) aisle.RegisterRoutes(server, injector) inventoryreceipt.RegisterRoutes(server, injector) assignment.RegisterRoutes(server, injector) inventoryrequest.RegisterRoutes(server, injector) inventoryissue.RegisterRoutes(server, injector) inventoryreturn.RegisterRoutes(server, injector) inventorymovement.RegisterRoutes(server, injector) inventorystorage.RegisterRoutes(server, injector) inventorytransaction.RegisterRoutes(server, injector) quarantine.RegisterRoutes(server, injector) // register swagger route server.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) run(server) }