Raw
 1package web
 2
 3import (
 4	"net/http"
 5	"time"
 6
 7	"tug/internal/transport/web/text"
 8)
 9
10type AdminResetLink struct {
11	URL       string
12	Username  string
13	ExpiresAt time.Time
14}
15
16func resetConfirmPage(id string, username Ident, message text.Key) Confirm {
17	return Confirm{Title: text.AdminResetTitle, Body: text.AdminResetBody, Button: text.AdminUserReset, Subject: username, Action: "/users/" + id + "/reset-link", Cancel: "/users/" + id, Neutral: true, Message: message}
18}
19
20func (a *admin) resetConfirm(w http.ResponseWriter, r *http.Request) {
21	if _, id, u, ok := a.loadUser(w, r); ok {
22		a.kit.RenderConfirm(w, r, resetConfirmPage(id, Ident(u.Username), ""))
23	}
24}
25
26func (a *admin) resetIssue(w http.ResponseWriter, r *http.Request) {
27	p, id, u, ok := a.loadUser(w, r)
28	if !ok {
29		return
30	}
31	link, err := a.b.IssueResetLink(r.Context(), p.UserID, id)
32	if key, ok := adminProblemKey(err); ok {
33		cf := resetConfirmPage(id, Ident(u.Username), key)
34		cf.Refused = true
35		a.kit.RenderConfirm(w, r, cf)
36		return
37	}
38	if err != nil {
39		a.failed(w, r, "issue reset link", err)
40		return
41	}
42	a.kit.RenderOneTime(w, r, OneTime{Title: text.AdminResetOneTimeTitle, Subject: Ident(link.Username), Secret: Ident(link.URL), Expires: Ident(stamp(link.ExpiresAt)), Back: "/users/" + id, BackText: text.AdminResetBack})
43}