50 lines
996 B
Go
50 lines
996 B
Go
package handlers
|
|
|
|
import (
|
|
"net/http"
|
|
"time"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
"qr-scanner/services"
|
|
)
|
|
|
|
type CancelHandler struct {
|
|
store *services.TaskStore
|
|
}
|
|
|
|
func NewCancelHandler(store *services.TaskStore) *CancelHandler {
|
|
return &CancelHandler{store: store}
|
|
}
|
|
|
|
func (h *CancelHandler) Cancel(c *gin.Context) {
|
|
taskID := c.Param("taskID")
|
|
task, ok := h.store.Get(taskID)
|
|
if !ok {
|
|
fail(c, http.StatusNotFound, "任务不存在")
|
|
return
|
|
}
|
|
if task.Status == services.TaskExpired {
|
|
fail(c, http.StatusGone, "任务已过期")
|
|
return
|
|
}
|
|
|
|
if task.Status == services.TaskProcessing {
|
|
task.Cancel()
|
|
respondOK(c, gin.H{"taskID": task.ID, "status": task.Status})
|
|
return
|
|
}
|
|
|
|
if task.Status == services.TaskUploaded {
|
|
task.Status = services.TaskCanceled
|
|
task.EndedAt = time.Now()
|
|
task.UpdatedAt = time.Now()
|
|
if task.Progress != nil {
|
|
task.Progress.Complete(string(task.Status))
|
|
}
|
|
h.store.Put(task)
|
|
}
|
|
|
|
respondOK(c, gin.H{"taskID": task.ID, "status": task.Status})
|
|
}
|