Files
015/worker/internal/tasks/share.go

105 lines
2.5 KiB
Go

package tasks
import (
"context"
"encoding/json"
"errors"
"fmt"
"os"
"path/filepath"
"pkg/geoip"
"pkg/models"
u "pkg/utils"
"worker/internal/services"
"github.com/hibiken/asynq"
"github.com/samber/lo"
)
type ShareRemoveTaskPayload struct {
ShareId string `json:"share_id"`
FileId string `json:"file_id"`
}
func RemoveShare(ctx context.Context, task *asynq.Task) error {
var payload ShareRemoveTaskPayload
if err := json.Unmarshal(task.Payload(), &payload); err != nil {
return err
}
shareIDs, err := models.GetRedisFileShareRelational(payload.FileId)
if err != nil {
return err
}
shareIDs = lo.Filter(shareIDs, func(x string, _ int) bool {
return x != payload.ShareId
})
if len(shareIDs) == 0 {
rdb, ctx := u.GetRedisClient()
uploadPath, err := u.GetUploadDirPath()
if err != nil {
return err
}
filePath := filepath.Join(uploadPath, payload.FileId)
if err := rdb.Do(ctx, rdb.B().Hdel().Key("015:fileShareRelational").Field(payload.FileId).Build()).Error(); err != nil {
return err
}
if err := rdb.Do(ctx, rdb.B().Hdel().Key("015:fileInfoMap").Field(payload.FileId).Build()).Error(); err != nil {
return err
}
if err := os.RemoveAll(filePath); err != nil {
return err
}
return nil
}
if err := models.SetRedisFileShareRelational(payload.FileId, shareIDs); err != nil {
return err
}
return nil
}
func ShareNotify(ctx context.Context, task *asynq.Task) error {
var payload ShareNotifyTaskPayload
if err := json.Unmarshal(task.Payload(), &payload); err != nil {
return err
}
shareInfo, err := models.GetRedisShareInfo(payload.ShareId)
if err != nil || shareInfo == nil {
return err
}
var errs []error
successCount := 0
for _, webhook := range shareInfo.NotifyWebhooks {
if err := services.SendWebhook(webhook); err != nil {
errs = append(errs, err)
continue
}
successCount++
}
region := "-"
if info := geoip.GetIpGeoInfo(payload.IP); info != nil {
region = info.Emoji + " " + info.Country.Country.Names.English
}
for _, email := range shareInfo.NotifyEmails {
if err := services.SendEmail(email, services.EmailTemplateData{
Locale: shareInfo.Locale,
FileName: lo.Ternary(shareInfo.Type == models.ShareTypeFile, shareInfo.FileName, lo.Substring(shareInfo.Data, 0, 7)+"..."),
IP: payload.IP,
Region: region,
ShareType: shareInfo.Type,
}); err != nil {
errs = append(errs, err)
continue
}
successCount++
}
if successCount > 0 || len(errs) == 0 {
return nil
}
return fmt.Errorf("all share notify targets failed: %w", errors.Join(errs...))
}