Release v0.20: регистрация, авторизация, личный кабинет

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
shop
2026-05-16 17:31:56 +03:00
parent 4ea2b429b3
commit b3e3a06858
23 changed files with 981 additions and 27 deletions
+66
View File
@@ -0,0 +1,66 @@
package handlers
import (
"net/http"
"shop/internal/auth"
)
type AccountHandler struct {
pages *Pages
auth *auth.Service
}
func NewAccountHandler(pages *Pages, authSvc *auth.Service) *AccountHandler {
return &AccountHandler{pages: pages, auth: authSvc}
}
type accountPageData struct {
Layout
Name string
}
func (h *AccountHandler) Account(w http.ResponseWriter, r *http.Request) {
user, err := h.auth.UserFromRequest(r.Context(), r)
if err != nil || user == nil {
http.Redirect(w, r, "/login?next=/account", http.StatusSeeOther)
return
}
switch r.Method {
case http.MethodGet:
data := accountPageData{
Layout: h.pages.layout(r, "Личный кабинет", "account"),
Name: user.Name,
}
data.Success = flashMsg(r, "ok")
h.pages.render(w, "account.html", data)
case http.MethodPost:
h.updateProfile(w, r)
default:
http.Error(w, "method not allowed", http.StatusMethodNotAllowed)
}
}
func (h *AccountHandler) updateProfile(w http.ResponseWriter, r *http.Request) {
user, _ := h.auth.UserFromRequest(r.Context(), r)
if user == nil {
http.Redirect(w, r, "/login", http.StatusSeeOther)
return
}
if err := r.ParseForm(); err != nil {
http.Redirect(w, r, "/account", http.StatusSeeOther)
return
}
name := r.FormValue("name")
if err := h.auth.UpdateName(r.Context(), user.ID, name); err != nil {
data := accountPageData{
Layout: h.pages.layout(r, "Личный кабинет", "account"),
Name: name,
}
data.Error = err.Error()
h.pages.render(w, "account.html", data)
return
}
http.Redirect(w, r, "/account?ok=profile", http.StatusSeeOther)
}