logger = $logger; } /** * Register the cron hook. */ public function register(): void { add_action( 'webcal_process_reminders', [ $this, 'process_reminders' ] ); if ( ! wp_next_scheduled( 'webcal_process_reminders' ) ) { wp_schedule_event( time(), 'hourly', 'webcal_process_reminders' ); } } /** * Process pending reminders. */ public function process_reminders(): void { // email_notifications is a free-tier feature; no gating. try { $container = Container::get_instance(); /** @var \WebCalendar\WP\Bridge\WpReminderRepository */ $reminder_repo = $container->get( 'reminder_repository' ); /** @var \WebCalendar\Core\Domain\Repository\UserRepositoryInterface */ $user_repo = $container->get( 'user_repository' ); /** @var \WebCalendar\Core\Application\Service\NotificationService */ $notif_svc = $container->get( 'notification_service' ); /** @var \WebCalendar\Core\Application\Service\EventService */ $event_svc = $container->get( 'event_service' ); $reminders = $reminder_repo->get_pending_reminders(); foreach ( $reminders as $item ) { $reminder = $item['reminder']; $event_id = $reminder->eventId(); $event = $event_svc->getEventById( new \WebCalendar\Core\Domain\ValueObject\EventId( $event_id ) ); if ( ! $event ) { continue; } $user = $user_repo->findByLogin( $event->createdBy() ); if ( $user ) { $notif_svc->sendReminder( $event, $user ); $reminder_repo->mark_as_sent( $event_id ); } } } catch ( \Exception $e ) { $this->logger->error( 'Failed to process reminders: ' . $e->getMessage() ); } } }