Files
RenewCMS/internal/infrastructure/useCases/RequestPasswordReset.go
T

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
}