package useCases import ( "RenewCMS/internal/domain/apikey" "RenewCMS/internal/domain/hash" "RenewCMS/internal/domain/user" "time" ) type ResetPasswordUseCase struct { userRepository user.Repository hasher hash.Hasher apiKeys apikey.Repository now func() time.Time } func NewResetPasswordUseCase(userRepository user.Repository, hasher hash.Hasher, apiKeys apikey.Repository, now func() time.Time) *ResetPasswordUseCase { return &ResetPasswordUseCase{userRepository, hasher, apiKeys, now} } func (r *ResetPasswordUseCase) ResetPassword(email string, code string, newPassword string) error { dbUser, err := r.userRepository.GetByEmail(email) if err != nil { return user.ErrInvalidPasswordResetCode } if dbUser.PasswordResetCode == "" || r.hasher.Compare(dbUser.PasswordResetCode, code) != nil { return user.ErrInvalidPasswordResetCode } if r.now().After(dbUser.PasswordResetExpiration) { return user.ErrPasswordResetCodeExpired } hashedPassword, err := r.hasher.Hash(newPassword) if err != nil { return err } if _, err = r.userRepository.ResetPassword(dbUser.ID, hashedPassword); err != nil { return err } return r.apiKeys.RevokeAllByUser(dbUser.ID, r.now()) }