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}