add task feedback to web

add task-status endpoint
This commit is contained in:
Robin Olsen
2026-02-17 13:07:04 +01:00
parent 6964e14b69
commit 6ffcb5eb54
3 changed files with 68 additions and 5 deletions

29
pkg/web/handler/task.go Normal file
View File

@@ -0,0 +1,29 @@
package handler
import (
"net/http"
"github.com/LazyBachelor/LazyPM/pkg/task"
)
var taskFeedback task.ValidationFeedback
func SetTaskFeedback(feedback task.ValidationFeedback) {
taskFeedback = feedback
}
func HandleTaskStatus(w http.ResponseWriter, r *http.Request) {
hx := HTMX(r)
if hx.IsHxRequest() {
if taskFeedback.Success {
hx.WriteString("<div>Task completed successfully!</div>")
} else {
hx.WriteString("<div>" + taskFeedback.Message + "</div>")
}
return
}
w.Header().Set("Content-Type", "application/json")
hx.WriteJSON(taskFeedback)
}

View File

@@ -27,6 +27,7 @@ func (s *Server) RegisterRoutes(assets embed.FS) http.Handler {
s.handleAssets(r, assets)
r.Get("/", handler.IndexHandler)
r.Get("/task-status", handler.HandleTaskStatus)
r.Route("/issues", func(r chi.Router) {
r.Get("/", handler.ListIssues)

View File

@@ -4,14 +4,21 @@ import (
"context"
"embed"
"fmt"
"net/http"
"time"
"github.com/LazyBachelor/LazyPM/internal/service"
"github.com/LazyBachelor/LazyPM/pkg/task"
"github.com/LazyBachelor/LazyPM/pkg/web/handler"
"github.com/LazyBachelor/LazyPM/pkg/web/server"
)
type WebConfig = service.Config
type Web struct{}
type Web struct {
feedbackChan chan task.ValidationFeedback
quitChan chan bool
}
func NewWeb() *Web {
return &Web{}
@@ -28,7 +35,7 @@ func (w *Web) Run(ctx context.Context, config WebConfig) error {
defer cleanup()
server := server.NewServer(server.Server{
httpServer := server.NewServer(server.Server{
Address: config.WebAddress,
Assets: assets,
Services: svc,
@@ -36,9 +43,35 @@ func (w *Web) Run(ctx context.Context, config WebConfig) error {
fmt.Printf("Starting web server on %s...\n", config.WebAddress)
if err := server.ListenAndServe(); err != nil {
return err
serverErr := make(chan error, 1)
go func() {
if err := httpServer.ListenAndServe(); err != nil && err != http.ErrServerClosed {
serverErr <- err
}
}()
if w.feedbackChan != nil {
go func() {
for feedback := range w.feedbackChan {
handler.SetTaskFeedback(feedback)
}
}()
}
return nil
select {
case <-w.quitChan:
fmt.Println("Task completed! Shutting down server...")
shutdownCtx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
return httpServer.Shutdown(shutdownCtx)
case err := <-serverErr:
return err
case <-ctx.Done():
return httpServer.Shutdown(context.Background())
}
}
func (w *Web) SetChannels(feedbackChan chan task.ValidationFeedback, quitChan chan bool) {
w.feedbackChan = feedbackChan
w.quitChan = quitChan
}