fix:分享

This commit is contained in:
2026-09-13 23:32:22 +08:00
parent 646fd99887
commit 77eec37af1
17 changed files with 903 additions and 28 deletions
+61 -7
View File
@@ -27,15 +27,21 @@ var imageProcessSem = make(chan struct{}, 10)
// ClothesService 衣物业务服务。
type ClothesService struct {
clothesDao *mysqldao.ClothesDao
userDao *mysqldao.UserDao
clothesDao *mysqldao.ClothesDao
userDao *mysqldao.UserDao
outfitShareDao *mysqldao.OutfitShareDao
outfitDao *mysqldao.OutfitDao
outfitItemDao *mysqldao.OutfitItemDao
}
// NewClothesService 创建衣物服务。
func NewClothesService() *ClothesService {
return &ClothesService{
clothesDao: mysqldao.NewClothesDao(),
userDao: mysqldao.NewUserDao(),
clothesDao: mysqldao.NewClothesDao(),
userDao: mysqldao.NewUserDao(),
outfitShareDao: mysqldao.NewOutfitShareDao(),
outfitDao: mysqldao.NewOutfitDao(),
outfitItemDao: mysqldao.NewOutfitItemDao(),
}
}
@@ -300,18 +306,66 @@ func (s *ClothesService) ProcessStatusGetByUUID(ctx context.Context, userID int6
}
// GetByUUID 获取衣物详情。
// 属主始终可见;非属主仅允许携带有效穿搭分享(share_uuid)时,只读查看该分享穿搭内的衣物。
func (s *ClothesService) GetByUUID(ctx context.Context, userID int64, request *dto.ClothesGetByUUIDRequest) (*dto.ClothesGetByUUIDResponse, *errcode.Error) {
ctx, span := global.Tracer.Start(ctx, "svc.ClothesGetByUUID")
defer span.End()
clothes, cerr := s.getOwnedClothes(ctx, request.ClothesUUID, userID)
if cerr != nil {
return nil, cerr
clothes, err := s.clothesDao.ClothesGetByUUID(ctx, request.ClothesUUID)
if err != nil {
if isNotFound(err) {
return nil, errcode.ClothesNotFound
}
return nil, errcode.DatabaseError
}
if clothes.UserID != userID {
if cerr := s.assertClothesVisibleViaOutfitShare(ctx, userID, request.ShareUUID, clothes.ID); cerr != nil {
return nil, cerr
}
}
response := buildClothesResponse(clothes)
return &response, nil
}
// assertClothesVisibleViaOutfitShare 校验非属主可通过某穿搭分享只读查看该衣物。
func (s *ClothesService) assertClothesVisibleViaOutfitShare(ctx context.Context, userID int64, shareUUID string, clothesID int64) *errcode.Error {
if shareUUID == "" {
return errcode.ClothesNoPermission
}
share, err := s.outfitShareDao.OutfitShareGetByUUID(ctx, shareUUID)
if err != nil {
if isNotFound(err) {
return errcode.OutfitShareNotFound
}
return errcode.DatabaseError
}
if share.Status == ShareStatusCancelled {
return errcode.OutfitShareCancelled
}
outfit, oerr := s.outfitDao.OutfitGetByID(ctx, share.OutfitID)
if oerr != nil {
if isNotFound(oerr) {
return errcode.OutfitShareNotFound
}
return errcode.DatabaseError
}
// 访客查看要求穿搭仍公开可见(属主访问自己的分享始终可查看)。
if share.UserID != userID && !isOutfitPublicVisible(outfit) {
return errcode.OutfitShareNotFound
}
// 该衣物必须属于该分享的穿搭明细。
items, ierr := s.outfitItemDao.OutfitItemListByOutfitID(ctx, outfit.ID)
if ierr != nil {
return errcode.DatabaseError
}
for _, it := range items {
if it.ClothesID == clothesID {
return nil
}
}
return errcode.ClothesNoPermission
}
// UpdateByUUID 修改衣物属性(仅更新非空字段)。
func (s *ClothesService) UpdateByUUID(ctx context.Context, userID int64, request *dto.ClothesUpdateByUUIDRequest) (*dto.ClothesUpdateByUUIDResponse, *errcode.Error) {
ctx, span := global.Tracer.Start(ctx, "svc.ClothesUpdateByUUID")