refactor(banking): derive credential validation rules from the registry

Add BankingProvider::credentialRules(); the connect Form Requests and the
update request now derive their credential rules from it instead of each
hardcoding them. Removes the rule double-definition (e.g. the Coinbase regex
and IB minimums) so they can no longer drift. Connect-only params (country)
and custom messages stay in their requests.
This commit is contained in:
Víctor Falcón 2026-06-23 09:57:09 +02:00
parent ab04258e68
commit 52c00fbc05
8 changed files with 31 additions and 23 deletions

View File

@ -70,6 +70,23 @@ enum BankingProvider: string
};
}
/**
* Validation rules for this provider's credential inputs, keyed by input
* name. Shared by the connect Form Requests and the update request.
*
* @return array<string, array<int, mixed>>
*/
public function credentialRules(): array
{
$rules = [];
foreach ($this->credentialFields() as $field) {
$rules[$field->input] = $field->rules;
}
return $rules;
}
/**
* Map validated request input to the encrypted connection columns.
*

View File

@ -2,6 +2,7 @@
namespace App\Http\Requests\OpenBanking;
use App\Enums\BankingProvider;
use Illuminate\Foundation\Http\FormRequest;
class ConnectBinanceRequest extends FormRequest
@ -17,8 +18,7 @@ class ConnectBinanceRequest extends FormRequest
public function rules(): array
{
return [
'api_key' => ['required', 'string', 'min:10'],
'api_secret' => ['required', 'string', 'min:10'],
...BankingProvider::Binance->credentialRules(),
'country' => ['required', 'string', 'size:2'],
];
}

View File

@ -2,6 +2,7 @@
namespace App\Http\Requests\OpenBanking;
use App\Enums\BankingProvider;
use Illuminate\Foundation\Http\FormRequest;
class ConnectBitpandaRequest extends FormRequest
@ -17,7 +18,7 @@ class ConnectBitpandaRequest extends FormRequest
public function rules(): array
{
return [
'api_key' => ['required', 'string', 'min:10'],
...BankingProvider::Bitpanda->credentialRules(),
'country' => ['required', 'string', 'size:2'],
];
}

View File

@ -2,6 +2,7 @@
namespace App\Http\Requests\OpenBanking;
use App\Enums\BankingProvider;
use Illuminate\Foundation\Http\FormRequest;
class ConnectCoinbaseRequest extends FormRequest
@ -17,8 +18,7 @@ class ConnectCoinbaseRequest extends FormRequest
public function rules(): array
{
return [
'api_key_name' => ['required', 'string', 'regex:/^(organizations\/[a-z0-9-]+\/apiKeys\/[a-z0-9-]+|[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12})$/i'],
'private_key' => ['required', 'string', 'min:40'],
...BankingProvider::Coinbase->credentialRules(),
'country' => ['required', 'string', 'size:2'],
];
}

View File

@ -2,6 +2,7 @@
namespace App\Http\Requests\OpenBanking;
use App\Enums\BankingProvider;
use Illuminate\Foundation\Http\FormRequest;
class ConnectIndexaCapitalRequest extends FormRequest
@ -16,8 +17,6 @@ class ConnectIndexaCapitalRequest extends FormRequest
*/
public function rules(): array
{
return [
'api_token' => ['required', 'string', 'min:10'],
];
return BankingProvider::IndexaCapital->credentialRules();
}
}

View File

@ -2,6 +2,7 @@
namespace App\Http\Requests\OpenBanking;
use App\Enums\BankingProvider;
use Illuminate\Foundation\Http\FormRequest;
class ConnectInteractiveBrokersRequest extends FormRequest
@ -16,9 +17,6 @@ class ConnectInteractiveBrokersRequest extends FormRequest
*/
public function rules(): array
{
return [
'token' => ['required', 'string', 'min:10'],
'query_id' => ['required', 'string', 'min:3'],
];
return BankingProvider::InteractiveBrokers->credentialRules();
}
}

View File

@ -2,6 +2,7 @@
namespace App\Http\Requests\OpenBanking;
use App\Enums\BankingProvider;
use Illuminate\Foundation\Http\FormRequest;
class ConnectWiseRequest extends FormRequest
@ -12,13 +13,11 @@ class ConnectWiseRequest extends FormRequest
}
/**
* @return array<string, array<int, string>>
* @return array<string, array<mixed>>
*/
public function rules(): array
{
return [
'api_token' => ['required', 'string', 'min:10'],
];
return BankingProvider::Wise->credentialRules();
}
/**

View File

@ -26,12 +26,6 @@ class UpdateConnectionCredentialsRequest extends FormRequest
return [];
}
$rules = [];
foreach ($connection->provider->credentialFields() as $field) {
$rules[$field->input] = $field->rules;
}
return $rules;
return $connection->provider->credentialRules();
}
}