package main import ( "backend/queries" storagehandlers "backend/storage_handlers" "fmt" "io" "log" "math/rand" "net/http" "os" "path/filepath" "strconv" "strings" "text/template" "time" "github.com/joho/godotenv" "github.com/labstack/echo/v4" ) var ( imgbasepath string imageOption bool concurrentImages int = 1 storagepath string Miogest *MiogestHandler ImageManager *ImageRefManager Storage storagehandlers.StorageHandler tempStorageLimit int = 5 ) func main() { // SETUP WORK DIRECTORY pwd, err := os.Getwd() if err != nil { fmt.Println(err) os.Exit(1) } // join paths indipedently of the OS imgbasepath = filepath.Join(pwd, "images") fmt.Println("Image base path: ", imgbasepath) storagepath = filepath.Join(pwd, "storage") // SETUP ENV VARIABLES err = godotenv.Load(".env") if err != nil { fmt.Println("Error loading .env file") } if os.Getenv("IMAGEOPTION") != "" { if os.Getenv("IMAGEOPTION") == "true" { imageOption = true } else { imageOption = false } } if os.Getenv("CONCURRENT_IMAGES") != "" { concurrentImages, err = strconv.Atoi(os.Getenv("CONCURRENT_IMAGES")) if err != nil { fmt.Println("Error parsing CONCURRENT_IMAGES:", err) } } // SETUP MIOGEST HANDLER Miogest = NewMiogestHandler() if Miogest == nil { log.Fatal("Error connecting to miogest") } // SETUP IMAGE MANAGER ImageManager = NewImageRefManager() if ImageManager == nil { log.Fatal("Error creating image manager") } // SETUP STORAGE HANDLER storagehandlers.Storagepath = storagepath var strategy storagehandlers.StorageStrategy = storagehandlers.FS STORAGE_STRATEGY := os.Getenv("STORAGE_STRATEGY") if STORAGE_STRATEGY == "s3" || STORAGE_STRATEGY == "minio" { MINIO_URL := os.Getenv("MINIO_URL") MINIO_ROOT_USER := os.Getenv("MINIO_ROOT_USER") MINIO_ROOT_PASSWORD := os.Getenv("MINIO_ROOT_PASSWORD") if MINIO_URL == "" || MINIO_ROOT_USER == "" || MINIO_ROOT_PASSWORD == "" { fmt.Println("Error: MINIO_ROOT_USER, MINIO_ROOT_PASSWORD and MINIO_URL must be set") strategy = storagehandlers.FS } else { strategy = storagehandlers.S3 } } h, err := storagehandlers.NewStorageHandler(strategy) if err != nil { log.Fatal("Error creating storage handler: " + err.Error()) } Storage = h fmt.Printf("Storage Strategy: %s\n", strategy) // SETUP ECHO e := SetupRoutes() // SETUP PORT port := "1323" if os.Getenv("ASPNETCORE_PORT") != "" { port = os.Getenv("ASPNETCORE_PORT") } fmt.Println("Image Option: ", imageOption) fmt.Println("Concurrent Images: ", concurrentImages) fmt.Println("Server url: http://localhost:" + port) Conversion("test.jpg") // START ECHO e.Logger.Info(e.Start(":" + port)) } type Template struct { templates *template.Template } func (t *Template) Render(w io.Writer, name string, data any, c echo.Context) error { return t.templates.ExecuteTemplate(w, name, data) } func SetupRoutes() *echo.Echo { funcs := map[string]any{ "contains": strings.Contains, "hasPrefix": strings.HasPrefix, "hasSuffix": strings.HasSuffix, "getImage": func(txt string) string { return txt[7:] }, "isWebp": func(txt string) bool { return strings.Contains(txt, "webp") }, } t := &Template{ templates: template.Must(template.New("").Funcs(funcs).ParseGlob("public/views/*.html")), } e := echo.New() e.Renderer = t // MISC e.Static("/static", "public/static") e.GET("/", func(c echo.Context) error { return c.Render(http.StatusOK, "main", map[string]any{ "imageOption": imageOption, "concurrentImages": concurrentImages, }) }) e.GET("/test", func(c echo.Context) error { return c.String(http.StatusOK, "OK") }) e.POST("/testpost", func(c echo.Context) error { // Get the form value test := c.FormValue("test") fmt.Println("test:", test) return c.String(http.StatusOK, "OK") }) e.GET("/health", func(c echo.Context) error { h := queries.HealthCheck() return c.String(http.StatusOK, fmt.Sprintf("DB Connection: %v", h)) }) MiogestRoutes(e) BkpRoutes(e) StorageRoutes(e) ImageRoutes(e) return e } func BkpRoutes(e *echo.Echo) { e.GET("/upload-backup", func(c echo.Context) error { return c.Render(http.StatusOK, "backup-upload", nil) }) e.POST("/upload-backup", func(c echo.Context) error { file, err := c.FormFile("file") if err != nil { return err } src, err := file.Open() if err != nil { return err } defer src.Close() dst, err := os.Create("bkp.xml") if err != nil { return err } defer dst.Close() if _, err = io.Copy(dst, src); err != nil { return err } return c.HTML(http.StatusOK, fmt.Sprintf("

File %s uploaded successfully.

", file.Filename)) }) e.GET("/bkp", func(c echo.Context) error { data := From_Backup() return c.JSONPretty(http.StatusOK, data, " ") }) e.GET("/parsebkp", func(c echo.Context) error { var data = ParseUpdateBkp() return c.JSONPretty(http.StatusOK, data, " ") }) e.GET("/setbkp", func(c echo.Context) error { var data = ParseUpdateBkp() err := queries.SetFromBkp(data) if err != nil { return c.String(http.StatusInternalServerError, err.Error()) } return c.String(http.StatusOK, "Setted") }) } func MiogestRoutes(e *echo.Echo) { // MIOGEST DEFAULTS e.GET("/cats", func(c echo.Context) error { var data = Miogest.GetCaratteristiche() return c.JSONPretty(http.StatusOK, data, " ") }) e.GET("/categ", func(c echo.Context) error { var data = Miogest.GetCategorie() return c.JSONPretty(http.StatusOK, data, " ") }) // MIOGEST UPDATE e.GET("/miogest", func(c echo.Context) error { data := Miogest.GetAnnunci() return c.JSONPretty(http.StatusOK, data, " ") }) e.GET("/miogest-sample", func(c echo.Context) error { xml := Miogest.GetAnnunci() rand := rand.Intn(len(xml.Annuncio)) data := xml.Annuncio[rand] return c.JSONPretty(http.StatusOK, data, " ") }) e.GET("/parse", func(c echo.Context) error { start := time.Now() var data = Miogest.GetAnnunciParsed() end := time.Now() fmt.Println("time taken:", end.Sub(start).String()) return c.JSONPretty(http.StatusOK, data, " ") }) e.GET("/update", func(c echo.Context) error { var data = Miogest.GetAnnunciParsed() err := queries.AnnunciInsert(data) if err != nil { return c.String(http.StatusInternalServerError, err.Error()) } return c.String(http.StatusOK, "Updated") }) }