infoalloggi-monorepo/apps/backend/storage.go

162 lines
3.2 KiB
Go
Raw Normal View History

2025-08-04 17:45:44 +02:00
package main
import (
"backend/config"
"backend/queries"
storagehandlers "backend/storage_handlers"
2025-08-04 17:45:44 +02:00
"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()
2025-08-04 17:45:44 +02:00
if err != nil {
return "", err
2025-08-04 17:45:44 +02:00
}
err = s.Add(file, newId)
2025-08-04 17:45:44 +02:00
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)
2025-08-04 17:45:44 +02:00
if err != nil {
return "", err
2025-08-04 17:45:44 +02:00
}
err = queries.StorageDeleteUnused()
2025-08-04 17:45:44 +02:00
if err != nil {
return "", err
2025-08-04 17:45:44 +02:00
}
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)
2025-08-04 17:45:44 +02:00
if err != nil {
return err
}
err = queries.StorageCleanExpiredTokens(token)
2025-08-04 17:45:44 +02:00
if err != nil {
return err
}
return nil
}
func RemoveFromDb(ref string) error {
return queries.StorageDelete(ref)
2025-08-04 17:45:44 +02:00
}
func RemoveExpired(s storagehandlers.StorageHandler) error {
2025-08-04 17:45:44 +02:00
//get all expired files
items_db, err := queries.StorageGetExpiredFiles()
2025-08-04 17:45:44 +02:00
if err != nil {
return err
2025-08-04 17:45:44 +02:00
}
2025-08-04 17:45:44 +02:00
for _, item := range items_db {
formattedName := item.Id + item.Ext
err = s.Delete(formattedName)
2025-08-04 17:45:44 +02:00
if err != nil {
return fmt.Errorf("failed to delete file %s: %w", formattedName, err)
}
err = queries.StorageDelete(item.Id)
2025-08-04 17:45:44 +02:00
if err != nil {
return err
2025-08-04 17:45:44 +02:00
}
}
return nil
}
func CheckConcruency(s storagehandlers.StorageHandler) error {
items_db, err := queries.StorageGet_min()
2025-08-04 17:45:44 +02:00
if err != nil {
return err
}
files, err := s.List()
2025-08-04 17:45:44 +02:00
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)
2025-08-04 17:45:44 +02:00
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/"))
2025-08-04 17:45:44 +02:00
if err != nil {
return err
}
fmt.Println("Temp files: ", len(files))
if len(files) >= limit {
2025-08-04 17:45:44 +02:00
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))
2025-08-04 17:45:44 +02:00
if err != nil {
return err
}
}
return nil
}