mirror of
https://github.com/keven1024/015.git
synced 2026-05-26 07:08:02 +00:00
105 lines
2.5 KiB
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...))
|
|
}
|