. */ namespace FireflyIII\Api\V1\Requests; use Carbon\Carbon; use FireflyIII\Models\Account; use FireflyIII\Models\AccountType; use FireflyIII\Repositories\Account\AccountRepositoryInterface; use Illuminate\Support\Collection; use Log; /** * Class RuleGroupTriggerRequest */ class RuleGroupTriggerRequest extends Request { /** * Authorize logged in users. * * @return bool */ public function authorize(): bool { // Only allow authenticated users return auth()->check(); } /** * @return array */ public function getTriggerParameters(): array { $return = [ 'start_date' => $this->getDate('start_date'), 'end_date' => $this->getDate('end_date'), 'accounts' => $this->getAccounts(), ]; return $return; } /** * @return array */ public function rules(): array { return [ 'start_date' => 'required|date', 'end_date' => 'required|date|after:start_date', ]; } /** * @param string $field * @return Carbon|null */ private function getDate(string $field): ?Carbon { /** @var Carbon $result */ $result = null === $this->query($field) ? null : Carbon::createFromFormat('Y-m-d', $this->query($field)); return $result; } /** * @return Collection */ private function getAccounts(): Collection { $accountList = '' === (string)$this->query('accounts') ? [] : explode(',', $this->query('accounts')); $accounts = new Collection; /** @var AccountRepositoryInterface $accountRepository */ $accountRepository = app(AccountRepositoryInterface::class); foreach ($accountList as $accountId) { Log::debug(sprintf('Searching for asset account with id "%s"', $accountId)); $account = $accountRepository->findNull((int)$accountId); if ($this->validAccount($account)) { Log::debug(sprintf('Found account #%d ("%s") and its an asset account', $account->id, $account->name)); $accounts->push($account); } } return $accounts; } /** * @param Account|null $account * @return bool */ private function validAccount(?Account $account): bool { return null !== $account && AccountType::ASSET === $account->accountType->type; } }