| @@ -6,10 +6,11 @@ | ||
| 6 | 6 | */ |
| 7 | 7 | |
| 8 | 8 | declare( strict_types=1 ); |
| 9 | 9 | |
| 10 | +namespace Packetery\Module; | |
| 10 | 11 | |
| 11 | -namespace Packetery\Module; | |
| 12 | +use Packetery\Module\Options\TransientPurger; | |
| 12 | 13 | |
| 13 | 14 | /** |
| 14 | 15 | * Class CronService |
| 15 | 16 | * |
| @@ -16,11 +17,13 @@ | ||
| 16 | 17 | * @package Packetery |
| 17 | 18 | */ |
| 18 | 19 | class CronService { |
| 19 | 20 | |
| 20 | - private const CRON_LOG_AUTO_DELETION_HOOK = 'packetery_cron_log_auto_deletion_hook'; | |
| 21 | - public const CRON_CARRIERS_HOOK = 'packetery_cron_carriers_hook'; | |
| 22 | - private const CRON_PACKET_STATUS_SYNC_HOOK = 'packetery_cron_packet_status_sync_hook'; | |
| 21 | + public const CRON_LOG_AUTO_DELETION_HOOK = 'packetery_cron_log_auto_deletion_hook'; | |
| 22 | + public const CRON_CARRIERS_HOOK = 'packetery_cron_carriers_hook'; | |
| 23 | + public const CRON_PACKET_STATUS_SYNC_HOOK = 'packetery_cron_packet_status_sync_hook'; | |
| 24 | + private const CRON_PACKET_STATUS_SYNC_HOOK_WEEKEND = 'packetery_cron_packet_status_sync_hook_weekend'; | |
| 25 | + private const CRON_PURGE_TRANSIENTS = 'packetery_cron_purge_transients'; | |
| 23 | 26 | |
| 24 | 27 | /** |
| 25 | 28 | * Log purger. |
| 26 | 29 | * |
| @@ -42,18 +45,32 @@ | ||
| 42 | 45 | */ |
| 43 | 46 | private $packetSynchronizer; |
| 44 | 47 | |
| 45 | 48 | /** |
| 49 | + * Transient purger. | |
| 50 | + * | |
| 51 | + * @var TransientPurger | |
| 52 | + */ | |
| 53 | + private $transientPurger; | |
| 54 | + | |
| 55 | + /** | |
| 46 | 56 | * Constructor. |
| 47 | 57 | * |
| 48 | - * @param Log\Purger $logPurger Log purger. | |
| 49 | - * @param Carrier\Downloader $carrierDownloader Carrier downloader. | |
| 58 | + * @param Log\Purger $logPurger Log purger. | |
| 59 | + * @param Carrier\Downloader $carrierDownloader Carrier downloader. | |
| 50 | 60 | * @param Order\PacketSynchronizer $packetSynchronizer Packet synchronizer. |
| 61 | + * @param TransientPurger $transientPurger Transient purger. | |
| 51 | 62 | */ |
| 52 | - public function __construct( Log\Purger $logPurger, Carrier\Downloader $carrierDownloader, Order\PacketSynchronizer $packetSynchronizer ) { | |
| 63 | + public function __construct( | |
| 64 | + Log\Purger $logPurger, | |
| 65 | + Carrier\Downloader $carrierDownloader, | |
| 66 | + Order\PacketSynchronizer $packetSynchronizer, | |
| 67 | + TransientPurger $transientPurger | |
| 68 | + ) { | |
| 53 | 69 | $this->logPurger = $logPurger; |
| 54 | 70 | $this->carrierDownloader = $carrierDownloader; |
| 55 | 71 | $this->packetSynchronizer = $packetSynchronizer; |
| 72 | + $this->transientPurger = $transientPurger; | |
| 56 | 73 | } |
| 57 | 74 | |
| 58 | 75 | /** |
| 59 | 76 | * Registers service. |
| @@ -60,27 +77,46 @@ | ||
| 60 | 77 | * |
| 61 | 78 | * @return void |
| 62 | 79 | */ |
| 63 | 80 | public function register(): void { |
| 81 | + // Hooks have to be initialised before init. | |
| 64 | 82 | add_action( self::CRON_LOG_AUTO_DELETION_HOOK, [ $this->logPurger, 'autoDeleteHook' ] ); |
| 65 | - if ( ! wp_next_scheduled( self::CRON_LOG_AUTO_DELETION_HOOK ) ) { | |
| 66 | - wp_schedule_event( ( new \DateTime( 'next day 02:00', wp_timezone() ) )->getTimestamp(), 'daily', self::CRON_LOG_AUTO_DELETION_HOOK ); | |
| 67 | - } | |
| 83 | + add_action( self::CRON_PURGE_TRANSIENTS, [ $this->transientPurger, 'purge' ] ); | |
| 84 | + add_action( self::CRON_CARRIERS_HOOK, [ $this->carrierDownloader, 'runAndRender' ] ); | |
| 85 | + add_action( self::CRON_PACKET_STATUS_SYNC_HOOK, [ $this->packetSynchronizer, 'syncStatuses' ] ); | |
| 86 | + add_action( self::CRON_PACKET_STATUS_SYNC_HOOK_WEEKEND, [ $this->packetSynchronizer, 'syncStatuses' ] ); | |
| 68 | 87 | |
| 69 | 88 | add_action( |
| 70 | 89 | 'init', |
| 71 | 90 | function () { |
| 72 | - add_action( self::CRON_CARRIERS_HOOK, [ $this->carrierDownloader, 'runAndRender' ] ); | |
| 73 | - if ( false === as_has_scheduled_action( self::CRON_CARRIERS_HOOK ) ) { | |
| 74 | - as_schedule_recurring_action( ( new \DateTime( 'next day 09:10', wp_timezone() ) )->getTimestamp(), 86400, self::CRON_CARRIERS_HOOK ); | |
| 91 | + if ( ! function_exists( 'as_has_scheduled_action' ) ) { | |
| 92 | + return; | |
| 75 | 93 | } |
| 94 | + | |
| 95 | + if ( as_has_scheduled_action( self::CRON_LOG_AUTO_DELETION_HOOK ) === false ) { | |
| 96 | + as_schedule_recurring_action( ( new \DateTime( 'next day 02:00', wp_timezone() ) )->getTimestamp(), DAY_IN_SECONDS, self::CRON_LOG_AUTO_DELETION_HOOK ); | |
| 97 | + } | |
| 98 | + if ( as_has_scheduled_action( self::CRON_PURGE_TRANSIENTS ) === false ) { | |
| 99 | + as_schedule_recurring_action( | |
| 100 | + ( new \DateTime( 'next day 02:10', wp_timezone() ) )->getTimestamp(), | |
| 101 | + DAY_IN_SECONDS, | |
| 102 | + self::CRON_PURGE_TRANSIENTS | |
| 103 | + ); | |
| 104 | + } | |
| 105 | + if ( as_has_scheduled_action( self::CRON_CARRIERS_HOOK ) === false ) { | |
| 106 | + as_schedule_recurring_action( ( new \DateTime( 'next day 09:10', wp_timezone() ) )->getTimestamp(), DAY_IN_SECONDS, self::CRON_CARRIERS_HOOK ); | |
| 107 | + } | |
| 108 | + if ( as_has_scheduled_action( self::CRON_PACKET_STATUS_SYNC_HOOK ) === false ) { | |
| 109 | + // phpcs:ignore Squiz.PHP.CommentedOutCode.Found | |
| 110 | + // Monday to Friday at 02:10, 06:10, 10:10, 14:10, 18:10, 22:10. | |
| 111 | + as_schedule_cron_action( ( new \DateTime() )->getTimestamp(), '10 2,6,10,14,18,22 * * 1-5', self::CRON_PACKET_STATUS_SYNC_HOOK ); | |
| 112 | + } | |
| 113 | + if ( as_has_scheduled_action( self::CRON_PACKET_STATUS_SYNC_HOOK_WEEKEND ) === false ) { | |
| 114 | + // Saturday, Sunday at 03:10. | |
| 115 | + as_schedule_cron_action( ( new \DateTime() )->getTimestamp(), '10 3 * * 6,0', self::CRON_PACKET_STATUS_SYNC_HOOK_WEEKEND ); | |
| 116 | + } | |
| 76 | 117 | } |
| 77 | 118 | ); |
| 78 | - | |
| 79 | - add_action( self::CRON_PACKET_STATUS_SYNC_HOOK, [ $this->packetSynchronizer, 'syncStatuses' ] ); | |
| 80 | - if ( ! wp_next_scheduled( self::CRON_PACKET_STATUS_SYNC_HOOK ) ) { | |
| 81 | - wp_schedule_event( ( new \DateTime( 'next day 03:00:00', wp_timezone() ) )->getTimestamp(), 'daily', self::CRON_PACKET_STATUS_SYNC_HOOK ); | |
| 82 | - } | |
| 83 | 119 | } |
| 84 | 120 | |
| 85 | 121 | /** |
| 86 | 122 | * Unregisters purger and synchronizer. |
| @@ -87,8 +123,11 @@ | ||
| 87 | 123 | * |
| 88 | 124 | * @return void |
| 89 | 125 | */ |
| 90 | 126 | public static function deactivate(): void { |
| 91 | - wp_clear_scheduled_hook( self::CRON_LOG_AUTO_DELETION_HOOK ); | |
| 92 | - wp_clear_scheduled_hook( self::CRON_PACKET_STATUS_SYNC_HOOK ); | |
| 127 | + as_unschedule_action( self::CRON_LOG_AUTO_DELETION_HOOK ); | |
| 128 | + as_unschedule_action( self::CRON_PURGE_TRANSIENTS ); | |
| 129 | + as_unschedule_action( self::CRON_CARRIERS_HOOK ); | |
| 130 | + as_unschedule_action( self::CRON_PACKET_STATUS_SYNC_HOOK ); | |
| 131 | + as_unschedule_action( self::CRON_PACKET_STATUS_SYNC_HOOK_WEEKEND ); | |
| 93 | 132 | } |
| 94 | 133 | } |