(w http.ResponseWriter, r *http.Request)
| 291 | } |
| 292 | |
| 293 | func (u *Users) CreateResetToken(w http.ResponseWriter, r *http.Request) { |
| 294 | vd := views.Data{} |
| 295 | |
| 296 | var form createResetTokenPayload |
| 297 | if err := parseForm(r, &form); err != nil { |
| 298 | handleHTMLError(w, r, err, "parsing form", u.PasswordResetView, vd) |
| 299 | return |
| 300 | } |
| 301 | |
| 302 | if form.Email == "" { |
| 303 | handleHTMLError(w, r, app.ErrEmailRequired, "email is not provided", u.PasswordResetView, vd) |
| 304 | return |
| 305 | } |
| 306 | |
| 307 | var user database.User |
| 308 | err := u.app.DB.Where("email = ?", form.Email).First(&user).Error |
| 309 | if errors.Is(err, gorm.ErrRecordNotFound) { |
| 310 | return |
| 311 | } |
| 312 | if err != nil { |
| 313 | handleHTMLError(w, r, err, "finding user", u.PasswordResetView, vd) |
| 314 | return |
| 315 | } |
| 316 | |
| 317 | resetToken, err := token.Create(u.app.DB, user.ID, database.TokenTypeResetPassword) |
| 318 | if err != nil { |
| 319 | handleHTMLError(w, r, err, "generating token", u.PasswordResetView, vd) |
| 320 | return |
| 321 | } |
| 322 | |
| 323 | if err := u.app.SendPasswordResetEmail(user.Email.String, resetToken.Value); err != nil { |
| 324 | handleHTMLError(w, r, err, "sending password reset email", u.PasswordResetView, vd) |
| 325 | return |
| 326 | } |
| 327 | |
| 328 | alert := views.Alert{ |
| 329 | Level: views.AlertLvlSuccess, |
| 330 | Message: "Check your email for a link to reset your password.", |
| 331 | } |
| 332 | views.RedirectAlert(w, r, "/password-reset", http.StatusFound, alert) |
| 333 | } |
| 334 | |
| 335 | // PasswordResetConfirm renders password reset view |
| 336 | func (u *Users) PasswordResetConfirm(w http.ResponseWriter, r *http.Request) { |
nothing calls this directly
no test coverage detected