feat: 添加媒体资产变体和来源ID字段,支持预览产品与主资产的关联

This commit is contained in:
2025-12-22 17:56:08 +08:00
parent 335a546aab
commit ad82de3939
10 changed files with 222 additions and 1 deletions

View File

@@ -31,6 +31,11 @@ import (
// @provider
type mediaAsset struct{}
const (
mediaAssetVariantMain = "main"
mediaAssetVariantPreview = "preview"
)
func mediaAssetTransitionAllowed(from, to consts.MediaAssetStatus) bool {
switch from {
case consts.MediaAssetStatusUploaded:
@@ -77,6 +82,50 @@ func (s *mediaAsset) AdminUploadInit(ctx context.Context, tenantID, operatorUser
return nil, errorx.ErrInvalidParameter.WithMsg("invalid type")
}
variant := strings.TrimSpace(strings.ToLower(form.Variant))
if variant == "" {
variant = mediaAssetVariantMain
}
if variant != mediaAssetVariantMain && variant != mediaAssetVariantPreview {
return nil, errorx.ErrInvalidParameter.WithMsg("invalid variant")
}
var sourceAssetID int64
if form.SourceAssetID != nil {
sourceAssetID = *form.SourceAssetID
}
if variant == mediaAssetVariantMain {
if sourceAssetID != 0 {
return nil, errorx.ErrInvalidParameter.WithMsg("source_asset_id is only allowed for preview variant")
}
} else {
// preview variant: requires a source main asset for traceability.
if sourceAssetID <= 0 {
return nil, errorx.ErrInvalidParameter.WithMsg("source_asset_id is required for preview variant")
}
// 校验来源资源存在、同租户、未删除、且为 main 产物。
var srcRow struct {
Variant string `gorm:"column:variant"`
}
if err := _db.WithContext(ctx).
Table(models.TableNameMediaAsset).
Select("variant").
Where("tenant_id = ? AND id = ? AND deleted_at IS NULL", tenantID, sourceAssetID).
Take(&srcRow).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, errorx.ErrRecordNotFound.WithMsg("source media asset not found")
}
return nil, err
}
srcVariant := srcRow.Variant
if srcVariant == "" {
srcVariant = mediaAssetVariantMain
}
if srcVariant != mediaAssetVariantMain {
return nil, errorx.ErrPreconditionFailed.WithMsg("source asset must be main variant")
}
}
objectKey, err := newObjectKey(tenantID, operatorUserID, typ, now)
if err != nil {
return nil, pkgerrors.Wrap(err, "generate object_key failed")
@@ -113,11 +162,27 @@ func (s *mediaAsset) AdminUploadInit(ctx context.Context, tenantID, operatorUser
return nil, pkgerrors.Wrap(err, "create media asset failed")
}
// variant/source_asset_id 目前为 DB 新增字段;由于 models 为 gen 产物,这里用 SQL 更新列值。
updates := map[string]any{
"variant": variant,
}
if sourceAssetID > 0 {
updates["source_asset_id"] = sourceAssetID
}
if err := _db.WithContext(ctx).
Model(&models.MediaAsset{}).
Where("id = ? AND tenant_id = ?", m.ID, tenantID).
Updates(updates).Error; err != nil {
return nil, pkgerrors.Wrap(err, "update media asset variant/source_asset_id failed")
}
logrus.WithFields(logrus.Fields{
"tenant_id": tenantID,
"user_id": operatorUserID,
"asset_id": m.ID,
"type": typ,
"variant": variant,
"source_id": sourceAssetID,
"object_key": objectKey,
}).Info("services.media_asset.admin.upload_init")