homelabby/internal/api/handlers/research.go
Mikkel Georgsen 0072aa41bd feat(07-01): ResearchAgent worker, trigger endpoint, main.go wiring
- internal/research/agent.go: Agent with RunOnce+Start, sanitizeQuery, interface adapters
- internal/research/agent_test.go: stub-based unit tests (sanitize, enrich, skip, empty)
- internal/ai/client.go: TierClient.TextComplete for text-only LLM calls
- internal/api/handlers/research.go: POST /api/research/trigger handler (202 Accepted)
- internal/api/router.go: researchHandler param + /api/research/trigger route
- cmd/hwlab/main.go: research agent goroutine started with 10min interval
2026-04-10 07:51:13 +00:00

30 lines
867 B
Go

package handlers
import (
"context"
"encoding/json"
"net/http"
"git.georgsen.dk/hwlab/internal/research"
)
// ResearchHandler handles research-related API endpoints.
type ResearchHandler struct {
agent *research.Agent
}
// NewResearchHandler creates a ResearchHandler backed by the given Agent.
func NewResearchHandler(agent *research.Agent) *ResearchHandler {
return &ResearchHandler{agent: agent}
}
// TriggerResearch handles POST /api/research/trigger.
// It fires a RunOnce cycle in a background goroutine and responds 202 Accepted immediately.
func (h *ResearchHandler) TriggerResearch(w http.ResponseWriter, r *http.Request) {
go func() {
_, _ = h.agent.RunOnce(context.Background())
}()
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusAccepted)
json.NewEncoder(w).Encode(map[string]string{"status": "accepted"})
}