diff --git a/app/Api/V1/Controllers/Models/Rule/ExpressionController.php b/app/Api/V1/Controllers/Models/Rule/ExpressionController.php index 36588ae58f..f9737e04df 100644 --- a/app/Api/V1/Controllers/Models/Rule/ExpressionController.php +++ b/app/Api/V1/Controllers/Models/Rule/ExpressionController.php @@ -26,11 +26,9 @@ namespace FireflyIII\Api\V1\Controllers\Models\Rule; use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Requests\Models\Rule\ValidateExpressionRequest; use FireflyIII\Repositories\Rule\RuleRepositoryInterface; -use FireflyIII\TransactionRules\Expressions\ActionExpressionEvaluator; -use FireflyIII\TransactionRules\Factory\ExpressionLanguageFactory; +use FireflyIII\TransactionRules\Expressions\ActionExpression; use FireflyIII\User; use Illuminate\Http\JsonResponse; -use Symfony\Component\ExpressionLanguage\SyntaxError; /** * Class ExpressionController @@ -70,18 +68,17 @@ class ExpressionController extends Controller */ public function validateExpression(ValidateExpressionRequest $request): JsonResponse { - $expr = $request->getExpression(); - $expressionLanguage = ExpressionLanguageFactory::get(); - $evaluator = new ActionExpressionEvaluator($expressionLanguage, $expr); + $value = $request->getExpression(); + $expr = new ActionExpression($value); - if ($evaluator->isValid()) { + if ($expr->isValid()) { return response()->json([ "valid" => true, ]); } else { return response()->json([ "valid" => false, - "error" => $evaluator->getValidationError()->getMessage() + "error" => $expr->getValidationError()->getMessage() ]); } } diff --git a/app/Providers/FireflyServiceProvider.php b/app/Providers/FireflyServiceProvider.php index 3f304c33da..200d9c1372 100644 --- a/app/Providers/FireflyServiceProvider.php +++ b/app/Providers/FireflyServiceProvider.php @@ -19,6 +19,7 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ + declare(strict_types=1); namespace FireflyIII\Providers; @@ -69,9 +70,11 @@ use FireflyIII\Support\Preferences; use FireflyIII\Support\Steam; use FireflyIII\TransactionRules\Engine\RuleEngineInterface; use FireflyIII\TransactionRules\Engine\SearchRuleEngine; +use FireflyIII\TransactionRules\Expressions\ActionExpressionLanguageProvider; use FireflyIII\Validation\FireflyValidator; use Illuminate\Foundation\Application; use Illuminate\Support\ServiceProvider; +use Symfony\Component\ExpressionLanguage\ExpressionLanguage; /** * Class FireflyServiceProvider. @@ -200,6 +203,16 @@ class FireflyServiceProvider extends ServiceProvider } ); + // rule expression language + $this->app->singleton( + ExpressionLanguage::class, + static function () { + $expressionLanguage = new ExpressionLanguage(); + $expressionLanguage->registerProvider(new ActionExpressionLanguageProvider()); + return $expressionLanguage; + } + ); + $this->app->bind( RuleEngineInterface::class, static function (Application $app) { diff --git a/app/TransactionRules/Actions/AddTag.php b/app/TransactionRules/Actions/AddTag.php index 20d1adfce6..dbe22a8bdb 100644 --- a/app/TransactionRules/Actions/AddTag.php +++ b/app/TransactionRules/Actions/AddTag.php @@ -29,7 +29,7 @@ use FireflyIII\Events\TriggeredAuditLog; use FireflyIII\Factory\TagFactory; use FireflyIII\Models\RuleAction; use FireflyIII\Models\TransactionJournal; -use FireflyIII\TransactionRules\Expressions\ActionExpressionEvaluator; +use FireflyIII\TransactionRules\Expressions\ActionExpression; use FireflyIII\User; /** @@ -37,16 +37,16 @@ use FireflyIII\User; */ class AddTag implements ActionInterface { - private RuleAction $action; - private ActionExpressionEvaluator $evaluator; + private RuleAction $action; + private ActionExpression $expr; /** * TriggerInterface constructor. */ - public function __construct(RuleAction $action, ActionExpressionEvaluator $evaluator) + public function __construct(RuleAction $action, ActionExpression $expr) { $this->action = $action; - $this->evaluator = $evaluator; + $this->expr = $expr; } public function actOnArray(array $journal): bool @@ -58,7 +58,7 @@ class AddTag implements ActionInterface /** @var User $user */ $user = User::find($journal['user_id']); $factory->setUser($user); - $tagName = $this->evaluator->evaluate($journal); + $tagName = $this->expr->evaluate($journal); $tag = $factory->findOrCreate($tagName); if (null === $tag) { diff --git a/app/TransactionRules/Actions/AppendDescription.php b/app/TransactionRules/Actions/AppendDescription.php index 5f8fa29d66..f19927b62f 100644 --- a/app/TransactionRules/Actions/AppendDescription.php +++ b/app/TransactionRules/Actions/AppendDescription.php @@ -27,28 +27,28 @@ namespace FireflyIII\TransactionRules\Actions; use FireflyIII\Events\TriggeredAuditLog; use FireflyIII\Models\RuleAction; use FireflyIII\Models\TransactionJournal; -use FireflyIII\TransactionRules\Expressions\ActionExpressionEvaluator; +use FireflyIII\TransactionRules\Expressions\ActionExpression; /** * Class AppendDescription. */ class AppendDescription implements ActionInterface { - private RuleAction $action; - private ActionExpressionEvaluator $evaluator; + private RuleAction $action; + private ActionExpression $expr; /** * TriggerInterface constructor. */ - public function __construct(RuleAction $action, ActionExpressionEvaluator $evaluator) + public function __construct(RuleAction $action, ActionExpression $expr) { $this->action = $action; - $this->evaluator = $evaluator; + $this->expr = $expr; } public function actOnArray(array $journal): bool { - $actionValue = $this->evaluator->evaluate($journal); + $actionValue = $this->expr->evaluate($journal); $description = sprintf('%s %s', $journal['description'], $actionValue); \DB::table('transaction_journals')->where('id', $journal['transaction_journal_id'])->limit(1)->update(['description' => $description]); diff --git a/app/TransactionRules/Actions/AppendNotes.php b/app/TransactionRules/Actions/AppendNotes.php index 922be054d2..8b42680dd9 100644 --- a/app/TransactionRules/Actions/AppendNotes.php +++ b/app/TransactionRules/Actions/AppendNotes.php @@ -28,28 +28,28 @@ use FireflyIII\Events\TriggeredAuditLog; use FireflyIII\Models\Note; use FireflyIII\Models\RuleAction; use FireflyIII\Models\TransactionJournal; -use FireflyIII\TransactionRules\Expressions\ActionExpressionEvaluator; +use FireflyIII\TransactionRules\Expressions\ActionExpression; /** * Class AppendNotes. */ class AppendNotes implements ActionInterface { - private RuleAction $action; - private ActionExpressionEvaluator $evaluator; + private RuleAction $action; + private ActionExpression $expr; /** * TriggerInterface constructor. */ - public function __construct(RuleAction $action, ActionExpressionEvaluator $evaluator) + public function __construct(RuleAction $action, ActionExpression $expr) { $this->action = $action; - $this->evaluator = $evaluator; + $this->expr = $expr; } public function actOnArray(array $journal): bool { - $actionValue = $this->evaluator->evaluate($journal); + $actionValue = $this->expr->evaluate($journal); $dbNote = Note::where('noteable_id', (int)$journal['transaction_journal_id']) ->where('noteable_type', TransactionJournal::class) ->first(['notes.*']); diff --git a/app/TransactionRules/Actions/ConvertToDeposit.php b/app/TransactionRules/Actions/ConvertToDeposit.php index fedea72779..dbb8ffe9a8 100644 --- a/app/TransactionRules/Actions/ConvertToDeposit.php +++ b/app/TransactionRules/Actions/ConvertToDeposit.php @@ -35,28 +35,28 @@ use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionType; use FireflyIII\Repositories\Account\AccountRepositoryInterface; -use FireflyIII\TransactionRules\Expressions\ActionExpressionEvaluator; +use FireflyIII\TransactionRules\Expressions\ActionExpression; /** * Class ConvertToDeposit */ class ConvertToDeposit implements ActionInterface { - private RuleAction $action; - private ActionExpressionEvaluator $evaluator; + private RuleAction $action; + private ActionExpression $expr; /** * TriggerInterface constructor. */ - public function __construct(RuleAction $action, ActionExpressionEvaluator $evaluator) + public function __construct(RuleAction $action, ActionExpression $expr) { $this->action = $action; - $this->evaluator = $evaluator; + $this->expr = $expr; } public function actOnArray(array $journal): bool { - $actionValue = $this->evaluator->evaluate($journal); + $actionValue = $this->expr->evaluate($journal); // make object from array (so the data is fresh). /** @var null|TransactionJournal $object */ diff --git a/app/TransactionRules/Actions/ConvertToTransfer.php b/app/TransactionRules/Actions/ConvertToTransfer.php index 559125eced..bf9ede733f 100644 --- a/app/TransactionRules/Actions/ConvertToTransfer.php +++ b/app/TransactionRules/Actions/ConvertToTransfer.php @@ -34,23 +34,23 @@ use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionType; use FireflyIII\Repositories\Account\AccountRepositoryInterface; -use FireflyIII\TransactionRules\Expressions\ActionExpressionEvaluator; +use FireflyIII\TransactionRules\Expressions\ActionExpression; /** * Class ConvertToTransfer */ class ConvertToTransfer implements ActionInterface { - private RuleAction $action; - private ActionExpressionEvaluator $evaluator; + private RuleAction $action; + private ActionExpression $expr; /** * TriggerInterface constructor. */ - public function __construct(RuleAction $action, ActionExpressionEvaluator $evaluator) + public function __construct(RuleAction $action, ActionExpression $expr) { - $this->action = $action; - $this->evaluator = $evaluator; + $this->action = $action; + $this->expr = $expr; } /** @@ -59,7 +59,7 @@ class ConvertToTransfer implements ActionInterface */ public function actOnArray(array $journal): bool { - $actionValue = $this->evaluator->evaluate($journal); + $actionValue = $this->expr->evaluate($journal); // make object from array (so the data is fresh). /** @var null|TransactionJournal $object */ diff --git a/app/TransactionRules/Actions/ConvertToWithdrawal.php b/app/TransactionRules/Actions/ConvertToWithdrawal.php index 14725d1320..8af0a67a35 100644 --- a/app/TransactionRules/Actions/ConvertToWithdrawal.php +++ b/app/TransactionRules/Actions/ConvertToWithdrawal.php @@ -35,28 +35,28 @@ use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionType; use FireflyIII\Repositories\Account\AccountRepositoryInterface; -use FireflyIII\TransactionRules\Expressions\ActionExpressionEvaluator; +use FireflyIII\TransactionRules\Expressions\ActionExpression; /** * Class ConvertToWithdrawal */ class ConvertToWithdrawal implements ActionInterface { - private RuleAction $action; - private ActionExpressionEvaluator $evaluator; + private RuleAction $action; + private ActionExpression $expr; /** * TriggerInterface constructor. */ - public function __construct(RuleAction $action, ActionExpressionEvaluator $evaluator) + public function __construct(RuleAction $action, ActionExpression $expr) { $this->action = $action; - $this->evaluator = $evaluator; + $this->expr = $expr; } public function actOnArray(array $journal): bool { - $actionValue = $this->evaluator->evaluate($journal); + $actionValue = $this->expr->evaluate($journal); // make object from array (so the data is fresh). /** @var null|TransactionJournal $object */ diff --git a/app/TransactionRules/Actions/LinkToBill.php b/app/TransactionRules/Actions/LinkToBill.php index 677a3d2f46..6b9a49ed3a 100644 --- a/app/TransactionRules/Actions/LinkToBill.php +++ b/app/TransactionRules/Actions/LinkToBill.php @@ -30,7 +30,7 @@ use FireflyIII\Models\RuleAction; use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionType; use FireflyIII\Repositories\Bill\BillRepositoryInterface; -use FireflyIII\TransactionRules\Expressions\ActionExpressionEvaluator; +use FireflyIII\TransactionRules\Expressions\ActionExpression; use FireflyIII\User; /** @@ -38,16 +38,16 @@ use FireflyIII\User; */ class LinkToBill implements ActionInterface { - private RuleAction $action; - private ActionExpressionEvaluator $evaluator; + private RuleAction $action; + private ActionExpression $expr; /** * TriggerInterface constructor. */ - public function __construct(RuleAction $action, ActionExpressionEvaluator $evaluator) + public function __construct(RuleAction $action, ActionExpression $expr) { $this->action = $action; - $this->evaluator = $evaluator; + $this->expr = $expr; } public function actOnArray(array $journal): bool @@ -58,7 +58,7 @@ class LinkToBill implements ActionInterface /** @var BillRepositoryInterface $repository */ $repository = app(BillRepositoryInterface::class); $repository->setUser($user); - $billName = $this->evaluator->evaluate($journal); + $billName = $this->expr->evaluate($journal); $bill = $repository->findByName($billName); if (null !== $bill && TransactionType::WITHDRAWAL === $journal['transaction_type_type']) { diff --git a/app/TransactionRules/Actions/PrependDescription.php b/app/TransactionRules/Actions/PrependDescription.php index ba407f4cdb..2be503f475 100644 --- a/app/TransactionRules/Actions/PrependDescription.php +++ b/app/TransactionRules/Actions/PrependDescription.php @@ -27,28 +27,28 @@ namespace FireflyIII\TransactionRules\Actions; use FireflyIII\Events\TriggeredAuditLog; use FireflyIII\Models\RuleAction; use FireflyIII\Models\TransactionJournal; -use FireflyIII\TransactionRules\Expressions\ActionExpressionEvaluator; +use FireflyIII\TransactionRules\Expressions\ActionExpression; /** * Class PrependDescription. */ class PrependDescription implements ActionInterface { - private RuleAction $action; - private ActionExpressionEvaluator $evaluator; + private RuleAction $action; + private ActionExpression $expr; /** * TriggerInterface constructor. */ - public function __construct(RuleAction $action, ActionExpressionEvaluator $evaluator) + public function __construct(RuleAction $action, ActionExpression $expr) { $this->action = $action; - $this->evaluator = $evaluator; + $this->expr = $expr; } public function actOnArray(array $journal): bool { - $actionValue = $this->evaluator->evaluate($journal); + $actionValue = $this->expr->evaluate($journal); $before = $journal['description']; $after = sprintf('%s%s', $actionValue, $journal['description']); diff --git a/app/TransactionRules/Actions/PrependNotes.php b/app/TransactionRules/Actions/PrependNotes.php index d82cbe43b0..a9e9756755 100644 --- a/app/TransactionRules/Actions/PrependNotes.php +++ b/app/TransactionRules/Actions/PrependNotes.php @@ -28,28 +28,28 @@ use FireflyIII\Events\TriggeredAuditLog; use FireflyIII\Models\Note; use FireflyIII\Models\RuleAction; use FireflyIII\Models\TransactionJournal; -use FireflyIII\TransactionRules\Expressions\ActionExpressionEvaluator; +use FireflyIII\TransactionRules\Expressions\ActionExpression; /** * Class PrependNotes. */ class PrependNotes implements ActionInterface { - private RuleAction $action; - private ActionExpressionEvaluator $evaluator; + private RuleAction $action; + private ActionExpression $expr; /** * TriggerInterface constructor. */ - public function __construct(RuleAction $action, ActionExpressionEvaluator $evaluator) + public function __construct(RuleAction $action, ActionExpression $expr) { - $this->action = $action; - $this->evaluator = $evaluator; + $this->action = $action; + $this->expr = $expr; } public function actOnArray(array $journal): bool { - $actionValue = $this->evaluator->evaluate($journal); + $actionValue = $this->expr->evaluate($journal); $dbNote = Note::where('noteable_id', (int)$journal['transaction_journal_id']) ->where('noteable_type', TransactionJournal::class) ->first(['notes.*']); diff --git a/app/TransactionRules/Actions/RemoveTag.php b/app/TransactionRules/Actions/RemoveTag.php index 20693779bf..846bcbb05a 100644 --- a/app/TransactionRules/Actions/RemoveTag.php +++ b/app/TransactionRules/Actions/RemoveTag.php @@ -28,7 +28,7 @@ use FireflyIII\Events\Model\Rule\RuleActionFailedOnArray; use FireflyIII\Events\TriggeredAuditLog; use FireflyIII\Models\RuleAction; use FireflyIII\Models\TransactionJournal; -use FireflyIII\TransactionRules\Expressions\ActionExpressionEvaluator; +use FireflyIII\TransactionRules\Expressions\ActionExpression; use FireflyIII\User; /** @@ -36,22 +36,22 @@ use FireflyIII\User; */ class RemoveTag implements ActionInterface { - private RuleAction $action; - private ActionExpressionEvaluator $evaluator; + private RuleAction $action; + private ActionExpression $expr; /** * TriggerInterface constructor. */ - public function __construct(RuleAction $action, ActionExpressionEvaluator $evaluator) + public function __construct(RuleAction $action, ActionExpression $expr) { $this->action = $action; - $this->evaluator = $evaluator; + $this->expr = $expr; } public function actOnArray(array $journal): bool { // if tag does not exist, no need to continue: - $name = $this->evaluator->evaluate($journal); + $name = $this->expr->evaluate($journal); /** @var User $user */ $user = User::find($journal['user_id']); diff --git a/app/TransactionRules/Actions/SetBudget.php b/app/TransactionRules/Actions/SetBudget.php index 5dc595de3d..880d05bed8 100644 --- a/app/TransactionRules/Actions/SetBudget.php +++ b/app/TransactionRules/Actions/SetBudget.php @@ -29,7 +29,7 @@ use FireflyIII\Events\TriggeredAuditLog; use FireflyIII\Models\RuleAction; use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionType; -use FireflyIII\TransactionRules\Expressions\ActionExpressionEvaluator; +use FireflyIII\TransactionRules\Expressions\ActionExpression; use FireflyIII\User; /** @@ -37,23 +37,23 @@ use FireflyIII\User; */ class SetBudget implements ActionInterface { - private RuleAction $action; - private ActionExpressionEvaluator $evaluator; + private RuleAction $action; + private ActionExpression $expr; /** * TriggerInterface constructor. */ - public function __construct(RuleAction $action, ActionExpressionEvaluator $evaluator) + public function __construct(RuleAction $action, ActionExpression $expr) { $this->action = $action; - $this->evaluator = $evaluator; + $this->expr = $expr; } public function actOnArray(array $journal): bool { /** @var User $user */ $user = User::find($journal['user_id']); - $search = $this->evaluator->evaluate($journal); + $search = $this->expr->evaluate($journal); $budget = $user->budgets()->where('name', $search)->first(); if (null === $budget) { diff --git a/app/TransactionRules/Actions/SetCategory.php b/app/TransactionRules/Actions/SetCategory.php index fe8309647c..1c2ef454e3 100644 --- a/app/TransactionRules/Actions/SetCategory.php +++ b/app/TransactionRules/Actions/SetCategory.php @@ -29,7 +29,7 @@ use FireflyIII\Events\TriggeredAuditLog; use FireflyIII\Factory\CategoryFactory; use FireflyIII\Models\RuleAction; use FireflyIII\Models\TransactionJournal; -use FireflyIII\TransactionRules\Expressions\ActionExpressionEvaluator; +use FireflyIII\TransactionRules\Expressions\ActionExpression; use FireflyIII\User; /** @@ -37,23 +37,23 @@ use FireflyIII\User; */ class SetCategory implements ActionInterface { - private RuleAction $action; - private ActionExpressionEvaluator $evaluator; + private RuleAction $action; + private ActionExpression $expr; /** * TriggerInterface constructor. */ - public function __construct(RuleAction $action, ActionExpressionEvaluator $evaluator) + public function __construct(RuleAction $action, ActionExpression $expr) { $this->action = $action; - $this->evaluator = $evaluator; + $this->expr = $expr; } public function actOnArray(array $journal): bool { /** @var null|User $user */ $user = User::find($journal['user_id']); - $search = $this->evaluator->evaluate($journal); + $search = $this->expr->evaluate($journal); if (null === $user) { app('log')->error(sprintf('Journal has no valid user ID so action SetCategory("%s") cannot be applied', $search), $journal); event(new RuleActionFailedOnArray($this->action, $journal, trans('rules.no_such_journal'))); diff --git a/app/TransactionRules/Actions/SetDescription.php b/app/TransactionRules/Actions/SetDescription.php index 8ce0d001b5..3d55d2f0fe 100644 --- a/app/TransactionRules/Actions/SetDescription.php +++ b/app/TransactionRules/Actions/SetDescription.php @@ -27,23 +27,23 @@ namespace FireflyIII\TransactionRules\Actions; use FireflyIII\Events\TriggeredAuditLog; use FireflyIII\Models\RuleAction; use FireflyIII\Models\TransactionJournal; -use FireflyIII\TransactionRules\Expressions\ActionExpressionEvaluator; +use FireflyIII\TransactionRules\Expressions\ActionExpression; /** * Class SetDescription. */ class SetDescription implements ActionInterface { - private RuleAction $action; - private ActionExpressionEvaluator $evaluator; + private RuleAction $action; + private ActionExpression $expr; /** * TriggerInterface constructor. */ - public function __construct(RuleAction $action, ActionExpressionEvaluator $evaluator) + public function __construct(RuleAction $action, ActionExpression $expr) { $this->action = $action; - $this->evaluator = $evaluator; + $this->expr = $expr; } public function actOnArray(array $journal): bool @@ -51,7 +51,7 @@ class SetDescription implements ActionInterface /** @var TransactionJournal $object */ $object = TransactionJournal::where('user_id', $journal['user_id'])->find($journal['transaction_journal_id']); $before = $journal['description']; - $after = $this->evaluator->evaluate($journal); + $after = $this->expr->evaluate($journal); \DB::table('transaction_journals') ->where('id', '=', $journal['transaction_journal_id']) diff --git a/app/TransactionRules/Actions/SetNotes.php b/app/TransactionRules/Actions/SetNotes.php index 8abdf02f8c..6d5c86363d 100644 --- a/app/TransactionRules/Actions/SetNotes.php +++ b/app/TransactionRules/Actions/SetNotes.php @@ -28,23 +28,23 @@ use FireflyIII\Events\TriggeredAuditLog; use FireflyIII\Models\Note; use FireflyIII\Models\RuleAction; use FireflyIII\Models\TransactionJournal; -use FireflyIII\TransactionRules\Expressions\ActionExpressionEvaluator; +use FireflyIII\TransactionRules\Expressions\ActionExpression; /** * Class SetNotes. */ class SetNotes implements ActionInterface { - private RuleAction $action; - private ActionExpressionEvaluator $evaluator; + private RuleAction $action; + private ActionExpression $expr; /** * TriggerInterface constructor. */ - public function __construct(RuleAction $action, ActionExpressionEvaluator $evaluator) + public function __construct(RuleAction $action, ActionExpression $expr) { $this->action = $action; - $this->evaluator = $evaluator; + $this->expr = $expr; } public function actOnArray(array $journal): bool @@ -58,7 +58,7 @@ class SetNotes implements ActionInterface $dbNote->text = ''; } $oldNotes = $dbNote->text; - $newNotes = $this->evaluator->evaluate($journal); + $newNotes = $this->expr->evaluate($journal); $dbNote->text = $newNotes; $dbNote->save(); diff --git a/app/TransactionRules/Actions/UpdatePiggybank.php b/app/TransactionRules/Actions/UpdatePiggybank.php index 82061f9b10..4498dd3f7e 100644 --- a/app/TransactionRules/Actions/UpdatePiggybank.php +++ b/app/TransactionRules/Actions/UpdatePiggybank.php @@ -31,7 +31,7 @@ use FireflyIII\Models\RuleAction; use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionJournal; use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; -use FireflyIII\TransactionRules\Expressions\ActionExpressionEvaluator; +use FireflyIII\TransactionRules\Expressions\ActionExpression; use FireflyIII\User; /** @@ -39,23 +39,23 @@ use FireflyIII\User; */ class UpdatePiggybank implements ActionInterface { - private RuleAction $action; - private ActionExpressionEvaluator $evaluator; + private RuleAction $action; + private ActionExpression $expr; /** * TriggerInterface constructor. */ - public function __construct(RuleAction $action, ActionExpressionEvaluator $evaluator) + public function __construct(RuleAction $action, ActionExpression $expr) { $this->action = $action; - $this->evaluator = $evaluator; + $this->expr = $expr; } public function actOnArray(array $journal): bool { app('log')->debug(sprintf('Triggered rule action UpdatePiggybank on journal #%d', $journal['transaction_journal_id'])); - $piggyBankName = $this->evaluator->evaluate($journal); + $piggyBankName = $this->expr->evaluate($journal); // refresh the transaction type. /** @var User $user */ $user = User::find($journal['user_id']); diff --git a/app/TransactionRules/Expressions/ActionExpressionEvaluator.php b/app/TransactionRules/Expressions/ActionExpression.php similarity index 92% rename from app/TransactionRules/Expressions/ActionExpressionEvaluator.php rename to app/TransactionRules/Expressions/ActionExpression.php index 7e0b1a3175..1d498ea78e 100644 --- a/app/TransactionRules/Expressions/ActionExpressionEvaluator.php +++ b/app/TransactionRules/Expressions/ActionExpression.php @@ -1,7 +1,7 @@ expressionLanguage = $expressionLanguage; + $this->expressionLanguage = app(ExpressionLanguage::class); $this->expr = $expr; $this->isExpression = self::isExpression($expr); diff --git a/app/TransactionRules/Factory/ActionFactory.php b/app/TransactionRules/Factory/ActionFactory.php index a34bf7615b..c20120d807 100644 --- a/app/TransactionRules/Factory/ActionFactory.php +++ b/app/TransactionRules/Factory/ActionFactory.php @@ -28,8 +28,7 @@ use FireflyIII\Exceptions\FireflyException; use FireflyIII\Models\RuleAction; use FireflyIII\Support\Domain; use FireflyIII\TransactionRules\Actions\ActionInterface; -use FireflyIII\TransactionRules\Expressions\ActionExpressionEvaluator; -use FireflyIII\TransactionRules\Factory\ExpressionLanguageFactory; +use FireflyIII\TransactionRules\Expressions\ActionExpression; /** * Class ActionFactory can create actions. @@ -52,10 +51,9 @@ class ActionFactory $class = self::getActionClass($action->action_type); app('log')->debug(sprintf('self::getActionClass("%s") = "%s"', $action->action_type, $class)); - $expressionLanguage = ExpressionLanguageFactory::get(); - $expressionEvaluator = new ActionExpressionEvaluator($expressionLanguage, $action->action_value); + $expr = new ActionExpression($action->action_value); - return new $class($action, $expressionEvaluator); // @phpstan-ignore-line + return new $class($action, $expr); // @phpstan-ignore-line } /** diff --git a/app/TransactionRules/Factory/ExpressionLanguageFactory.php b/app/TransactionRules/Factory/ExpressionLanguageFactory.php deleted file mode 100644 index 3225da66c3..0000000000 --- a/app/TransactionRules/Factory/ExpressionLanguageFactory.php +++ /dev/null @@ -1,45 +0,0 @@ -. - */ - -declare(strict_types=1); - -namespace FireflyIII\TransactionRules\Factory; - -use Symfony\Component\ExpressionLanguage\ExpressionLanguage; -use FireflyIII\TransactionRules\Expressions\ActionExpressionLanguageProvider; - -class ExpressionLanguageFactory -{ - protected static ExpressionLanguage $expressionLanguage; - - private static function constructExpressionLanguage(): ExpressionLanguage - { - $expressionLanguage = new ExpressionLanguage(); - $expressionLanguage->registerProvider(new ActionExpressionLanguageProvider()); - return $expressionLanguage; - } - - public static function get(): ExpressionLanguage - { - return self::$expressionLanguage ??= self::constructExpressionLanguage(); - } -} diff --git a/app/Validation/FireflyValidator.php b/app/Validation/FireflyValidator.php index bcfb1c3d46..667e3c1411 100644 --- a/app/Validation/FireflyValidator.php +++ b/app/Validation/FireflyValidator.php @@ -35,8 +35,7 @@ use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; use FireflyIII\Services\Password\Verifier; use FireflyIII\Support\ParseDateString; -use FireflyIII\TransactionRules\Expressions\ActionExpressionEvaluator; -use FireflyIII\TransactionRules\Factory\ExpressionLanguageFactory; +use FireflyIII\TransactionRules\Expressions\ActionExpression; use FireflyIII\User; use Illuminate\Validation\Validator; use PragmaRX\Google2FA\Exceptions\IncompatibleWithGoogleAuthenticatorException; @@ -258,20 +257,16 @@ class FireflyValidator extends Validator public function validateRuleActionExpression(string $attribute, string $value = null): bool { $value ??= ''; + $expr = new ActionExpression($value); - $el = ExpressionLanguageFactory::get(); - $evaluator = new ActionExpressionEvaluator($el, $value); - - return $evaluator->isValid(); + return $expr->isValid(); } public function replaceRuleActionExpression(string $message, string $attribute): string { $value = $this->getValue($attribute); - - $el = ExpressionLanguageFactory::get(); - $evaluator = new ActionExpressionEvaluator($el, $value); - $err = $evaluator->getValidationError(); + $expr = new ActionExpression($value); + $err = $expr->getValidationError(); if ($err == null) { return $message;