From 40d5e597f651b52e8e298c32701aa099dfdfdfaa Mon Sep 17 00:00:00 2001 From: zerosaturation Date: Wed, 8 Apr 2026 00:04:35 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=20ImageGeneration=20?= =?UTF-8?q?=E5=92=8C=20GetImageJob=20=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gateway/controller/asset_controller.go | 85 ++++++++++++++++++- 1 file changed, 83 insertions(+), 2 deletions(-) diff --git a/backend/gateway/controller/asset_controller.go b/backend/gateway/controller/asset_controller.go index 16de27c..a9661cd 100644 --- a/backend/gateway/controller/asset_controller.go +++ b/backend/gateway/controller/asset_controller.go @@ -31,11 +31,13 @@ import ( "go.uber.org/zap" "github.com/topfans/backend/pkg/logger" + "github.com/topfans/backend/services/assetService/service" ) // AssetController 资产相关控制器 type AssetController struct { - assetService pbAsset.AssetService + assetService pbAsset.AssetService + minimaxService service.MinimaxService } // NewAssetController 创建资产控制器 @@ -47,7 +49,8 @@ func NewAssetController(dubboClient *client.Client) (*AssetController, error) { } return &AssetController{ - assetService: assetService, + assetService: assetService, + minimaxService: service.NewMinimaxService(nil), }, nil } @@ -1407,3 +1410,81 @@ func (ctrl *AssetController) listOSSImageFiles( return files, nil } + +// ImageGeneration 创建图生图任务 +// @Summary 图生图 +// @Description 创建图生图任务 +// @Tags assets +// @Accept json +// @Produce json +// @Security BearerAuth +// @Param request body dto.ImageGenerationRequest true "图生图请求" +// @Success 202 {object} response.Response +// @Router /api/v1/assets/mints/image/generation [post] +func (ctrl *AssetController) ImageGeneration(c *gin.Context) { + var req dto.ImageGenerationRequest + if err := c.ShouldBindJSON(&req); err != nil { + response.Error(c, 400, "Invalid request: "+err.Error()) + return + } + + userID := c.GetInt64("userID") + starID := c.GetInt64("starID") + + job, err := ctrl.minimaxService.CreateJob(c.Request.Context(), userID, starID, &req) + if err != nil { + response.Error(c, 500, "Failed to create job: "+err.Error()) + return + } + + c.JSON(202, gin.H{"code": 202, "message": "ok", "data": &dto.ImageJobCreateResponse{ + JobID: job.JobID, + Status: string(job.Status), + CreatedAt: job.CreatedAt, + }}) +} + +// GetImageJob 查询图生图任务状态 +// @Summary 查询图生图任务 +// @Description 查询图生图任务状态和结果 +// @Tags assets +// @Produce json +// @Security BearerAuth +// @Param job_id path string true "任务ID" +// @Success 200 {object} response.Response +// @Router /api/v1/assets/mints/image/generation/{job_id} [get] +func (ctrl *AssetController) GetImageJob(c *gin.Context) { + jobID := c.Param("job_id") + if jobID == "" { + response.Error(c, 400, "job_id is required") + return + } + + userID := c.GetInt64("userID") + starID := c.GetInt64("starID") + + job, err := ctrl.minimaxService.GetJob(c.Request.Context(), jobID, userID, starID) + if err != nil { + if strings.Contains(err.Error(), "not found") { + response.Error(c, 404, "Job not found") + return + } + if strings.Contains(err.Error(), "access denied") { + response.Error(c, 403, "Access denied") + return + } + response.Error(c, 500, "Failed to get job: "+err.Error()) + return + } + + response.Success(c, &dto.ImageJobResponse{ + JobID: job.JobID, + Status: string(job.Status), + Progress: job.Progress, + Images: job.Images, + ErrorMsg: job.ErrorMsg, + CreatedAt: job.CreatedAt, + UpdatedAt: job.UpdatedAt, + CompletedAt: job.CompletedAt, + }) +}