2025-08-04 17:45:44 +02:00
|
|
|
package main
|
|
|
|
|
|
|
|
|
|
import (
|
2025-08-22 12:57:33 +02:00
|
|
|
"backend/config"
|
2025-08-22 10:11:07 +02:00
|
|
|
"backend/queries"
|
2025-08-22 12:57:33 +02:00
|
|
|
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.
|
2025-08-22 12:57:33 +02:00
|
|
|
func Upload(file *multipart.FileHeader, from_admin bool, s storagehandlers.StorageHandler) (string, error) {
|
|
|
|
|
fmt.Printf("Uploading file: %s\n", file.Filename)
|
2025-08-22 10:11:07 +02:00
|
|
|
|
|
|
|
|
newId, err := queries.StorageNewId()
|
2025-08-04 17:45:44 +02:00
|
|
|
if err != nil {
|
2025-08-22 10:11:07 +02:00
|
|
|
return "", err
|
2025-08-04 17:45:44 +02:00
|
|
|
}
|
2025-08-22 10:11:07 +02:00
|
|
|
|
2025-08-22 12:57:33 +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
|
|
|
|
|
}
|
|
|
|
|
|
2025-08-22 10:11:07 +02:00
|
|
|
err = queries.StorageUpdate(newId, file.Filename, filepath.Ext(file.Filename), from_admin, expiresAt)
|
2025-08-04 17:45:44 +02:00
|
|
|
if err != nil {
|
2025-08-22 10:11:07 +02:00
|
|
|
return "", err
|
2025-08-04 17:45:44 +02:00
|
|
|
}
|
|
|
|
|
|
2025-08-22 10:11:07 +02:00
|
|
|
err = queries.StorageDeleteUnused()
|
2025-08-04 17:45:44 +02:00
|
|
|
if err != nil {
|
2025-08-22 10:11:07 +02:00
|
|
|
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")
|
|
|
|
|
}
|
2025-08-22 10:11:07 +02:00
|
|
|
err := queries.StorageCheckToken(token)
|
2025-08-04 17:45:44 +02:00
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
2025-08-22 10:11:07 +02:00
|
|
|
err = queries.StorageCleanExpiredTokens(token)
|
2025-08-04 17:45:44 +02:00
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func RemoveFromDb(ref string) error {
|
|
|
|
|
|
2025-08-22 10:11:07 +02:00
|
|
|
return queries.StorageDelete(ref)
|
2025-08-04 17:45:44 +02:00
|
|
|
}
|
|
|
|
|
|
2025-08-22 12:57:33 +02:00
|
|
|
func RemoveExpired(s storagehandlers.StorageHandler) error {
|
2025-08-04 17:45:44 +02:00
|
|
|
//get all expired files
|
2025-08-22 10:11:07 +02:00
|
|
|
items_db, err := queries.StorageGetExpiredFiles()
|
2025-08-04 17:45:44 +02:00
|
|
|
if err != nil {
|
2025-08-22 10:11:07 +02:00
|
|
|
return err
|
2025-08-04 17:45:44 +02:00
|
|
|
}
|
2025-08-22 10:11:07 +02:00
|
|
|
|
2025-08-04 17:45:44 +02:00
|
|
|
for _, item := range items_db {
|
|
|
|
|
formattedName := item.Id + item.Ext
|
2025-08-22 12:57:33 +02:00
|
|
|
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)
|
|
|
|
|
}
|
2025-08-22 10:11:07 +02:00
|
|
|
err = queries.StorageDelete(item.Id)
|
2025-08-04 17:45:44 +02:00
|
|
|
if err != nil {
|
2025-08-22 10:11:07 +02:00
|
|
|
return err
|
2025-08-04 17:45:44 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
2025-08-22 12:57:33 +02:00
|
|
|
func CheckConcruency(s storagehandlers.StorageHandler) error {
|
2025-08-22 10:11:07 +02:00
|
|
|
items_db, err := queries.StorageGet_min()
|
2025-08-04 17:45:44 +02:00
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
2025-08-22 12:57:33 +02:00
|
|
|
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 {
|
2025-08-22 10:11:07 +02:00
|
|
|
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
|
|
|
|
|
}
|
|
|
|
|
|
2025-08-22 12:57:33 +02:00
|
|
|
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))
|
2025-08-22 12:57:33 +02:00
|
|
|
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()
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-08-22 12:57:33 +02:00
|
|
|
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
|
|
|
|
|
|
|
|
|
|
}
|