| @@ -1,0 +1,70 @@ | ||
| 1 | +<?php | |
| 2 | + | |
| 3 | +declare(strict_types=1); | |
| 4 | + | |
| 5 | +namespace Metricool\Controllers; | |
| 6 | + | |
| 7 | +if (!defined('ABSPATH')) { | |
| 8 | + exit; | |
| 9 | +} | |
| 10 | + | |
| 11 | +use Metricool\Interfaces\ControllerInterface; | |
| 12 | +use Metricool\Support\Helpers\Storages\EnvironmentConfig; | |
| 13 | + | |
| 14 | +class UpgradeController implements ControllerInterface | |
| 15 | +{ | |
| 16 | + public const LEGACY_VERSION = '1.27'; | |
| 17 | + | |
| 18 | + private EnvironmentConfig $env; | |
| 19 | + | |
| 20 | + public function __construct(EnvironmentConfig $env) | |
| 21 | + { | |
| 22 | + $this->env = $env; | |
| 23 | + } | |
| 24 | + | |
| 25 | + public function register(): void | |
| 26 | + { | |
| 27 | + add_action('metricool_controllers_loaded', [$this, 'checkForUpgrades']); | |
| 28 | + } | |
| 29 | + | |
| 30 | + /** | |
| 31 | + * Fire an action when the plugin is upgraded from one version to another. | |
| 32 | + * | |
| 33 | + * @internal Note the starting underscore in the option name. This is to | |
| 34 | + * prevent the option from being deleted when a user logs out. As if | |
| 35 | + * it is a private Metricool option. | |
| 36 | + * | |
| 37 | + * @hooked metricool_controllers_loaded to make sure Controllers can hook | |
| 38 | + * into metricool_plugin_version_upgrade. Even this one. | |
| 39 | + * | |
| 40 | + * @uses do_action metricool_plugin_version_upgrade Only hook into this | |
| 41 | + * action if the upgrade script is related to the responsibility of the | |
| 42 | + * hooking class. | |
| 43 | + */ | |
| 44 | + public function checkForUpgrades(): void | |
| 45 | + { | |
| 46 | + $previousSavedVersion = (string) get_option('_metricool_current_version', ''); | |
| 47 | + $currentVersion = $this->env->getString('plugin.version'); | |
| 48 | + | |
| 49 | + if ($previousSavedVersion === $currentVersion) { | |
| 50 | + return; // Nothing to do | |
| 51 | + } | |
| 52 | + | |
| 53 | + // Legacy upgrade | |
| 54 | + if (empty($previousSavedVersion) && $this->isLegacyUpgrade()) { | |
| 55 | + $previousSavedVersion = self::LEGACY_VERSION; | |
| 56 | + do_action('metricool_plugin_legacy_upgrade', $currentVersion); | |
| 57 | + } | |
| 58 | + | |
| 59 | + do_action('metricool_plugin_version_upgrade', $previousSavedVersion, $currentVersion); | |
| 60 | + update_option('_metricool_current_version', $currentVersion, false); | |
| 61 | + } | |
| 62 | + | |
| 63 | + /** | |
| 64 | + * Determine if this is an upgrade from the legacy plugin by checking for the existence of the old metricool_id option. | |
| 65 | + */ | |
| 66 | + private function isLegacyUpgrade(): bool | |
| 67 | + { | |
| 68 | + return get_option('metricool_profile_id', false) !== false; | |
| 69 | + } | |
| 70 | +} | |