sp4-v2-1770499323/services/chat-svc/internal/api/handlers/task.go
rdev-worker 34f37a44b8
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
build: /implement-feature mesh-interop --requirements 'Chat Service must cal...
2026-02-07 21:49:45 +00:00

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
}