diff --git a/pkg/web/handler/task.go b/pkg/web/handler/task.go new file mode 100644 index 0000000..da31308 --- /dev/null +++ b/pkg/web/handler/task.go @@ -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("
Task completed successfully!
") + } else { + hx.WriteString("
" + taskFeedback.Message + "
") + } + return + } + + w.Header().Set("Content-Type", "application/json") + hx.WriteJSON(taskFeedback) +} diff --git a/pkg/web/server/routes.go b/pkg/web/server/routes.go index 5c81c61..4420f75 100644 --- a/pkg/web/server/routes.go +++ b/pkg/web/server/routes.go @@ -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) diff --git a/pkg/web/web.go b/pkg/web/web.go index 8c85f36..f9ad4b3 100644 --- a/pkg/web/web.go +++ b/pkg/web/web.go @@ -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 }