From 5de8fce1562170880d17e3f1c8f8c16da8be970c Mon Sep 17 00:00:00 2001 From: James Cole Date: Fri, 28 Apr 2017 10:34:11 +0200 Subject: [PATCH] Make event handlers easier to test (and then ignore them). --- .../Events/StoredJournalEventHandler.php | 37 ++++++++--------- .../Events/UpdatedJournalEventHandler.php | 24 +++++++---- .../RuleGroup/RuleGroupRepository.php | 40 +++++++++++++++++++ .../RuleGroupRepositoryInterface.php | 21 ++++++++++ 4 files changed, 96 insertions(+), 26 deletions(-) diff --git a/app/Handlers/Events/StoredJournalEventHandler.php b/app/Handlers/Events/StoredJournalEventHandler.php index b8e98ebb0a..7a880fc699 100644 --- a/app/Handlers/Events/StoredJournalEventHandler.php +++ b/app/Handlers/Events/StoredJournalEventHandler.php @@ -16,37 +16,44 @@ namespace FireflyIII\Handlers\Events; use FireflyIII\Events\StoredTransactionJournal; use FireflyIII\Models\Rule; use FireflyIII\Models\RuleGroup; -use FireflyIII\Repositories\Journal\JournalRepositoryInterface; -use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; +use FireflyIII\Repositories\Journal\JournalRepositoryInterface as JRI; +use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface as PRI; +use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface as RGRI; use FireflyIII\Rules\Processor; use FireflyIII\Support\Events\BillScanner; use Log; /** + * @codeCoverageIgnore + * * Class StoredJournalEventHandler * * @package FireflyIII\Handlers\Events */ class StoredJournalEventHandler { - /** @var JournalRepositoryInterface */ + /** @var JRI */ public $journalRepository; - /** @var PiggyBankRepositoryInterface */ + /** @var PRI */ public $repository; + /** @var RGRI */ + public $ruleGroupRepository; + /** * StoredJournalEventHandler constructor. */ - public function __construct(PiggyBankRepositoryInterface $repository, JournalRepositoryInterface $journalRepository) + public function __construct(PRI $repository, JRI $journalRepository, RGRI $ruleGroupRepository) { - $this->repository = $repository; - $this->journalRepository = $journalRepository; + $this->repository = $repository; + $this->journalRepository = $journalRepository; + $this->ruleGroupRepository = $ruleGroupRepository; } /** * This method connects a new transfer to a piggy bank. * - * @codeCoverageIgnore + * * * @param StoredTransactionJournal $event * @@ -108,16 +115,11 @@ class StoredJournalEventHandler { // get all the user's rule groups, with the rules, order by 'order'. $journal = $storedJournalEvent->journal; - $groups = $journal->user->ruleGroups()->where('rule_groups.active', 1)->orderBy('order', 'ASC')->get(); - // + $groups = $this->ruleGroupRepository->getActiveGroups($journal->user); + /** @var RuleGroup $group */ foreach ($groups as $group) { - $rules = $group->rules() - ->leftJoin('rule_triggers', 'rules.id', '=', 'rule_triggers.rule_id') - ->where('rule_triggers.trigger_type', 'user_action') - ->where('rule_triggers.trigger_value', 'store-journal') - ->where('rules.active', 1) - ->get(['rules.*']); + $rules = $this->ruleGroupRepository->getActiveStoreRules($group); /** @var Rule $rule */ foreach ($rules as $rule) { @@ -125,9 +127,8 @@ class StoredJournalEventHandler $processor->handleTransactionJournal($journal); if ($rule->stop_processing) { - return true; + break; } - } } diff --git a/app/Handlers/Events/UpdatedJournalEventHandler.php b/app/Handlers/Events/UpdatedJournalEventHandler.php index d6432049c6..1cdadd6da8 100644 --- a/app/Handlers/Events/UpdatedJournalEventHandler.php +++ b/app/Handlers/Events/UpdatedJournalEventHandler.php @@ -17,16 +17,29 @@ namespace FireflyIII\Handlers\Events; use FireflyIII\Events\UpdatedTransactionJournal; use FireflyIII\Models\Rule; use FireflyIII\Models\RuleGroup; +use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface; use FireflyIII\Rules\Processor; use FireflyIII\Support\Events\BillScanner; /** + * @codeCoverageIgnore + * * Class UpdatedJournalEventHandler * * @package FireflyIII\Handlers\Events */ class UpdatedJournalEventHandler { + /** @var RuleGroupRepositoryInterface */ + public $repository; + + /** + * StoredJournalEventHandler constructor. + */ + public function __construct(RuleGroupRepositoryInterface $ruleGroupRepository) + { + $this->repository = $ruleGroupRepository; + } /** * This method will check all the rules when a journal is updated. @@ -39,16 +52,11 @@ class UpdatedJournalEventHandler { // get all the user's rule groups, with the rules, order by 'order'. $journal = $updatedJournalEvent->journal; - $groups = $journal->user->ruleGroups()->where('rule_groups.active', 1)->orderBy('order', 'ASC')->get(); - // + $groups = $this->repository->getActiveGroups($journal->user); + /** @var RuleGroup $group */ foreach ($groups as $group) { - $rules = $group->rules() - ->leftJoin('rule_triggers', 'rules.id', '=', 'rule_triggers.rule_id') - ->where('rule_triggers.trigger_type', 'user_action') - ->where('rule_triggers.trigger_value', 'update-journal') - ->where('rules.active', 1) - ->get(['rules.*']); + $rules = $this->repository->getActiveUpdateRules($group); /** @var Rule $rule */ foreach ($rules as $rule) { $processor = Processor::make($rule); diff --git a/app/Repositories/RuleGroup/RuleGroupRepository.php b/app/Repositories/RuleGroup/RuleGroupRepository.php index 0ee1a72dfd..cee3e353ef 100644 --- a/app/Repositories/RuleGroup/RuleGroupRepository.php +++ b/app/Repositories/RuleGroup/RuleGroupRepository.php @@ -92,6 +92,46 @@ class RuleGroupRepository implements RuleGroupRepositoryInterface return $this->user->ruleGroups()->orderBy('order', 'ASC')->get(); } + /** + * @param User $user + * + * @return Collection + */ + public function getActiveGroups(User $user): Collection + { + return $user->ruleGroups()->where('rule_groups.active', 1)->orderBy('order', 'ASC')->get(['rule_groups.*']); + } + + /** + * @param RuleGroup $group + * + * @return Collection + */ + public function getActiveStoreRules(RuleGroup $group): Collection + { + return $group->rules() + ->leftJoin('rule_triggers', 'rules.id', '=', 'rule_triggers.rule_id') + ->where('rule_triggers.trigger_type', 'user_action') + ->where('rule_triggers.trigger_value', 'store-journal') + ->where('rules.active', 1) + ->get(['rules.*']); + } + + /** + * @param RuleGroup $group + * + * @return Collection + */ + public function getActiveUpdateRules(RuleGroup $group): Collection + { + return $group->rules() + ->leftJoin('rule_triggers', 'rules.id', '=', 'rule_triggers.rule_id') + ->where('rule_triggers.trigger_type', 'user_action') + ->where('rule_triggers.trigger_value', 'update-journal') + ->where('rules.active', 1) + ->get(['rules.*']); + } + /** * @return int */ diff --git a/app/Repositories/RuleGroup/RuleGroupRepositoryInterface.php b/app/Repositories/RuleGroup/RuleGroupRepositoryInterface.php index 0afa9b1dec..bb8bb8217d 100644 --- a/app/Repositories/RuleGroup/RuleGroupRepositoryInterface.php +++ b/app/Repositories/RuleGroup/RuleGroupRepositoryInterface.php @@ -53,6 +53,27 @@ interface RuleGroupRepositoryInterface */ public function get(): Collection; + /** + * @param User $user + * + * @return Collection + */ + public function getActiveGroups(User $user): Collection; + + /** + * @param RuleGroup $group + * + * @return Collection + */ + public function getActiveStoreRules(RuleGroup $group): Collection; + + /** + * @param RuleGroup $group + * + * @return Collection + */ + public function getActiveUpdateRules(RuleGroup $group): Collection; + /** * @return int */