package main import ( "context" "fmt" "git.siteworxpro.com/packages/go/utilities/Env" "git.siteworxpro.com/reloading-manager/backend/database" "git.siteworxpro.com/reloading-manager/backend/handlers/bullets" "git.siteworxpro.com/reloading-manager/backend/handlers/cartridge" "git.siteworxpro.com/reloading-manager/backend/handlers/loads" "git.siteworxpro.com/reloading-manager/backend/handlers/manufacturer" "git.siteworxpro.com/reloading-manager/backend/handlers/powder" "git.siteworxpro.com/reloading-manager/backend/handlers/primers" "github.com/go-playground/validator" "github.com/labstack/echo/v4" "github.com/labstack/echo/v4/middleware" "github.com/labstack/gommon/log" "net/http" "strings" ) const ( Port Env.EnvironmentVariable = "PORT" CorsOrigin Env.EnvironmentVariable = "CORS_ORIGIN" ) type ( CustomValidator struct { validator *validator.Validate } ) func (cv *CustomValidator) Validate(i interface{}) error { if err := cv.validator.Struct(i); err != nil { return echo.NewHTTPError(http.StatusBadRequest, err.Error()) } return nil } func main() { e := echo.New() e.Validator = &CustomValidator{validator: validator.New()} e.HideBanner = true e.HidePort = true e.Logger.SetLevel(log.DEBUG) corsOriginS := CorsOrigin.GetEnvString("http://localhost:5173,http://127.0.0.1:5173") corsOrigin := strings.Split(corsOriginS, ",") e.Use(database.CreateDatabaseMiddleware()) e.Use(middleware.Recover()) e.Use(middleware.Logger()) e.Use(middleware.CORSWithConfig(middleware.CORSConfig{ AllowOrigins: corsOrigin, AllowMethods: []string{"GET", "POST", "PUT", "PATCH", "DELETE"}, })) migrate(e) // Bullets e.GET("/bullet", bullets.Get) e.GET("/bullet/:id", bullets.Get) e.GET("/bullet/:id/photo", bullets.Photo) e.POST("/bullet", bullets.Post) e.POST("/bullet/:id", bullets.Put) e.DELETE("/bullet/:id", bullets.Delete) // Manufacturers e.GET("/manufacturer", manufacturer.Get) e.GET("/manufacturer/:id", manufacturer.Get) e.POST("/manufacturer", manufacturer.Post) e.POST("/manufacturer/:id", manufacturer.Post) e.DELETE("/manufacturer/:id", manufacturer.Delete) // Powders e.GET("/powder", powder.Get) e.GET("/powder/:id", powder.Get) e.GET("/powder/:id/photo", powder.Photo) e.POST("/powder", powder.Post) e.POST("/powder/:id", powder.Post) e.DELETE("/powder/:id", powder.Delete) // Primers e.GET("/primer", primers.Get) e.GET("/primer/:id", primers.Get) e.GET("/primer/:id/photo", primers.Photo) e.POST("/primer", primers.Post) e.POST("/primer/:id", primers.Post) e.DELETE("/primer/:id", primers.Delete) // cartridge e.GET("/cartridge", cartridge.Get) e.POST("/cartridge", cartridge.Post) e.DELETE("/cartridge/:id", cartridge.Delete) // loads e.GET("/load", loads.Get) e.GET("/load/:id", loads.Get) e.GET("/load/:id/photo", loads.Photo) e.POST("/load", loads.Post) e.POST("/load/:id", loads.Post) e.DELETE("/load/:id", loads.Delete) addr := fmt.Sprintf("0.0.0.0:%s", Port.GetEnvString("8080")) e.Logger.Info("🚀 Starting Server...") e.Logger.Infof("🔌 Connecting to database... %s", database.GetNewDatabase().DSN(true)) e.Logger.Infof("🎧 Listening on %v", addr) e.Logger.Fatal(e.Start(addr)) } func migrate(e *echo.Echo) { e.Logger.Info("🛠️ Starting migrations...") db := database.GetNewDatabase() defer func() { _ = db.Db.Close(context.Background()) }() db.Migrate() e.Logger.Info("✅ Complete!") }