From f48b128b65b28cca5b23282491af39febf40e2c5 Mon Sep 17 00:00:00 2001 From: keven1024 Date: Thu, 15 May 2025 23:19:00 +0800 Subject: [PATCH] fix(backend): adjust view count decrement logic in VaildateShare to prevent multiple decrements during concurrent downloads --- backend/internal/controllers/download.go | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/backend/internal/controllers/download.go b/backend/internal/controllers/download.go index 40bb466..64a4bfb 100644 --- a/backend/internal/controllers/download.go +++ b/backend/internal/controllers/download.go @@ -42,14 +42,8 @@ func DownloadShare(c echo.Context) error { if err != nil { return err } - models.SetRedisShareInfo(claims.ShareId, models.RedisShareInfo{ - ViewNum: shareInfo.ViewNum - 1, - }) return cc.Attachment(fmt.Sprintf("%s/%s", uploadPath, utils.GetFileId(fileInfo.FileHash, fileInfo.FileSize)), shareInfo.FileName) } - models.SetRedisShareInfo(claims.ShareId, models.RedisShareInfo{ - ViewNum: shareInfo.ViewNum - 1, - }) return utils.HTTPSuccessHandler(c, map[string]any{ "data": shareInfo.Data, }) @@ -105,6 +99,17 @@ func VaildateShare(c echo.Context) error { if fileInfo.FileType != models.FileTypeUpload { return utils.HTTPErrorHandler(c, errors.New("分享文件状态错误")) } + } + // download_nums 必须放在创建token的时候减掉,不然多线程下载会导致多次减掉 + latestViewNum := shareInfo.ViewNum - 1 + // 如果下载次数为0,则设置为-1 防止空值问题 + if latestViewNum < 1 { + latestViewNum = -1 + } + models.SetRedisShareInfo(r.ShareId, models.RedisShareInfo{ + ViewNum: latestViewNum, + }) + if shareInfo.Type == models.ShareTypeFile { return utils.HTTPSuccessHandler(c, map[string]any{ "token": downloadToken, })