Files
015/backend/internal/controllers/task.go

82 lines
2.0 KiB
Go

package controllers
import (
"backend/internal/controllers/task"
"backend/internal/utils"
"pkg/models"
u "pkg/utils"
"github.com/hibiken/asynq"
"github.com/labstack/echo/v5"
)
var handleTaskMap = map[string]func(c *echo.Context) ([]byte, error){
"image:compress": task.HandleImageCompress,
"image:convert": task.HandleImageConvert,
"text:translate": task.HandleTextTranslate,
}
func CreateTask(c *echo.Context) error {
taskType := c.Param("type")
if taskType == "" {
return utils.HTTPErrorHandler(c, ErrInvalidRequest)
}
handleTask, ok := handleTaskMap[taskType]
if !ok {
return utils.HTTPErrorHandler(c, ErrTaskNotFound)
}
json, err := handleTask(c)
if err != nil {
return utils.HTTPErrorHandler(c, err)
}
client := u.GetQueueClient()
info, err := client.Enqueue(asynq.NewTask(taskType, json), asynq.MaxRetry(3))
if err != nil {
return utils.HTTPErrorHandler(c, err)
}
return utils.HTTPSuccessHandler(c, map[string]any{
"id": info.ID,
})
}
func GetTask(c *echo.Context) error {
taskId := c.Param("id")
if taskId == "" {
return utils.HTTPErrorHandler(c, ErrInvalidRequest)
}
taskInfo, err := models.GetRedisTaskInfo(taskId)
if err != nil {
return utils.HTTPErrorHandler(c, err)
}
if taskInfo == nil {
client := u.GetQueueInspector()
queneTaskInfo, err := client.GetTaskInfo("default", taskId)
if err != nil {
return utils.HTTPErrorHandler(c, ErrTaskExpired)
}
stateMap := map[asynq.TaskState]string{
asynq.TaskStateActive: "processing",
asynq.TaskStatePending: "pending",
asynq.TaskStateScheduled: "scheduled",
asynq.TaskStateRetry: "retry",
asynq.TaskStateArchived: "archived",
asynq.TaskStateCompleted: "completed",
}
if queneTaskInfo != nil {
return utils.HTTPSuccessHandler(c, map[string]any{
"status": stateMap[queneTaskInfo.State],
"err": map[string]any{
"message": queneTaskInfo.LastErr,
"retry": queneTaskInfo.Retried,
"max_retry": queneTaskInfo.MaxRetry,
},
})
}
}
return utils.HTTPSuccessHandler(c, *taskInfo)
}