. */ declare(strict_types=1); namespace FireflyIII\Api\V1\Requests\Models\TransactionLink; use FireflyIII\Models\TransactionJournalLink; use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use FireflyIII\Repositories\LinkType\LinkTypeRepositoryInterface; use FireflyIII\Support\Request\ChecksLogin; use FireflyIII\Support\Request\ConvertsDataTypes; use FireflyIII\User; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Validation\Validator; /** * Class UpdateRequest */ class UpdateRequest extends FormRequest { use ConvertsDataTypes, ChecksLogin; /** * Get all data from the request. * * @return array */ public function getAll(): array { return [ 'link_type_id' => $this->integer('link_type_id'), 'link_type_name' => $this->string('link_type_name'), 'inward_id' => $this->integer('inward_id'), 'outward_id' => $this->integer('outward_id'), 'notes' => $this->nullableNlString('notes'), ]; } /** * The rules that the incoming request must be matched against. * * @return array */ public function rules(): array { return [ 'link_type_id' => 'exists:link_types,id', 'link_type_name' => 'exists:link_types,name', 'inward_id' => 'belongsToUser:transaction_journals,id|different:outward_id', 'outward_id' => 'belongsToUser:transaction_journals,id|different:inward_id', 'notes' => 'between:0,65000', ]; } /** * Configure the validator instance. * * @param Validator $validator * * @return void */ public function withValidator(Validator $validator): void { $validator->after( function (Validator $validator) { $this->validateUpdate($validator); } ); } /** * @param Validator $validator */ private function validateUpdate(Validator $validator): void { /** @var TransactionJournalLink $existing */ $existing = $this->route()->parameter('journalLink'); $data = $validator->getData(); /** @var LinkTypeRepositoryInterface $repository */ $repository = app(LinkTypeRepositoryInterface::class); $repository->setUser(auth()->user()); /** @var JournalRepositoryInterface $journalRepos */ $journalRepos = app(JournalRepositoryInterface::class); $journalRepos->setUser(auth()->user()); $inwardId = $data['inward_id'] ?? $existing->source_id; $outwardId = $data['outward_id'] ?? $existing->destination_id; $inward = $journalRepos->findNull((int)$inwardId); $outward = $journalRepos->findNull((int)$outwardId); if($inward->id === $outward->id) { $validator->errors()->add('inward_id', 'Inward ID must be different from outward ID.'); $validator->errors()->add('outward_id', 'Inward ID must be different from outward ID.'); } if (null === $inward) { $validator->errors()->add('inward_id', 'This is not a valid inward journal.'); } if(null === $outward) { $validator->errors()->add('inward_id', 'This is not a valid outward journal.'); } $inDB =$repository->findSpecificLink($existing->linkType, $inward, $outward); if(null === $inDB) { return; } if($inDB->id !== $existing->id) { $validator->errors()->add('outward_id', 'Already have a link between inward and outward.'); $validator->errors()->add('inward_id', 'Already have a link between inward and outward.'); } } }