97 lines
2.9 KiB
Go
97 lines
2.9 KiB
Go
package handlers
|
|
|
|
import (
|
|
"github.com/drama-generator/backend/application/services"
|
|
"github.com/drama-generator/backend/pkg/config"
|
|
"github.com/drama-generator/backend/pkg/logger"
|
|
"github.com/drama-generator/backend/pkg/response"
|
|
"github.com/gin-gonic/gin"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type StoryboardHandler struct {
|
|
storyboardService *services.StoryboardService
|
|
taskService *services.TaskService
|
|
log *logger.Logger
|
|
}
|
|
|
|
func NewStoryboardHandler(db *gorm.DB, cfg *config.Config, log *logger.Logger) *StoryboardHandler {
|
|
return &StoryboardHandler{
|
|
storyboardService: services.NewStoryboardService(db, log),
|
|
taskService: services.NewTaskService(db, log),
|
|
log: log,
|
|
}
|
|
}
|
|
|
|
// GenerateStoryboard 生成分镜头(异步)
|
|
func (h *StoryboardHandler) GenerateStoryboard(c *gin.Context) {
|
|
episodeID := c.Param("episode_id")
|
|
|
|
// 创建异步任务
|
|
task, err := h.taskService.CreateTask("storyboard_generation", episodeID)
|
|
if err != nil {
|
|
h.log.Errorw("Failed to create task", "error", err)
|
|
response.InternalError(c, err.Error())
|
|
return
|
|
}
|
|
|
|
// 启动后台goroutine处理
|
|
go h.processStoryboardGeneration(task.ID, episodeID)
|
|
|
|
// 立即返回任务ID
|
|
response.Success(c, gin.H{
|
|
"task_id": task.ID,
|
|
"status": "pending",
|
|
"message": "分镜生成任务已创建,正在后台处理...",
|
|
})
|
|
}
|
|
|
|
// processStoryboardGeneration 后台处理分镜生成
|
|
func (h *StoryboardHandler) processStoryboardGeneration(taskID, episodeID string) {
|
|
h.log.Infow("Starting storyboard generation", "task_id", taskID, "episode_id", episodeID)
|
|
|
|
// 更新任务状态为处理中
|
|
if err := h.taskService.UpdateTaskStatus(taskID, "processing", 10, "开始生成分镜..."); err != nil {
|
|
h.log.Errorw("Failed to update task status", "error", err)
|
|
}
|
|
|
|
// 调用实际的生成逻辑
|
|
result, err := h.storyboardService.GenerateStoryboard(episodeID)
|
|
if err != nil {
|
|
h.log.Errorw("Failed to generate storyboard", "error", err, "task_id", taskID)
|
|
if updateErr := h.taskService.UpdateTaskError(taskID, err); updateErr != nil {
|
|
h.log.Errorw("Failed to update task error", "error", updateErr)
|
|
}
|
|
return
|
|
}
|
|
|
|
// 更新任务结果
|
|
if err := h.taskService.UpdateTaskResult(taskID, result); err != nil {
|
|
h.log.Errorw("Failed to update task result", "error", err)
|
|
return
|
|
}
|
|
|
|
h.log.Infow("Storyboard generation completed", "task_id", taskID, "total", result.Total)
|
|
}
|
|
|
|
// UpdateStoryboard 更新分镜
|
|
func (h *StoryboardHandler) UpdateStoryboard(c *gin.Context) {
|
|
storyboardID := c.Param("id")
|
|
|
|
var req map[string]interface{}
|
|
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
response.BadRequest(c, "Invalid request body")
|
|
return
|
|
}
|
|
|
|
err := h.storyboardService.UpdateStoryboard(storyboardID, req)
|
|
if err != nil {
|
|
h.log.Errorw("Failed to update storyboard", "error", err)
|
|
response.InternalError(c, err.Error())
|
|
return
|
|
}
|
|
|
|
response.Success(c, gin.H{"message": "Storyboard updated successfully"})
|
|
}
|