55 lines
1.6 KiB
Go
55 lines
1.6 KiB
Go
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
|
|
}
|