<?php
declare( strict_types=1 );
namespace Automattic\WooCommerce\GoogleListingsAndAds\DB\Migration;
use Automattic\WooCommerce\GoogleListingsAndAds\Infrastructure\Service;
defined( 'ABSPATH' ) || exit;
/**
* Class Migrator
*
* @package Automattic\WooCommerce\GoogleListingsAndAds\DB\Migration
*
* @since 1.4.1
*/
class Migrator implements Service {
/**
* @var MigrationInterface[]
*/
protected $migrations;
/**
* Migrator constructor.
*
* @param MigrationInterface[] $migrations An array of all available migrations.
*/
public function __construct( array $migrations ) {
$this->migrations = $migrations;
// Sort migrations by version.
uasort(
$this->migrations,
function ( MigrationInterface $migration_a, MigrationInterface $migration_b ) {
return version_compare( $migration_a->get_applicable_version(), $migration_b->get_applicable_version() );
}
);
}
/**
* Run migrations.
*
* @param string $old_version Previous version before updating.
* @param string $new_version Current version after updating.
*/
public function migrate( string $old_version, string $new_version ): void {
// bail if both versions are equal.
if ( 0 === version_compare( $old_version, $new_version ) ) {
return;
}
foreach ( $this->migrations as $migration ) {
if ( $this->can_apply( $migration->get_applicable_version(), $old_version, $new_version ) ) {
$migration->apply();
}
}
}
/**
* @param string $migration_version The applicable version of the migration.
* @param string $old_version Previous version before updating.
* @param string $new_version Current version after updating.
*
* @return bool True if migration should be applied.
*/
protected function can_apply( string $migration_version, string $old_version, string $new_version ): bool {
return version_compare( $old_version, $new_version, '<' ) &&
version_compare( $old_version, $migration_version, '<' ) &&
version_compare( $migration_version, $new_version, '<=' );
}
}