diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 2eeec73..9b4c0c4 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -4,18 +4,10 @@
-
-
+
-
-
-
-
-
-
-
-
-
+
+
@@ -129,7 +121,8 @@
-
+
+
true
diff --git a/pkg/internal/services/recycler.go b/pkg/internal/services/recycler.go
index 7f2c23c..a6f0107 100644
--- a/pkg/internal/services/recycler.go
+++ b/pkg/internal/services/recycler.go
@@ -3,6 +3,9 @@ package services
import (
"context"
"fmt"
+ "git.solsynth.dev/hydrogen/paperclip/pkg/internal/database"
+ "github.com/samber/lo"
+ "gorm.io/gorm/clause"
"os"
"path/filepath"
"time"
@@ -33,6 +36,45 @@ func StartConsumeDeletionTask() {
}
}
+func RunScheduleDeletionTask() {
+ var pools []models.AttachmentPool
+ if err := database.C.Find(&pools).Error; err != nil {
+ return
+ }
+
+ var pendingPools []models.AttachmentPool
+ for _, pool := range pendingPools {
+ if pool.Config.Data().ExistLifecycle != nil {
+ pendingPools = append(pendingPools, pool)
+ }
+ }
+
+ for _, pool := range pendingPools {
+ lifecycle := fmt.Sprintf("%d seconds", *pool.Config.Data().ExistLifecycle)
+ var attachments []models.Attachment
+ if err := database.C.Where("pool_id = ? AND created_at < NOW() - INTERVAL ?", pool.ID, lifecycle).Find(&attachments).Error; err != nil {
+ continue
+ }
+ log.Info().
+ Str("pool", pool.Alias).
+ Int("count", len(attachments)).
+ Msg("Deleting attachments due to pool's lifecycle configuration...")
+ for idx, attachment := range attachments {
+ if err := DeleteFile(attachment); err != nil {
+ log.Error().
+ Str("pool", pool.Alias).
+ Uint("id", attachment.ID).
+ Msg("An error occurred when deleting attachment due to pool's lifecycle configuration...")
+ } else {
+ attachments[idx].CleanedAt = lo.ToPtr(time.Now())
+ }
+ }
+ database.C.Clauses(clause.OnConflict{
+ UpdateAll: true,
+ }).CreateInBatches(attachments, 1000)
+ }
+}
+
func DeleteFile(meta models.Attachment) error {
var destMap map[string]any
if meta.Destination == models.AttachmentDstTemporary {
diff --git a/pkg/main.go b/pkg/main.go
index 8352c18..88247cf 100644
--- a/pkg/main.go
+++ b/pkg/main.go
@@ -59,6 +59,7 @@ func main() {
// Configure timed tasks
quartz := cron.New(cron.WithLogger(cron.VerbosePrintfLogger(&log.Logger)))
quartz.AddFunc("@every 60m", services.DoAutoDatabaseCleanup)
+ quartz.AddFunc("@midnight", services.RunScheduleDeletionTask)
quartz.Start()
// Server
@@ -73,6 +74,7 @@ func main() {
log.Info().Msgf("Paperclip v%s is started...", pkg.AppVersion)
services.ScanUnanalyzedFileFromDatabase()
+ services.RunScheduleDeletionTask()
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)