- 删除已弃用的 compositor_client.go - 删除激光合成微服务代码 - 添加 gateway 合成控制器和测试文件 - 添加 Dify prompt 补丁脚本 Co-Authored-By: Claude <noreply@anthropic.com>
84 lines
2.4 KiB
Go
84 lines
2.4 KiB
Go
package controller
|
|
|
|
import (
|
|
"bytes"
|
|
"time"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"go.uber.org/zap"
|
|
|
|
"github.com/topfans/backend/gateway/pkg/response"
|
|
"github.com/topfans/backend/gateway/service"
|
|
"github.com/topfans/backend/gateway/service/compositor"
|
|
"github.com/topfans/backend/pkg/logger"
|
|
)
|
|
|
|
// ComposeController 镭射卡合成控制器(替代旧的 laser-compositor 微服务)
|
|
type ComposeController struct {
|
|
oss *service.OssHelper
|
|
}
|
|
|
|
// NewComposeController 创建合成控制器
|
|
func NewComposeController(oss *service.OssHelper) *ComposeController {
|
|
return &ComposeController{oss: oss}
|
|
}
|
|
|
|
// ComposeSingle POST /api/v1/laser/compose —— 合成单张镭射卡
|
|
// 与原 laser-compositor 微服务 /compose 端点接口兼容,供 Dify 工作流调用
|
|
func (ctrl *ComposeController) ComposeSingle(c *gin.Context) {
|
|
var req compositor.ComposeRequest
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
response.BadRequest(c, "请求参数错误: "+err.Error())
|
|
return
|
|
}
|
|
|
|
logger.Logger.Info("ComposeSingle started",
|
|
zap.Int("variant_index", req.VariantIndex),
|
|
zap.Float64("sheen_angle", req.GratingConfig.SheenBandAngle),
|
|
)
|
|
|
|
start := time.Now()
|
|
|
|
// 执行合成
|
|
pngData, err := compositor.Compose(req)
|
|
if err != nil {
|
|
logger.Logger.Error("Compose failed", zap.Error(err))
|
|
response.InternalError(c, "合成失败: "+err.Error())
|
|
return
|
|
}
|
|
|
|
// 上传 OSS
|
|
ossKey := "laser-card/compose/" + time.Now().Format("2006/01/02") + "/" + req.GratingConfig.BackdropTone + ".png"
|
|
if err := ctrl.oss.PutObject(ossKey, bytes.NewReader(pngData), "image/png"); err != nil {
|
|
logger.Logger.Warn("Compose OSS upload failed", zap.Error(err))
|
|
response.Success(c, gin.H{
|
|
"status": "partial",
|
|
"variant_index": req.VariantIndex,
|
|
"width": req.CanvasW(),
|
|
"height": req.CanvasH(),
|
|
"warning": "OSS upload failed: " + err.Error(),
|
|
})
|
|
return
|
|
}
|
|
|
|
signedURL, err := ctrl.oss.SignGetURL(ossKey, 3600)
|
|
if err != nil {
|
|
logger.Logger.Warn("Compose sign URL failed", zap.Error(err))
|
|
}
|
|
|
|
elapsed := time.Since(start)
|
|
logger.Logger.Info("ComposeSingle done",
|
|
zap.Int("variant_index", req.VariantIndex),
|
|
zap.Duration("elapsed", elapsed),
|
|
)
|
|
|
|
response.Success(c, gin.H{
|
|
"status": "succeeded",
|
|
"variant_index": req.VariantIndex,
|
|
"width": req.CanvasW(),
|
|
"height": req.CanvasH(),
|
|
"oss_key": ossKey,
|
|
"signed_url": signedURL,
|
|
})
|
|
}
|