62 lines
1.7 KiB
Go
62 lines
1.7 KiB
Go
package core
|
|
|
|
import (
|
|
"context"
|
|
"log"
|
|
"os"
|
|
"path/filepath"
|
|
|
|
"gitea.mrixs.me/minecraft-platform/backend/internal/database"
|
|
)
|
|
|
|
// FileJanitorService отвечает за очистку осиротевших файлов.
|
|
type FileJanitorService struct {
|
|
ModpackRepo *database.ModpackRepository
|
|
StoragePath string
|
|
}
|
|
|
|
// NewFileJanitorService создает новый экземпляр сервиса-уборщика.
|
|
func NewFileJanitorService(repo *database.ModpackRepository, storagePath string) *FileJanitorService {
|
|
return &FileJanitorService{
|
|
ModpackRepo: repo,
|
|
StoragePath: storagePath,
|
|
}
|
|
}
|
|
|
|
// CleanOrphanedFiles сканирует хранилище и удаляет файлы, отсутствующие в БД.
|
|
func (s *FileJanitorService) CleanOrphanedFiles(ctx context.Context) {
|
|
log.Println("Janitor: Starting orphaned file cleanup...")
|
|
|
|
liveHashes, err := s.ModpackRepo.GetAllFileHashes(ctx)
|
|
if err != nil {
|
|
log.Printf("Janitor: Error getting live hashes from DB: %v", err)
|
|
return
|
|
}
|
|
|
|
diskFiles, err := os.ReadDir(s.StoragePath)
|
|
if err != nil {
|
|
log.Printf("Janitor: Error reading storage directory %s: %v", s.StoragePath, err)
|
|
return
|
|
}
|
|
|
|
removedCount := 0
|
|
for _, file := range diskFiles {
|
|
if file.IsDir() {
|
|
continue
|
|
}
|
|
|
|
fileName := file.Name()
|
|
if _, isLive := liveHashes[fileName]; !isLive {
|
|
filePath := filepath.Join(s.StoragePath, fileName)
|
|
if err := os.Remove(filePath); err != nil {
|
|
log.Printf("Janitor: Failed to remove orphaned file %s: %v", filePath, err)
|
|
} else {
|
|
log.Printf("Janitor: Removed orphaned file %s", filePath)
|
|
removedCount++
|
|
}
|
|
}
|
|
}
|
|
|
|
log.Printf("Janitor: Cleanup complete. Removed %d orphaned files.", removedCount)
|
|
}
|