|
27 | 27 | use function count; |
28 | 28 | use function sprintf; |
29 | 29 |
|
30 | | -final class DefaultSubscriptionEngine implements SubscriptionEngine |
| 30 | +final class DefaultSubscriptionEngine implements SubscriptionEngine, SubscriptionRefreshable |
31 | 31 | { |
32 | 32 | private SubscriptionManager $subscriptionManager; |
33 | 33 |
|
@@ -800,6 +800,68 @@ public function subscriptions(SubscriptionEngineCriteria|null $criteria = null): |
800 | 800 | ); |
801 | 801 | } |
802 | 802 |
|
| 803 | + public function refreshSubscriptions(SubscriptionEngineCriteria|null $criteria = null): Result |
| 804 | + { |
| 805 | + $criteria ??= new SubscriptionEngineCriteria(); |
| 806 | + |
| 807 | + $this->discoverNewSubscriptions(); |
| 808 | + |
| 809 | + $subscriptions = $this->subscriptionManager->find(new SubscriptionCriteria( |
| 810 | + ids: $criteria->ids, |
| 811 | + groups: $criteria->groups, |
| 812 | + )); |
| 813 | + |
| 814 | + foreach ($subscriptions as $subscription) { |
| 815 | + $subscriber = $this->subscriber($subscription->id()); |
| 816 | + |
| 817 | + if (!$subscriber) { |
| 818 | + continue; |
| 819 | + } |
| 820 | + |
| 821 | + $changed = false; |
| 822 | + |
| 823 | + if ($subscription->runMode() !== $subscriber->runMode()) { |
| 824 | + $changed = true; |
| 825 | + $oldRunMode = $subscription->runMode(); |
| 826 | + $subscription->changeRunMode($subscriber->runMode()); |
| 827 | + |
| 828 | + $this->logger?->info( |
| 829 | + sprintf( |
| 830 | + 'Subscription Engine: Subscription "%s" run mode changed from "%s" to "%s".', |
| 831 | + $subscription->id(), |
| 832 | + $oldRunMode->value, |
| 833 | + $subscription->runMode()->value, |
| 834 | + ), |
| 835 | + ); |
| 836 | + } |
| 837 | + |
| 838 | + if ($subscription->group() !== $subscriber->group()) { |
| 839 | + $changed = true; |
| 840 | + $oldGroup = $subscription->group(); |
| 841 | + $subscription->changeGroup($subscriber->group()); |
| 842 | + |
| 843 | + $this->logger?->info( |
| 844 | + sprintf( |
| 845 | + 'Subscription Engine: Subscription "%s" group changed from "%s" to "%s".', |
| 846 | + $subscription->id(), |
| 847 | + $oldGroup, |
| 848 | + $subscription->group(), |
| 849 | + ), |
| 850 | + ); |
| 851 | + } |
| 852 | + |
| 853 | + if (!$changed) { |
| 854 | + continue; |
| 855 | + } |
| 856 | + |
| 857 | + $this->subscriptionManager->update($subscription); |
| 858 | + } |
| 859 | + |
| 860 | + $this->subscriptionManager->flush(); |
| 861 | + |
| 862 | + return new Result(); |
| 863 | + } |
| 864 | + |
803 | 865 | private function handleMessage(int $index, Message $message, Subscription $subscription): Error|null |
804 | 866 | { |
805 | 867 | $subscriber = $this->subscriber($subscription->id()); |
|
0 commit comments