From 967ea6a181579c236984739994c8d2895c1b8fee Mon Sep 17 00:00:00 2001 From: James Cole Date: Thu, 22 Aug 2019 17:56:48 +0200 Subject: [PATCH] Another fix for #2440 --- .../V1/Requests/RecurrenceStoreRequest.php | 35 +++++++++++++++- .../V1/Requests/RecurrenceUpdateRequest.php | 39 ++++++++++++++++- app/Api/V1/Requests/Request.php | 42 ------------------- app/Validation/RecurrenceValidation.php | 2 +- 4 files changed, 73 insertions(+), 45 deletions(-) diff --git a/app/Api/V1/Requests/RecurrenceStoreRequest.php b/app/Api/V1/Requests/RecurrenceStoreRequest.php index e0da572014..45c5461944 100644 --- a/app/Api/V1/Requests/RecurrenceStoreRequest.php +++ b/app/Api/V1/Requests/RecurrenceStoreRequest.php @@ -23,6 +23,9 @@ declare(strict_types=1); namespace FireflyIII\Api\V1\Requests; +use Carbon\Carbon; +use FireflyIII\Rules\BelongsUser; +use FireflyIII\Rules\IsBoolean; use FireflyIII\Validation\RecurrenceValidation; use FireflyIII\Validation\TransactionValidation; use Illuminate\Validation\Validator; @@ -52,7 +55,37 @@ class RecurrenceStoreRequest extends Request */ public function rules(): array { - return $this->rulesRecurrence(); + $today = Carbon::now()->addDay(); + + return [ + 'type' => 'required|in:withdrawal,transfer,deposit', + 'title' => 'required|between:1,255|uniqueObjectForUser:recurrences,title', + 'description' => 'between:1,65000', + 'first_date' => sprintf('required|date|after:%s', $today->format('Y-m-d')), + 'apply_rules' => [new IsBoolean], + 'active' => [new IsBoolean], + 'repeat_until' => sprintf('date|after:%s', $today->format('Y-m-d')), + 'nr_of_repetitions' => 'numeric|between:1,31', + 'tags' => 'between:1,64000', + 'piggy_bank_id' => 'numeric', + 'repetitions.*.type' => 'required|in:daily,weekly,ndom,monthly,yearly', + 'repetitions.*.moment' => 'between:0,10', + 'repetitions.*.skip' => 'required|numeric|between:0,31', + 'repetitions.*.weekend' => 'required|numeric|min:1|max:4', + 'transactions.*.description' => 'required|between:1,255', + 'transactions.*.amount' => 'required|numeric|more:0', + 'transactions.*.foreign_amount' => 'numeric|more:0', + 'transactions.*.currency_id' => 'numeric|exists:transaction_currencies,id', + 'transactions.*.currency_code' => 'min:3|max:3|exists:transaction_currencies,code', + 'transactions.*.foreign_currency_id' => 'numeric|exists:transaction_currencies,id', + 'transactions.*.foreign_currency_code' => 'min:3|max:3|exists:transaction_currencies,code', + 'transactions.*.budget_id' => ['mustExist:budgets,id', new BelongsUser], + 'transactions.*.category_name' => 'between:1,255|nullable', + 'transactions.*.source_id' => ['numeric', 'nullable', new BelongsUser], + 'transactions.*.source_name' => 'between:1,255|nullable', + 'transactions.*.destination_id' => ['numeric', 'nullable', new BelongsUser], + 'transactions.*.destination_name' => 'between:1,255|nullable', + ]; } /** diff --git a/app/Api/V1/Requests/RecurrenceUpdateRequest.php b/app/Api/V1/Requests/RecurrenceUpdateRequest.php index f487c8c0d4..3a5e4f603e 100644 --- a/app/Api/V1/Requests/RecurrenceUpdateRequest.php +++ b/app/Api/V1/Requests/RecurrenceUpdateRequest.php @@ -23,6 +23,10 @@ declare(strict_types=1); namespace FireflyIII\Api\V1\Requests; +use Carbon\Carbon; +use FireflyIII\Models\Recurrence; +use FireflyIII\Rules\BelongsUser; +use FireflyIII\Rules\IsBoolean; use FireflyIII\Validation\RecurrenceValidation; use FireflyIII\Validation\TransactionValidation; use Illuminate\Validation\Validator; @@ -52,7 +56,40 @@ class RecurrenceUpdateRequest extends Request */ public function rules(): array { - return $this->rulesRecurrence(); + /** @var Recurrence $recurrence */ + $recurrence = $this->route()->parameter('recurrence'); + $first = clone $recurrence->first_date; + $first->subDay(); + + return [ + 'type' => 'required|in:withdrawal,transfer,deposit', + 'title' => sprintf('required|between:1,255|uniqueObjectForUser:recurrences,title,%d', $recurrence->id), + 'description' => 'between:1,65000', + 'first_date' => sprintf('required|date|after:%s', $first->format('Y-m-d')), + 'apply_rules' => [new IsBoolean], + 'active' => [new IsBoolean], + 'repeat_until' => sprintf('date|after:%s', $first->format('Y-m-d')), + 'nr_of_repetitions' => 'numeric|between:1,31', + 'tags' => 'between:1,64000', + 'piggy_bank_id' => 'numeric', + 'repetitions.*.type' => 'required|in:daily,weekly,ndom,monthly,yearly', + 'repetitions.*.moment' => 'between:0,10', + 'repetitions.*.skip' => 'required|numeric|between:0,31', + 'repetitions.*.weekend' => 'required|numeric|min:1|max:4', + 'transactions.*.description' => 'required|between:1,255', + 'transactions.*.amount' => 'required|numeric|more:0', + 'transactions.*.foreign_amount' => 'numeric|more:0', + 'transactions.*.currency_id' => 'numeric|exists:transaction_currencies,id', + 'transactions.*.currency_code' => 'min:3|max:3|exists:transaction_currencies,code', + 'transactions.*.foreign_currency_id' => 'numeric|exists:transaction_currencies,id', + 'transactions.*.foreign_currency_code' => 'min:3|max:3|exists:transaction_currencies,code', + 'transactions.*.budget_id' => ['mustExist:budgets,id', new BelongsUser], + 'transactions.*.category_name' => 'between:1,255|nullable', + 'transactions.*.source_id' => ['numeric', 'nullable', new BelongsUser], + 'transactions.*.source_name' => 'between:1,255|nullable', + 'transactions.*.destination_id' => ['numeric', 'nullable', new BelongsUser], + 'transactions.*.destination_name' => 'between:1,255|nullable', + ]; } /** diff --git a/app/Api/V1/Requests/Request.php b/app/Api/V1/Requests/Request.php index 2173e08560..076b0e16ad 100644 --- a/app/Api/V1/Requests/Request.php +++ b/app/Api/V1/Requests/Request.php @@ -121,48 +121,6 @@ class Request extends FireflyIIIRequest return $return; } - /** - * The rules that the incoming request must be matched against. - * - * @return array - */ - protected function rulesRecurrence(): array - { - $today = Carbon::now()->addDay(); - - return [ - 'type' => 'required|in:withdrawal,transfer,deposit', - 'title' => 'required|between:1,255|uniqueObjectForUser:recurrences,title', - 'description' => 'between:1,65000', - 'first_date' => sprintf('required|date|after:%s', $today->format('Y-m-d')), - 'apply_rules' => [new IsBoolean], - 'active' => [new IsBoolean], - 'repeat_until' => sprintf('date|after:%s', $today->format('Y-m-d')), - 'nr_of_repetitions' => 'numeric|between:1,31', - 'tags' => 'between:1,64000', - 'piggy_bank_id' => 'numeric', - 'repetitions.*.type' => 'required|in:daily,weekly,ndom,monthly,yearly', - 'repetitions.*.moment' => 'between:0,10', - 'repetitions.*.skip' => 'required|numeric|between:0,31', - 'repetitions.*.weekend' => 'required|numeric|min:1|max:4', - 'transactions.*.description' => 'required|between:1,255', - 'transactions.*.amount' => 'required|numeric|more:0', - 'transactions.*.foreign_amount' => 'numeric|more:0', - 'transactions.*.currency_id' => 'numeric|exists:transaction_currencies,id', - 'transactions.*.currency_code' => 'min:3|max:3|exists:transaction_currencies,code', - 'transactions.*.foreign_currency_id' => 'numeric|exists:transaction_currencies,id', - 'transactions.*.foreign_currency_code' => 'min:3|max:3|exists:transaction_currencies,code', - 'transactions.*.budget_id' => ['mustExist:budgets,id', new BelongsUser], - 'transactions.*.category_name' => 'between:1,255|nullable', - 'transactions.*.source_id' => ['numeric', 'nullable', new BelongsUser], - 'transactions.*.source_name' => 'between:1,255|nullable', - 'transactions.*.destination_id' => ['numeric', 'nullable', new BelongsUser], - 'transactions.*.destination_name' => 'between:1,255|nullable', - - - ]; - } - /** * Returns the repetition data as it is found in the submitted data. * diff --git a/app/Validation/RecurrenceValidation.php b/app/Validation/RecurrenceValidation.php index 88ae0c3e7c..999ca3eda3 100644 --- a/app/Validation/RecurrenceValidation.php +++ b/app/Validation/RecurrenceValidation.php @@ -82,7 +82,7 @@ trait RecurrenceValidation * @var array $repetition */ foreach ($repetitions as $index => $repetition) { - switch ($repetition['type']) { + switch ($repetition['type'] ?? 'empty') { default: $validator->errors()->add(sprintf('repetitions.%d.type', $index), (string)trans('validation.valid_recurrence_rep_type'));