Files

71 lines
2.4 KiB
Go

// 扫描整理的三个接口:开始扫描、查进度、实时进度(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())
}
// Move 处理 POST /api/scan/move:触发文件移动操作。
// 根据扫描时记录的分类结果,将文件从源路径移动到目标目录。
// 只有在扫描完成后才能调用。
func (c *ScanController) Move(ctx *gin.Context) {
if err := c.service.Move(); err != nil {
Error(ctx, http.StatusBadRequest, err.Error())
return
}
Success(ctx, c.service.Status())
}