diff --git a/backend/internal/controllers/share.go b/backend/internal/controllers/share.go index 0e45fec..3998ae8 100644 --- a/backend/internal/controllers/share.go +++ b/backend/internal/controllers/share.go @@ -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, diff --git a/backend/internal/models/file_share_relational.go b/backend/internal/models/file_share_relational.go new file mode 100644 index 0000000..53c7b02 --- /dev/null +++ b/backend/internal/models/file_share_relational.go @@ -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 +}