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, "password-reset", 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 }