package handlers import ( "net/http" "git.threesix.ai/jordan/sp4-v2-1770499323/pkg/app" "git.threesix.ai/jordan/sp4-v2-1770499323/pkg/httperror" "git.threesix.ai/jordan/sp4-v2-1770499323/pkg/httpresponse" "git.threesix.ai/jordan/sp4-v2-1770499323/pkg/logging" "git.threesix.ai/jordan/sp4-v2-1770499323/services/chat-svc/internal/port" ) // Task handles HTTP requests for enqueuing async tasks. type Task struct { producer port.TaskProducer logger *logging.Logger } // NewTask creates a new Task handler with injected dependencies. func NewTask(producer port.TaskProducer, logger *logging.Logger) *Task { return &Task{ producer: producer, logger: logger.WithComponent("TaskHandler"), } } // EnqueueRequest is the request body for enqueuing a task. type EnqueueRequest struct { Action string `json:"action" validate:"required"` Payload map[string]any `json:"payload"` } // EnqueueResponse is the response body for a successfully enqueued task. type EnqueueResponse struct { JobID string `json:"job_id"` } // Enqueue creates an async task for background processing. func (h *Task) Enqueue(w http.ResponseWriter, r *http.Request) error { var req EnqueueRequest if err := app.BindAndValidate(r, &req); err != nil { return err } jobID, err := h.producer.EnqueueTask(r.Context(), req.Action, req.Payload) if err != nil { h.logger.Error("failed to enqueue task", "action", req.Action, "error", err) return httperror.Internal("failed to enqueue task") } h.logger.Info("task enqueued", "job_id", jobID, "action", req.Action) httpresponse.Accepted(w, r, EnqueueResponse{JobID: jobID}) return nil }