storer/internal/workers/file_cleaner/worker.go

65 lines
1.3 KiB
Go
Raw Normal View History

package file_cleaner
import (
"context"
"errors"
"gitea.pena/SQuiz/storer/internal/models"
"gitea.pena/SQuiz/storer/internal/repository"
"github.com/go-redis/redis/v8"
"go.uber.org/zap"
"time"
)
type FileCleaner struct {
redisClient *redis.Client
repository *repository.S3
logger *zap.Logger
}
func NewFileCleanerWC(redisClient *redis.Client, repository *repository.S3, logger *zap.Logger) *FileCleaner {
return &FileCleaner{
redisClient: redisClient,
repository: repository,
logger: logger,
}
}
func (wc *FileCleaner) Start(ctx context.Context) {
ticker := time.NewTicker(2 * time.Minute)
defer ticker.Stop()
for {
select {
case <-ticker.C:
wc.processTask(ctx)
case <-ctx.Done():
return
}
}
}
func (wc *FileCleaner) processTask(ctx context.Context) {
for {
result, err := wc.redisClient.BLPop(ctx, 5*time.Second, models.RedisQueueS3DeleterKey).Result()
if err != nil {
if errors.Is(err, redis.Nil) {
wc.logger.Info("queue is nil return")
return
}
wc.logger.Info("error reading from queue")
return
}
if len(result) < 2 {
wc.logger.Info("result is broken len < 2")
}
url := result[1]
err = wc.repository.DeleteFileFromS3(ctx, url)
if err != nil {
wc.logger.Info("error deleting file from S3")
}
}
}