feat(backend): implement Redis file share relational management for enhanced file sharing functionality

This commit is contained in:
keven1024
2025-05-25 23:41:37 +08:00
parent c5ee629053
commit c355c8f500
2 changed files with 51 additions and 0 deletions

View File

@@ -4,9 +4,11 @@ import (
"backend/internal/models"
"backend/internal/utils"
"backend/middleware"
"encoding/json"
"errors"
"time"
"github.com/hibiken/asynq"
"github.com/labstack/echo/v4"
gonanoid "github.com/matoous/go-nanoid/v2"
)
@@ -74,6 +76,24 @@ func CreateShareInfo(c echo.Context) error {
ExpireAt: ExpireTime.Unix(),
})
if r.Type == models.ShareTypeFile {
shareIDs, err := models.GetRedisFileShareRelational(r.Data)
if err != nil {
return utils.HTTPErrorHandler(c, err)
}
shareIDs = append(shareIDs, id)
models.SetRedisFileShareRelational(r.Data, shareIDs)
client := utils.GetQueueClient()
json, err := json.Marshal(map[string]any{"share_id": id, "file_id": r.Data})
if err != nil {
return utils.HTTPErrorHandler(c, err)
}
_, err = client.Enqueue(asynq.NewTask("share:remove", json), asynq.ProcessIn(time.Duration(r.Config.ExpireAt)*time.Minute))
if err != nil {
return utils.HTTPErrorHandler(c, err)
}
}
return utils.HTTPSuccessHandler(c, map[string]any{
"id": id,
"file_name": r.FileName,

View File

@@ -0,0 +1,31 @@
package models
import (
"backend/internal/utils"
"encoding/json"
"github.com/redis/go-redis/v9"
)
func GetRedisFileShareRelational(fileId string) ([]string, error) {
rdb, ctx := utils.GetRedisClient()
fileShareRelationalUnmarshalData, err := rdb.HGet(ctx, "015:fileShareRelational", fileId).Result()
if err == redis.Nil {
return nil, nil
}
if err != nil {
return nil, err
}
var shareIDs []string
if err := json.Unmarshal([]byte(fileShareRelationalUnmarshalData), &shareIDs); err != nil {
return nil, err
}
return shareIDs, nil
}
func SetRedisFileShareRelational(fileId string, shareIDs []string) error {
rdb, ctx := utils.GetRedisClient()
jsonData, _ := json.Marshal(shareIDs)
_, err := rdb.HSet(ctx, "015:fileShareRelational", fileId, string(jsonData)).Result()
return err
}