date_helper = $date_helper; $this->code_verifier_repository = $code_verifier_repository; $this->code_generator = $code_generator; } /** * Generate a code verifier for a user. * * @param string $user_email The user email. * * @return Code_Verifier The generated code verifier. */ public function generate( string $user_email ): Code_Verifier { $code = $this->code_generator->generate( $user_email ); $created_at = $this->date_helper->current_time(); return new Code_Verifier( $code, $created_at ); } /** * Validate the code verifier for a user. * * @param int $user_id The user ID. * * @return string The code verifier. * * @throws RuntimeException If the code verifier is expired or invalid. */ public function validate( int $user_id ): string { $code_verifier = $this->code_verifier_repository->get_code_verifier( $user_id ); if ( $code_verifier === null || $code_verifier->is_expired( self::VALIDITY_IN_SECONDS ) ) { $this->code_verifier_repository->delete_code_verifier( $user_id ); throw new RuntimeException( 'Code verifier has expired or is invalid.' ); } return $code_verifier->get_code(); } }