> $request */ public function read( WP_REST_Request $request ): FixRequest|WP_Error { $raw_action = $request->get_param( 'action' ); $action = is_string( $raw_action ) ? FixAction::tryFrom( $raw_action ) : null; $link_ids = $this->link_ids_of( $request->get_param( 'link_ids' ) ); $status = $this->status_of( $request->get_param( 'status' ) ); $selection = $link_ids ?? $status; $has_both = null !== $link_ids && null !== $status; $is_valid = null !== $action && ! $has_both && ( is_array( $selection ) || $selection instanceof Verdict ); if ( ! $is_valid ) { return FixErrors::invalid_parameter(); } $new_url = $this->new_url_of( $action, $request->get_param( 'new_url' ) ); if ( $new_url instanceof WP_Error ) { return $new_url; } return new FixRequest( $action, $selection, $new_url ); } /** @return list|WP_Error|null */ private function link_ids_of( mixed $raw_link_ids ): array|WP_Error|null { if ( null === $raw_link_ids ) { return null; } $is_list = is_array( $raw_link_ids ) && array_is_list( $raw_link_ids ) && array() !== $raw_link_ids; if ( ! $is_list || count( $raw_link_ids ) > self::MAXIMUM_LINK_IDS ) { return FixErrors::invalid_parameter(); } $link_ids = array(); foreach ( $raw_link_ids as $raw_link_id ) { if ( ! is_int( $raw_link_id ) || $raw_link_id < 1 ) { return FixErrors::invalid_parameter(); } $link_ids[] = $raw_link_id; } return array_values( array_unique( $link_ids ) ); } private function status_of( mixed $raw_status ): Verdict|WP_Error|null { if ( null === $raw_status ) { return null; } if ( ! in_array( $raw_status, self::STATUSES, true ) ) { return FixErrors::invalid_parameter(); } return Verdict::from( $raw_status ); } private function new_url_of( FixAction $action, mixed $raw_new_url ): string|WP_Error|null { if ( ! $action->needs_new_url() ) { return null; } $new_url = is_string( $raw_new_url ) ? trim( $raw_new_url ) : ''; if ( ! $this->address_rules->is_usable_new_url( $new_url ) ) { return FixErrors::invalid_url(); } if ( str_starts_with( $new_url, self::SITE_PATH_START ) ) { return home_url( $new_url ); } return $new_url; } }