// 扫描整理的三个接口:开始扫描、查进度、实时进度(WebSocket)。 // 它们不干活,只负责"接话、转达",真正的活由 service 里的 ScanService 干。 package api import ( "net/http" "github.com/gin-gonic/gin" "kenaito-media-picker/internal/service" ) // ScanController 扫描相关接口的"窗口"。 type ScanController struct { service *service.ScanService // 背后干活的管家 } // NewScanController 创建扫描控制器,并注入干活的服务。 func NewScanController(svc *service.ScanService) *ScanController { return &ScanController{service: svc} } // scanStartReq 点击"开始扫描"时前端传过来的参数: // - dir:要扫描哪个目录(留空就扫程序当前所在目录) // - destDir:整理好的文件放哪(留空默认放扫描目录下的「KMP已整理」) type scanStartReq struct { Dir string `json:"dir"` DestDir string `json:"destDir"` } // Start 处理 POST /api/scan/start:触发一次扫描整理。 // 成功后立刻返回当前进度快照,好让页面马上进入"扫描中"状态。 func (c *ScanController) Start(ctx *gin.Context) { var req scanStartReq if err := ctx.ShouldBindJSON(&req); err != nil { Error(ctx, http.StatusBadRequest, "请求参数错误:"+err.Error()) return } if err := c.service.Start(req.Dir, req.DestDir); err != nil { Error(ctx, http.StatusBadRequest, err.Error()) return } Success(ctx, c.service.Status()) } // Status 处理 GET /api/scan/status:查询当前扫描状态与日志(轮询兜底用的)。 func (c *ScanController) Status(ctx *gin.Context) { Success(ctx, c.service.Status()) } // Cancel 处理 POST /api/scan/cancel:中止正在运行的扫描整理任务。 // 成功后立刻返回当前进度快照,好让页面马上知道任务在收尾。 func (c *ScanController) Cancel(ctx *gin.Context) { if err := c.service.Cancel(); err != nil { Error(ctx, http.StatusBadRequest, err.Error()) return } Success(ctx, c.service.Status()) }