ikurotime / gitgud

public
main / internal/interface/web/auth_handler.go
2.1 KB · Go Raw
 1package web
 2
 3import (
 4	"errors"
 5	"net/http"
 6	"strings"
 7
 8	"gitgud/internal/domain"
 9	"gitgud/internal/interface/web/templates"
10)
11
12func (h *Handlers) showRegister(w http.ResponseWriter, r *http.Request) {
13	render(w, r, http.StatusOK, templates.Register(currentUser(r.Context()), "", "", ""))
14}
15
16func (h *Handlers) doRegister(w http.ResponseWriter, r *http.Request) {
17	username := r.FormValue("username")
18	email := r.FormValue("email")
19	password := r.FormValue("password")
20
21	u, err := h.users.Register(r.Context(), username, email, password)
22	if err != nil {
23		status := http.StatusBadRequest
24		if errors.Is(err, domain.ErrConflict) {
25			status = http.StatusConflict
26		}
27		render(w, r, status, templates.Register(currentUser(r.Context()), username, email, userMessage(err)))
28		return
29	}
30	h.startSession(w, r, u)
31}
32
33func (h *Handlers) showLogin(w http.ResponseWriter, r *http.Request) {
34	render(w, r, http.StatusOK, templates.Login(currentUser(r.Context()), "", ""))
35}
36
37func (h *Handlers) doLogin(w http.ResponseWriter, r *http.Request) {
38	username := r.FormValue("username")
39	password := r.FormValue("password")
40
41	u, err := h.users.Authenticate(r.Context(), username, password)
42	if err != nil {
43		render(w, r, http.StatusUnauthorized, templates.Login(currentUser(r.Context()), username, "invalid credentials"))
44		return
45	}
46	h.startSession(w, r, u)
47}
48
49func (h *Handlers) doLogout(w http.ResponseWriter, r *http.Request) {
50	if err := h.sm.Destroy(r.Context()); err != nil {
51		h.writeError(w, r, err)
52		return
53	}
54	http.Redirect(w, r, "/", http.StatusSeeOther)
55}
56
57func (h *Handlers) startSession(w http.ResponseWriter, r *http.Request, u *domain.User) {
58	h.sm.Put(r.Context(), sessionUserIDKey, u.ID)
59	h.sm.RenewToken(r.Context())
60	http.Redirect(w, r, "/", http.StatusSeeOther)
61}
62
63func userMessage(err error) string {
64	switch {
65	case errors.Is(err, domain.ErrUnauthorized):
66		return "invalid credentials"
67	case errors.Is(err, domain.ErrConflict):
68		return "that username is already taken"
69	case errors.Is(err, domain.ErrValidation):
70		return strings.TrimSuffix(err.Error(), ": "+domain.ErrValidation.Error())
71	default:
72		return "something went wrong"
73	}
74}