Update validators so they can handle one field at a time.

This commit is contained in:
James Cole
2021-03-10 06:34:03 +01:00
parent 5f4b025be5
commit 238a582d8a
23 changed files with 413 additions and 223 deletions

View File

@@ -74,7 +74,7 @@ class UpdateController extends Controller
*/
public function update(UpdateRequest $request, TransactionGroup $transactionGroup): JsonResponse
{
Log::debug('Now in update routine.');
Log::debug('Now in update routine for transaction group!');
$data = $request->getAll();
$transactionGroup = $this->groupRepository->update($transactionGroup, $data);
$manager = $this->getManager();

View File

@@ -56,15 +56,9 @@ class UpdateController extends Controller
*/
public function update(UpdateRequest $request, TransactionJournalLink $journalLink): JsonResponse
{
$manager = $this->getManager();
$data = $request->getAll();
$data['inward'] = $this->journalRepository->findNull($data['inward_id'] ?? 0);
$data['outward'] = $this->journalRepository->findNull($data['outward_id'] ?? 0);
if (null === $data['inward'] || null === $data['outward']) {
throw new FireflyException('200024: Source or destination does not exist.');
}
$data['direction'] = 'inward';
$journalLink = $this->repository->updateLink($journalLink, $data);
$manager = $this->getManager();
$data = $request->getAll();
$journalLink = $this->repository->updateLink($journalLink, $data);
/** @var TransactionLinkTransformer $transformer */
$transformer = app(TransactionLinkTransformer::class);

View File

@@ -61,8 +61,6 @@ class UpdateRequest extends FormRequest
'include_net_worth' => $includeNetWorth,
'account_type' => $this->nullableString('type'),
'account_type_id' => null,
'currency_id' => $this->nullableInteger('currency_id'),
'currency_code' => $this->nullableString('currency_code'),
'virtual_balance' => $this->nullableString('virtual_balance'),
'iban' => $this->nullableString('iban'),
'BIC' => $this->nullableString('bic'),
@@ -80,6 +78,12 @@ class UpdateRequest extends FormRequest
if (null !== $this->get('order')) {
$data['order'] = $this->integer('order');
}
if (null !== $this->get('currency_id')) {
$data['currency_id'] = $this->nullableInteger('currency_id');
}
if (null !== $this->get('currency_code')) {
$data['currency_code'] = $this->nullableString('currency_code');
}
$data = $this->appendLocationData($data, null);

View File

@@ -50,9 +50,6 @@ class UpdateRequest extends FormRequest
private array $stringFields;
private array $textareaFields;
/**
* Get all data. Is pretty complex because of all the ??-statements.
*
@@ -125,12 +122,13 @@ class UpdateRequest extends FormRequest
$this->arrayFields = [
'tags',
];
$data = [
'transactions' => $this->getTransactionData(),
'apply_rules' => $this->boolean('apply_rules', true),
];
$data = [];
if ($this->has('transactions')) {
$data['transactions'] = $this->getTransactionData();
}
if ($this->has('apply_rules')) {
$data['apply_rules'] = $this->boolean('apply_rules', true);
}
if ($this->has('group_title')) {
$data['group_title'] = $this->string('group_title');
}
@@ -147,19 +145,24 @@ class UpdateRequest extends FormRequest
{
Log::debug('Now in getTransactionData()');
$return = [];
if (!is_countable($this->get('transactions'))) {
return $return;
}
/**
* @var int $index
* @var array $transaction
*/
foreach ($this->get('transactions') as $transaction) {
// default response is to update nothing in the transaction:
$current = [];
$current = $this->getIntegerData($current, $transaction);
$current = $this->getStringData($current, $transaction);
$current = $this->getNlStringData($current, $transaction);
$current = $this->getDateData($current, $transaction);
$current = $this->getBooleanData($current, $transaction);
$current = $this->getArrayData($current, $transaction);
$current = [];
$current = $this->getIntegerData($current, $transaction);
$current = $this->getStringData($current, $transaction);
$current = $this->getNlStringData($current, $transaction);
$current = $this->getDateData($current, $transaction);
$current = $this->getBooleanData($current, $transaction);
$current = $this->getArrayData($current, $transaction);
$return[] = $current;
}
@@ -177,7 +180,7 @@ class UpdateRequest extends FormRequest
{
foreach ($this->integerFields as $fieldName) {
if (array_key_exists($fieldName, $transaction)) {
$current[$fieldName] = $this->integerFromValue((string) $transaction[$fieldName]);
$current[$fieldName] = $this->integerFromValue((string)$transaction[$fieldName]);
}
}
@@ -194,7 +197,7 @@ class UpdateRequest extends FormRequest
{
foreach ($this->stringFields as $fieldName) {
if (array_key_exists($fieldName, $transaction)) {
$current[$fieldName] = $this->stringFromValue((string) $transaction[$fieldName]);
$current[$fieldName] = $this->stringFromValue((string)$transaction[$fieldName]);
}
}
@@ -211,7 +214,7 @@ class UpdateRequest extends FormRequest
{
foreach ($this->textareaFields as $fieldName) {
if (array_key_exists($fieldName, $transaction)) {
$current[$fieldName] = $this->nlStringFromValue((string) $transaction[$fieldName]);
$current[$fieldName] = $this->nlStringFromValue((string)$transaction[$fieldName]);
}
}
@@ -229,8 +232,8 @@ class UpdateRequest extends FormRequest
foreach ($this->dateFields as $fieldName) {
Log::debug(sprintf('Now at date field %s', $fieldName));
if (array_key_exists($fieldName, $transaction)) {
Log::debug(sprintf('New value: "%s"', (string) $transaction[$fieldName]));
$current[$fieldName] = $this->dateFromValue((string) $transaction[$fieldName]);
Log::debug(sprintf('New value: "%s"', (string)$transaction[$fieldName]));
$current[$fieldName] = $this->dateFromValue((string)$transaction[$fieldName]);
}
}
@@ -247,7 +250,7 @@ class UpdateRequest extends FormRequest
{
foreach ($this->booleanFields as $fieldName) {
if (array_key_exists($fieldName, $transaction)) {
$current[$fieldName] = $this->convertBoolean((string) $transaction[$fieldName]);
$current[$fieldName] = $this->convertBoolean((string)$transaction[$fieldName]);
}
}
@@ -362,21 +365,18 @@ class UpdateRequest extends FormRequest
$transactionGroup = $this->route()->parameter('transactionGroup');
$validator->after(
function (Validator $validator) use ($transactionGroup) {
// must submit at least one transaction.
$this->validateOneTransaction($validator);
// if more than one, verify that there are journal ID's present.
$this->validateJournalIds($validator, $transactionGroup);
// all transaction types must be equal:
$this->validateTransactionTypesForUpdate($validator);
$this->validateTransactionTypesForUpdate($validator, $transactionGroup);
// validate source/destination is equal, depending on the transaction journal type.
$this->validateEqualAccountsForUpdate($validator, $transactionGroup);
// validate that the currency fits the source and/or destination account.
// validate all account info
$this->validateAccountInformationUpdate($validator);
$this->validateAccountInformationUpdate($validator, $transactionGroup);
}
);

View File

@@ -45,23 +45,22 @@ class UpdateRequest extends FormRequest
*/
public function getAll(): array
{
$enabled = true;
$default = false;
if (null !== $this->get('enabled')) {
$enabled = $this->boolean('enabled');
}
if (null !== $this->get('default')) {
$default = $this->boolean('default');
}
return [
'name' => $this->string('name'),
'code' => $this->string('code'),
'symbol' => $this->string('symbol'),
'decimal_places' => $this->integer('decimal_places'),
'default' => $default,
'enabled' => $enabled,
// return nothing that isn't explicitely in the array:
// this is the way
$fields = [
'name' => ['name', 'string'],
'code' => ['code', 'string'],
'symbol' => ['symbol', 'string'],
'decimal_places' => ['decimal_places', 'integer'],
'default' => ['default', 'boolean'],
'enabled' => ['enabled', 'boolean'],
];
// this is the way.
$return = $this->getAllData($fields);
return $return;
}
/**
@@ -71,7 +70,8 @@ class UpdateRequest extends FormRequest
*/
public function rules(): array
{
$currency = $this->route()->parameter('currency_code');
$currency = $this->route()->parameter('currency_code');
return [
'name' => sprintf('between:1,255|unique:transaction_currencies,name,%d', $currency->id),
'code' => sprintf('between:3,3|unique:transaction_currencies,code,%d', $currency->id),

View File

@@ -23,6 +23,7 @@ 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;
@@ -50,7 +51,7 @@ class UpdateRequest extends FormRequest
'link_type_name' => $this->string('link_type_name'),
'inward_id' => $this->integer('inward_id'),
'outward_id' => $this->integer('outward_id'),
'notes' => $this->nlString('notes'),
'notes' => $this->nullableNlString('notes'),
];
}
@@ -81,7 +82,7 @@ class UpdateRequest extends FormRequest
{
$validator->after(
function (Validator $validator) {
$this->validateExistingLink($validator);
$this->validateUpdate($validator);
}
);
}
@@ -89,42 +90,41 @@ class UpdateRequest extends FormRequest
/**
* @param Validator $validator
*/
private function validateExistingLink(Validator $validator): void
private function validateUpdate(Validator $validator): void
{
/** @var User $user */
$user = auth()->user();
/** @var TransactionJournalLink $existing */
$existing = $this->route()->parameter('journalLink');
$data = $validator->getData();
/** @var LinkTypeRepositoryInterface $repository */
$repository = app(LinkTypeRepositoryInterface::class);
$repository->setUser($user);
$repository->setUser(auth()->user());
/** @var JournalRepositoryInterface $journalRepos */
$journalRepos = app(JournalRepositoryInterface::class);
$journalRepos->setUser($user);
$journalRepos->setUser(auth()->user());
$data = $validator->getData();
$inwardId = (int) ($data['inward_id'] ?? 0);
$outwardId = (int) ($data['outward_id'] ?? 0);
$inward = $journalRepos->findNull($inwardId);
$outward = $journalRepos->findNull($outwardId);
$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', 'Invalid inward ID.');
$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 (null === $outward) {
$validator->errors()->add('outward_id', 'Invalid outward ID.');
return;
}
if ($repository->findLink($inward, $outward)) {
// only if not updating:
$link = $this->route()->parameter('journalLink');
if (null === $link) {
$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.');
}
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.');
}
}
}

View File

@@ -63,9 +63,9 @@ class UpdateRequest extends FormRequest
{
$linkType = $this->route()->parameter('linkType');
return [
'name' => ['required', Rule::unique('link_types', 'name')->ignore($linkType->id), 'min:1'],
'outward' => ['required', 'different:inward', Rule::unique('link_types', 'outward')->ignore($linkType->id), 'min:1'],
'inward' => ['required', 'different:outward', Rule::unique('link_types', 'inward')->ignore($linkType->id), 'min:1'],
'name' => [Rule::unique('link_types', 'name')->ignore($linkType->id), 'min:1'],
'outward' => ['different:inward', Rule::unique('link_types', 'outward')->ignore($linkType->id), 'min:1'],
'inward' => ['different:outward', Rule::unique('link_types', 'inward')->ignore($linkType->id), 'min:1'],
];
}
}