topfans/backend/gateway/controller/compositor_controller.go
Lenticular Studio Agent 67cf3d4177 chore: 清理 laserCompositor 微服务残留
- 删除已弃用的 compositor_client.go
- 删除激光合成微服务代码
- 添加 gateway 合成控制器和测试文件
- 添加 Dify prompt 补丁脚本

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-23 22:44:03 +08:00

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