This commit is contained in:
2026-09-15 16:02:45 +08:00
parent 112c5f8e46
commit ade2453083
70 changed files with 1441 additions and 707 deletions
+22 -6
View File
@@ -34,7 +34,9 @@ func NewOutfitShareService() *OutfitShareService {
}
}
// Create 创建穿搭分享。仅能分享本人且已公开的穿搭;不消耗额度。
// Create 创建穿搭分享。仅能分享本人的穿搭;分享与「公开到社区」解耦,
// 仅自己可见的穿搭同样可生成分享链接(好友凭 share_uuid 只读查看)。
// 额度:私密穿搭分享扣 1 次衣柜分享额度(与衣柜分享共用额度池),已公开穿搭分享不扣。
func (s *OutfitShareService) Create(ctx context.Context, userID int64, request *dto.OutfitShareCreateRequest) (*dto.OutfitShareCreateResponse, *errcode.Error) {
ctx, span := global.Tracer.Start(ctx, "svc.OutfitShareCreate")
defer span.End()
@@ -49,9 +51,18 @@ func (s *OutfitShareService) Create(ctx context.Context, userID int64, request *
if outfit.UserID != userID {
return nil, errcode.OutfitNoPermission
}
// 分享前提:穿搭已公开可见(否则对方打开后无法查看)。
if !isOutfitPublicVisible(outfit) {
return nil, errcode.InvalidParams.WithDetails("请先公开该穿搭再分享")
// 封禁穿搭不可分享;公开状态 / 审核状态不再作为前置条件(分享与公开到社区解耦)。
if outfit.Status == OutfitStatusBanned {
return nil, errcode.OutfitNoPermission
}
// 额度:仅「仅自己可见」的穿搭分享扣 1 次衣柜分享额度(与衣柜分享共用额度池);
// 已公开穿搭在「公开到社区」时已扣过社区分享额度,分享给好友不再重复扣。
charged := outfit.IsPublic == OutfitPrivate
if charged {
if qerr := consumeDailyQuota(ctx, userID, QuotaTypeClosetShare, 1, "私密穿搭分享消耗"); qerr != nil {
return nil, qerr
}
}
share := &mysqlmodel.OutfitShare{
@@ -61,6 +72,10 @@ func (s *OutfitShareService) Create(ctx context.Context, userID int64, request *
Status: ShareStatusNormal,
}
if err := s.shareDao.OutfitShareCreate(ctx, share); err != nil {
// 分享落库失败:回退刚扣的额度,避免用户额度被白扣。
if charged {
refundDailyQuota(ctx, userID, QuotaTypeClosetShare, 1)
}
return nil, errcode.DatabaseError
}
return &dto.OutfitShareCreateResponse{ShareUUID: share.ShareUUID}, nil
@@ -92,8 +107,9 @@ func (s *OutfitShareService) Detail(ctx context.Context, userID int64, shareUUID
}
isOwner := share.UserID == userID
// 访客视角:穿搭必须仍处于公开可见状态,否则分享失效
if !isOwner && !isOutfitPublicVisible(outfit) {
// 访客视角:分享正常即可只读查看(分享独立于公开状态,取消公开不影响已发出的分享);
// 仅当穿搭已删除(上方判为 90103)或已封禁时视为分享失效。
if !isOwner && outfit.Status == OutfitStatusBanned {
return nil, errcode.OutfitShareNotFound
}