core: add more logs to pubsub and reload user-menu on user updates
nclazz/soundwerft/pipeline/head This commit looks good Details

master
Niclas Thobaben 2024-03-03 09:51:31 +01:00
parent 3ccb44f6df
commit 5b4dbdccb8
9 changed files with 58 additions and 10 deletions

View File

@ -4,6 +4,7 @@ import (
"fmt"
"git.l--n.de/nclazz/soundwerft/api/web"
"git.l--n.de/nclazz/soundwerft/internal/app"
"git.l--n.de/nclazz/soundwerft/internal/app/types"
"git.l--n.de/nclazz/soundwerft/pkg/pubsub"
"github.com/a-h/templ"
"github.com/labstack/echo/v4"
@ -59,14 +60,19 @@ func (h *Handler) View(c echo.Context) web.View {
return view
}
func (h *Handler) PublishEvent(event pubsub.Event) {
h.PubSub.Publish(event)
func (h *Handler) PublishEvent(c echo.Context, eventType string, data any) {
usr := h.User(c)
h.PubSub.Publish(pubsub.Event{
ID: types.GenerateId(),
TargetUser: usr.ID,
Type: eventType,
Data: data,
})
}
// HardRedirect triggers HTMX to fully redirect to a new location
func (h *Handler) HardRedirect(c echo.Context, to string) error {
c.Response().Header().Set("HX-Redirect", to)
//c.Response().Header().Set("HX-Refresh", "true")
c.Response().WriteHeader(http.StatusNoContent)
return nil
}

View File

@ -0,0 +1,13 @@
package user
import (
"git.l--n.de/nclazz/soundwerft/api/handler"
"git.l--n.de/nclazz/soundwerft/api/web/templates/partials"
"github.com/labstack/echo/v4"
)
func getUserMenu(h *handler.Handler) echo.HandlerFunc {
return func(c echo.Context) error {
return h.Render(c, partials.UserMenu(h.View(c)))
}
}

View File

@ -21,4 +21,7 @@ func Routes(h *handler.Handler) {
g.GET("", getRegisterPage(h))
g.GET("/", getRegisterPage(h))
g.POST("", postRegister(h))
g = h.Echo.Group("/partials")
g.GET("/user-menu", getUserMenu(h))
}

View File

@ -77,6 +77,7 @@ func putName(h *handler.Handler) echo.HandlerFunc {
return err
}
view.MsgSuccess = h.TranslateMessage(MsgUsernameSaved)
h.PublishEvent(c, "user_updated", "")
return h.Render(c, user.NameInputForm(h.View(c), view))
}
}
@ -103,12 +104,13 @@ func putEmail(h *handler.Handler) echo.HandlerFunc {
view.Err = "Failed to save"
return h.Render(c, user.EmailInputForm(h.View(c), view))
}
log.Warn("updated user email", "old", oldEmail, "new", newEmail)
log.Info("updated user email", "old", oldEmail, "new", newEmail)
usr.Email = newEmail
if err := h.SaveSession(c); err != nil {
return err
}
view.MsgSuccess = h.TranslateMessage(MsgEmailSaved)
h.PublishEvent(c, "user_updated", "")
return h.Render(c, user.EmailInputForm(h.View(c), view))
}
}
@ -151,7 +153,7 @@ func putPassword(h *handler.Handler) echo.HandlerFunc {
view.Err = h.TranslateMessage(MsgErrPasswordSave)
return h.Render(c, user.PasswordInputForm(h.View(c), view))
}
log.Warn("updated user password")
log.Info("updated user password")
view.MsgSuccess = h.TranslateMessage(MsgPasswordSaved)
return h.Render(c, user.PasswordInputForm(h.View(c), view))
}

View File

@ -24,7 +24,8 @@ templ ArtistPage(view web.View, artistView ArtistView, form CreateSketchbookForm
href={ view.URL("/sketch/new") }
hx-boost="true"
hx-select="#main"
hx-target="#main">
hx-target="#main"
hx-replace-url="false">
Create Sketch
</a>
</div>

View File

@ -84,7 +84,7 @@ templ Document(view web.View) {
<!DOCTYPE html>
<html lang="en">
@DocumentHead(view)
<body>
<body hx-ext="sse" sse-connect="/sse/events">
@DocumentHeader(view)
<main id="main">
{ children... }

View File

@ -11,14 +11,23 @@ css avatar() {
}
templ UserMenu(view web.View) {
<div class="nav-item dropdown">
<div class="nav-item dropdown"
hx-trigger="sse:user_updated"
hx-target="this"
hx-swap="outerHTML"
hx-get={view.URLString("/partials/user-menu")}>
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown"
aria-expanded="false">
<!-- TODO User Avatar Issue #4 -->
<img src={ view.URLString("/assets/img/default_user_avatar.png") } alt="Avatar" class={ avatar() }/>
</a>
<ul class="dropdown-menu dropdown-menu-end">
<li><h6 class="dropdown-header">{view.Username}</h6></li>
<li>
<h4 class="dropdown-header">
<p>{view.Username}</p>
<p>{view.Email}</p>
</h4>
</li>
<li class="dropdown-divider"></li>
<li>
<a href={ view.URL("/settings") }

View File

@ -1,6 +1,7 @@
"Artist.CreateSketchTitle" = "Create new sketch"
"Artist.CreateSketchbook" = "Create"
"Artist.CreateSketchbookTitle" = "Set up your Sketchbook"
"Artist.ErrCreateSketch" = "Failed to create sketch. Please check your input and try again"
"Artist.ErrCreateSketchbook" = "Failed to create sketchbook. Check your input and try again"
"Artist.SketchCreate" = "Create"
"Artist.SketchDescriptionLabel" = "Description"

View File

@ -7,6 +7,7 @@ import (
"git.l--n.de/nclazz/soundwerft/pkg/log"
"log/slog"
"strings"
"time"
)
type Event struct {
@ -90,6 +91,7 @@ func (s *server) Start(ctx context.Context) {
s.removeListener(listenerToRemove)
case event, ok := <-s.publisher:
if !ok {
slog.Warn("pubsub: published event not ok", "event", event)
return
}
s.broadcastEvent(ctx, event)
@ -99,7 +101,18 @@ func (s *server) Start(ctx context.Context) {
func (s *server) Publish(event Event) {
slog.Debug("pubsub: publish event", "event", event)
s.publisher <- event
go func() {
ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
defer cancel()
select {
case <-ctx.Done():
slog.Warn("pubsub: failed to publish event: timeout")
case s.publisher <- event:
slog.Debug("pubsub: event published to channel")
default:
}
}()
}
func (s *server) Subscribe(filter ...Filter) *Listener {