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
}