feat(video-share): 视频分享后端 - 密码保护/有效期/浏览下载计数 #737
Reference in New Issue
Block a user
Delete Branch "feat/video-share-backend"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
功能概述
视频分享功能后端实现,支持创建分享链接、密码保护、有效期设置、浏览/下载计数。
新增内容
video_shares表(id, video_id, user_id, share_token, password_hash, has_password, expires_at, view_count, download_count, is_active, created_at, updated_at)VideoShare实体,SHA-256加盐密码哈希,base32易读token生成(去除易混淆字符)POST /api/v1/videos/{video_id}/share- 创建分享GET /api/v1/videos/{video_id}/shares- 某视频分享列表GET /api/v1/shares- 用户所有分享(分页)PATCH /api/v1/shares/{share_id}- 更新分享配置DELETE /api/v1/shares/{share_id}- 撤销分享(软删除)GET /api/v1/share/{token}/meta- 分享元信息(公开)POST /api/v1/share/{token}/access- 访问分享内容(验证密码+返回视频信息+播放地址)POST /api/v1/share/{token}/download- 记录下载计数设计决策
🚀 预览环境已部署
代码审查结果 - PR #737
⚠️ 问题(3个需要修改)
packages/adapters/sqlalchemy_impl/video_share_repository.py 第 133-145 行:计数器更新存在并发安全问题。
increment_view和increment_download方法采用“读取-修改-写入”的模式(先查询模型,修改属性,再提交)。在高并发场景下,多个请求同时读取相同的计数值并分别加1写入,会导致计数丢失,统计数据不准确。session.query(VideoShareModel).filter(...).update({"view_count": VideoShareModel.view_count + 1}, synchronize_session=False),或者使用数据库层面的FOR UPDATE锁。packages/adapters/sqlalchemy_impl/video_share_repository.py 第 28, 64, 95, 109, 133, 145 行:Repository 层不应直接管理事务提交。
self.session.commit()。这违反了 Unit of Work 模式,导致事务边界破碎。如果业务层(Use Case)需要在一个事务中执行多个 Repository 操作(如创建分享并记录日志),一旦某个操作失败,无法回滚之前已提交的操作。commit()调用,仅进行flush()或add()。事务提交应由依赖注入的 Session 上下文管理器(通常在 FastAPI 的dependency中处理)统一控制。packages/adapters/sqlalchemy_impl/models.py 第 582 行:
share_token字段存在冗余索引。share_token字段同时设置了unique=True和index=True。在 SQLAlchemy 中,unique=True会自动创建一个唯一索引,显式添加index=True会创建第二个非唯一索引。这会浪费磁盘空间并降低写入性能。index=True,仅保留unique=True。💡 建议(2个可选)
apps/api/app/api/routes/share.py 第 233, 243, 258, 268 行:异常捕获过于宽泛且缺少日志。
except Exception,这会掩盖所有错误(包括网络中断、配置错误等),且静默失败可能导致前端显示错误的 URL。建议捕获具体的异常类型(如OSSServiceError),并记录warning级别日志以便排查问题。apps/api/app/api/routes/share.py 第 233-270 行:存在重复代码。
access_share函数中生成download_url和thumbnail_url的逻辑完全相同(try-except 块)。建议提取一个私有辅助函数_get_signed_url(storage, raw_url)来消除重复。✅ 格式检查通过 | ❌ 逻辑审查需修改 | ⚠️ 建议关注性能
🤖 由 AI 代码审查机器人自动生成 | 2026-07-22 23:10:58 | 模型:
CI全绿,approve
🗑️ 预览环境已清理
PR #737 已关闭或合并,对应的预览环境已被清理。