- Updated `fs.go` and `minio.go` to replace hardcoded storage paths with values from the new config package. - Introduced a new `config` package to manage application configuration, including database and storage settings. - Removed the `models.go` file from `typedefs` as it was no longer needed. - Added a new `config.go` file to handle loading environment variables and application settings. - Created a new `types.go` file in `typedefs` to define storage strategies. - Updated `storage_handler.go` to utilize the new configuration structure.
161 lines
3.2 KiB
Go
161 lines
3.2 KiB
Go
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
|
|
|
|
}
|