diff --git a/handlers/account.go b/handlers/account.go index 36c180f..08ed745 100644 --- a/handlers/account.go +++ b/handlers/account.go @@ -1,9 +1,15 @@ package handlers import ( + "database/sql" "net/http" + + "projectreshoot/contexts" + "projectreshoot/db" "projectreshoot/view/component/account" "projectreshoot/view/page" + + "github.com/rs/zerolog" ) func HandleAccountPage() http.Handler { @@ -19,7 +25,38 @@ func HandleAccountSubpage() http.Handler { func(w http.ResponseWriter, r *http.Request) { r.ParseForm() subpage := r.FormValue("subpage") - account.AccountContent(subpage).Render(r.Context(), w) + account.AccountContainer(subpage).Render(r.Context(), w) + }, + ) +} + +func HandleChangeUsername( + logger *zerolog.Logger, + conn *sql.DB, +) http.Handler { + return http.HandlerFunc( + func(w http.ResponseWriter, r *http.Request) { + r.ParseForm() + newUsername := r.FormValue("username") + + unique, err := db.CheckUsernameUnique(conn, newUsername) + if err != nil { + logger.Error().Err(err).Msg("Error updating username") + w.WriteHeader(http.StatusInternalServerError) + return + } + if !unique { + account.ChangeUsername("Usename is taken", newUsername).Render(r.Context(), w) + return + } + user := contexts.GetUser(r.Context()) + err = user.ChangeUsername(conn, newUsername) + if err != nil { + logger.Error().Err(err).Msg("Error updating username") + w.WriteHeader(http.StatusInternalServerError) + return + } + w.Header().Set("HX-Redirect", "/account") }, ) } diff --git a/server/routes.go b/server/routes.go index fc54841..2bada29 100644 --- a/server/routes.go +++ b/server/routes.go @@ -75,4 +75,8 @@ func addRoutes( middleware.RequiresLogin( handlers.HandleAccountSubpage(), )) + mux.Handle("POST /change-username", + middleware.RequiresLogin( + handlers.HandleChangeUsername(logger, conn), + )) } diff --git a/view/component/account/changeusername.templ b/view/component/account/changeusername.templ new file mode 100644 index 0000000..d70a2f3 --- /dev/null +++ b/view/component/account/changeusername.templ @@ -0,0 +1,94 @@ +package account + +import "projectreshoot/contexts" + +templ ChangeUsername(err string, username string) { + {{ + user := contexts.GetUser(ctx) + if username == "" { + username = user.Username + } + }} +
+} diff --git a/view/component/account/container.templ b/view/component/account/container.templ new file mode 100644 index 0000000..37b4a0a --- /dev/null +++ b/view/component/account/container.templ @@ -0,0 +1,24 @@ +package account + +templ AccountContainer(subpage string) { +