60 lines
1.6 KiB
Go
60 lines
1.6 KiB
Go
package useCases
|
|
|
|
import (
|
|
"RenewCMS/internal/domain/hash"
|
|
"RenewCMS/internal/domain/mail"
|
|
"RenewCMS/internal/domain/user"
|
|
"log"
|
|
"time"
|
|
|
|
"github.com/google/uuid"
|
|
)
|
|
|
|
type RequestPasswordResetUseCase struct {
|
|
userRepository user.Repository
|
|
hasher hash.Hasher
|
|
mailRepository mail.Repository
|
|
publicURL string
|
|
}
|
|
|
|
type MailPasswordResetData struct {
|
|
Host string
|
|
VerificationCode string
|
|
Email string
|
|
}
|
|
|
|
func NewRequestPasswordResetUseCase(userRepository user.Repository, hasher hash.Hasher, mailRepository mail.Repository, publicURL string) *RequestPasswordResetUseCase {
|
|
return &RequestPasswordResetUseCase{userRepository, hasher, mailRepository, publicURL}
|
|
}
|
|
|
|
func (g *RequestPasswordResetUseCase) RequestPasswordReset(email string) error {
|
|
foundUser, err := g.userRepository.GetByEmail(email)
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
|
|
rawCode := uuid.NewString()
|
|
|
|
hashedCode, err := g.hasher.Hash(rawCode)
|
|
if err != nil {
|
|
log.Println("error when hashing the password reset code:", err)
|
|
return nil
|
|
}
|
|
|
|
if _, err := g.userRepository.UpdatePasswordResetCode(foundUser.ID, hashedCode, time.Now().Add(time.Hour)); err != nil {
|
|
log.Println("error when calling UpdatePasswordResetCode to store the password reset code:", err)
|
|
return nil
|
|
}
|
|
|
|
if err := g.mailRepository.Send(foundUser.Email, "passwordReset", MailPasswordResetData{
|
|
Host: g.publicURL,
|
|
VerificationCode: rawCode,
|
|
Email: foundUser.Email,
|
|
}); err != nil {
|
|
log.Println("error when Send-ing the password reset mail:", err)
|
|
return nil
|
|
}
|
|
|
|
return nil
|
|
}
|