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, }) }