Add runtime restore and temp asset cleanup

This commit is contained in:
2026-06-05 20:28:26 +08:00
parent 644a6f9d17
commit d41d9482c7
22 changed files with 1837 additions and 50 deletions
@@ -0,0 +1,70 @@
package httpapi
import (
"context"
"errors"
"os"
"path/filepath"
"strings"
"time"
"github.com/easyai/easyai-ai-gateway/apps/api/internal/config"
"github.com/easyai/easyai-ai-gateway/apps/api/internal/store"
)
func (s *Server) startLocalTempAssetCleanup(ctx context.Context) {
go func() {
s.cleanupExpiredLocalTempAssets(ctx, time.Now())
ticker := time.NewTicker(time.Hour)
defer ticker.Stop()
for {
select {
case <-ctx.Done():
return
case now := <-ticker.C:
s.cleanupExpiredLocalTempAssets(ctx, now)
}
}
}()
}
func (s *Server) cleanupExpiredLocalTempAssets(ctx context.Context, now time.Time) int {
storageDir := strings.TrimSpace(s.cfg.LocalUploadedStorageDir)
if storageDir == "" {
storageDir = config.DefaultLocalUploadedStorageDir
}
entries, err := os.ReadDir(storageDir)
if err != nil {
if !errors.Is(err, os.ErrNotExist) {
s.logger.Warn("read local temp asset dir failed", "dir", storageDir, "error", err)
}
return 0
}
ttl := time.Duration(s.localTempAssetTTLHours()) * time.Hour
expiredBefore := now.Add(-ttl)
deleted := 0
for _, entry := range entries {
if entry.IsDir() || !strings.HasPrefix(entry.Name(), requestAssetFilePrefix) {
continue
}
info, err := entry.Info()
if err != nil {
continue
}
if info.ModTime().After(expiredBefore) {
continue
}
localPath := filepath.Join(storageDir, entry.Name())
if err := os.Remove(localPath); err != nil && !errors.Is(err, os.ErrNotExist) {
s.logger.Warn("remove local temp asset failed", "path", localPath, "error", err)
continue
}
deleted++
if s.store != nil {
if err := s.store.MarkRequestAssetExpiredByLocalPath(ctx, localPath, now); err != nil && !store.IsUndefinedDatabaseObject(err) {
s.logger.Warn("mark local temp asset expired failed", "path", localPath, "error", err)
}
}
}
return deleted
}