package main import ( "backend/config" "backend/queries" storagehandlers "backend/storage_handlers" "fmt" "mime/multipart" "net/http" "os" "path/filepath" "slices" "time" "github.com/labstack/echo/v4" ) // Upload saves a file to the storage directory. func Upload(file *multipart.FileHeader, from_admin bool, s storagehandlers.StorageHandler) (string, error) { fmt.Printf("Uploading file: %s\n", file.Filename) newId, err := queries.StorageNewId() if err != nil { return "", err } err = s.Add(file, newId) if err != nil { return "", err } //if !from_admin , expires in 60 days var expiresAt *time.Time if !from_admin { exp := time.Now().AddDate(0, 2, 0) // 60 days expiresAt = &exp } else { expiresAt = nil } err = queries.StorageUpdate(newId, file.Filename, filepath.Ext(file.Filename), from_admin, expiresAt) if err != nil { return "", err } err = queries.StorageDeleteUnused() if err != nil { return "", err } return newId, nil } func StorageAuth(c echo.Context) error { token := c.Request().URL.Query().Get("token") if len(token) < 1 { return c.String(http.StatusUnauthorized, "Unauthorized") } err := queries.StorageCheckToken(token) if err != nil { return err } err = queries.StorageCleanExpiredTokens(token) if err != nil { return err } return nil } func RemoveFromDb(ref string) error { return queries.StorageDelete(ref) } func RemoveExpired(s storagehandlers.StorageHandler) error { //get all expired files items_db, err := queries.StorageGetExpiredFiles() if err != nil { return err } for _, item := range items_db { formattedName := item.Id + item.Ext err = s.Delete(formattedName) if err != nil { return fmt.Errorf("failed to delete file %s: %w", formattedName, err) } err = queries.StorageDelete(item.Id) if err != nil { return err } } return nil } func CheckConcruency(s storagehandlers.StorageHandler) error { items_db, err := queries.StorageGet_min() if err != nil { return err } files, err := s.List() if err != nil { return err } if len(items_db) != len(files) { var founds []string for _, item := range items_db { formattedName := item.Id + item.Ext found := slices.Contains(files, formattedName) if found { founds = append(founds, formattedName) } else { err := queries.StorageDelete(item.Id) if err != nil { return err } } } for _, file := range files { found := slices.Contains(founds, file) if !found { fmt.Printf("File %v not found in db\n", file) //TODO decidere se eliminarlo } } } return nil } func TempFolderCleaner(limit int) error { files, err := os.ReadDir(filepath.Join(config.Cfg.Storage.Path, "/tmp/")) if err != nil { return err } fmt.Println("Temp files: ", len(files)) if len(files) >= limit { var oldest_Time time.Time var oldest_File string for _, file := range files { file_infos, err := file.Info() if err != nil { return err } if oldest_Time.IsZero() || file_infos.ModTime().Before(oldest_Time) { oldest_Time = file_infos.ModTime() oldest_File = file.Name() } } err = os.Remove(filepath.Join(config.Cfg.Storage.Path, "/tmp/", oldest_File)) if err != nil { return err } } return nil }