fix: validate creator assets by tenant

This commit is contained in:
2026-01-09 16:38:56 +08:00
parent ad9dc4615f
commit 6eb3272b86

View File

@@ -261,6 +261,11 @@ func (s *creator) CreateContent(ctx context.Context, tenantID, userID int64, for
if form.Status != "" {
status = consts.ContentStatus(form.Status)
}
// 校验素材归属,避免跨租户引用。
if err := s.validateContentAssets(ctx, tx, tid, uid, form.CoverIDs, form.MediaIDs); err != nil {
return err
}
// 1. Create Content
content := &models.Content{
TenantID: tid,
@@ -415,6 +420,10 @@ func (s *creator) UpdateContent(
}
// 4. Update Assets (Full replacement strategy)
if err := s.validateContentAssets(ctx, tx, tid, uid, form.CoverIDs, form.MediaIDs); err != nil {
return err
}
_, err = tx.ContentAsset.WithContext(ctx).Where(tx.ContentAsset.ContentID.Eq(id)).Delete()
if err != nil {
return err
@@ -1005,3 +1014,52 @@ func (s *creator) getTenantID(ctx context.Context, tenantID, userID int64) (int6
}
return t.ID, nil
}
func (s *creator) validateContentAssets(
ctx context.Context,
tx *models.Query,
tenantID int64,
userID int64,
coverIDs []int64,
mediaIDs []int64,
) error {
if len(coverIDs) == 0 && len(mediaIDs) == 0 {
return nil
}
ids := make(map[int64]struct{}, len(coverIDs)+len(mediaIDs))
for _, id := range coverIDs {
ids[id] = struct{}{}
}
for _, id := range mediaIDs {
ids[id] = struct{}{}
}
if len(ids) == 0 {
return nil
}
assetIDs := make([]int64, 0, len(ids))
for id := range ids {
assetIDs = append(assetIDs, id)
}
list, err := tx.MediaAsset.WithContext(ctx).Where(tx.MediaAsset.ID.In(assetIDs...)).Find()
if err != nil {
return errorx.ErrDatabaseError.WithCause(err)
}
if len(list) != len(assetIDs) {
return errorx.ErrRecordNotFound.WithMsg("素材不存在")
}
for _, asset := range list {
if asset.TenantID == tenantID {
continue
}
if asset.TenantID == 0 && asset.UserID == userID {
continue
}
return errorx.ErrForbidden.WithMsg("素材不属于当前租户")
}
return nil
}