diff --git a/app/Http/Controllers/API/v1/TransactionController.php b/app/Http/Controllers/API/v1/TransactionController.php index 3ff48cb..7dd998a 100644 --- a/app/Http/Controllers/API/v1/TransactionController.php +++ b/app/Http/Controllers/API/v1/TransactionController.php @@ -7,8 +7,6 @@ use App\Jobs\RecurrentTransactionJob; use App\Models\RecurringTransactionRule; use App\Models\Transaction; -use App\Rules\Iso8601DateTime; -use App\Rules\ValidateClientId; use App\Services\FileService; use App\Services\RecurringTransactionService; use Illuminate\Http\JsonResponse; @@ -17,6 +15,8 @@ use OpenApi\Attributes as OA; use Symfony\Component\HttpKernel\Exception\HttpException; use Throwable; +use App\Http\Requests\StoreTransactionRequest; +use App\Http\Requests\UpdateTransactionRequest; #[OA\Tag(name: 'Transactions', description: 'Endpoints for managing transactions')] class TransactionController extends ApiController @@ -291,33 +291,10 @@ enum: ['daily', 'weekly', 'monthly', 'yearly'] /** * @SuppressWarnings(PHPMD.NPathComplexity) */ - public function store(Request $request): JsonResponse + public function store(StoreTransactionRequest $request): JsonResponse { - $validationResult = $this->validateRequest($request, [ - 'client_id' => ['nullable', 'string', new ValidateClientId()], - 'amount' => 'required|numeric|min:0.01', - 'type' => 'required|string|in:income,expense', - 'description' => 'nullable|string', - 'datetime' => ['nullable', new Iso8601DateTime()], - 'created_at' => ['nullable', new Iso8601DateTime()], - 'group_id' => 'nullable|integer|exists:groups,id', - 'party_id' => 'nullable|integer|exists:parties,id', - 'wallet_id' => 'required|integer|exists:wallets,id', - 'categories' => 'nullable|array', - 'is_recurring' => 'nullable|boolean', - 'recurrence_period' => 'nullable|string|in:daily,weekly,monthly,yearly', - 'recurrence_interval' => 'nullable|integer|min:1', - 'recurrence_ends_at' => ['nullable', 'date', 'after:today', new Iso8601DateTime()], - 'categories.*' => 'integer|exists:categories,id', - 'files' => 'nullable|array', - 'files.*' => 'file|mimes:' . FileService::ALLOWED_EXTENSIONS . '|max:' . FileService::MAX_KILOBYTES, - ]); - - if (! $validationResult['isValidated']) { - return $this->failure($validationResult['message'], $validationResult['code'], $validationResult['errors']); - } - $data = $validationResult['data']; + $data = $request->validated(); $user = $request->user(); if (! empty($data['client_id'])) { @@ -611,31 +588,9 @@ public function show($transactionId, Request $request): JsonResponse /** * @SuppressWarnings(PHPMD.NPathComplexity) */ - public function update(Request $request, $transactionId): JsonResponse + public function update(UpdateTransactionRequest $request, $transactionId): JsonResponse { - $validationResult = $this->validateRequest($request, [ - 'client_id' => ['nullable', 'string', new ValidateClientId()], - 'amount' => 'nullable|numeric|min:0.01', - 'type' => 'nullable|string|in:income,expense', - 'datetime' => ['nullable', new Iso8601DateTime()], - 'description' => 'nullable|string', - 'party_id' => 'nullable|integer|exists:parties,id', - 'wallet_id' => 'sometimes|integer|exists:wallets,id', - 'group_id' => 'nullable|integer|exists:groups,id', - 'categories' => 'nullable|array', - 'categories.*' => 'integer|exists:categories,id', - 'is_recurring' => 'nullable|boolean', - 'recurrence_period' => 'nullable|string|in:daily,weekly,monthly,yearly', - 'recurrence_interval' => 'nullable|integer|min:1', - 'recurrence_ends_at' => ['nullable', 'date', 'after:today', new Iso8601DateTime()], - 'updated_at' => ['nullable', new Iso8601DateTime()], - ]); - - if (! $validationResult['isValidated']) { - return $this->failure($validationResult['message'], $validationResult['code'], $validationResult['errors']); - } - - $validatedData = $validationResult['data']; + $validatedData = $request->validated(); $recurringTransactionData = []; if (isset($validatedData['is_recurring']) && $validatedData['is_recurring']) { diff --git a/app/Http/Requests/ApiFormRequest.php b/app/Http/Requests/ApiFormRequest.php new file mode 100644 index 0000000..498ebfc --- /dev/null +++ b/app/Http/Requests/ApiFormRequest.php @@ -0,0 +1,30 @@ +json([ + 'success' => false, + 'message' => __('Server failed to validate request.'), + 'errors' => $validator->errors()->toArray(), + ], 422); + + throw new HttpResponseException($response); + } +} diff --git a/app/Http/Requests/FileImportApiRequest.php b/app/Http/Requests/FileImportApiRequest.php index b7309f4..f3b77f1 100644 --- a/app/Http/Requests/FileImportApiRequest.php +++ b/app/Http/Requests/FileImportApiRequest.php @@ -2,9 +2,9 @@ namespace App\Http\Requests; -use Illuminate\Foundation\Http\FormRequest; +// use Illuminate\Foundation\Http\FormRequest; -class FileImportApiRequest extends FormRequest +class FileImportApiRequest extends ApiFormRequest { /** * Get the validation rules that apply to the request. diff --git a/app/Http/Requests/FixFailedImportsRequest.php b/app/Http/Requests/FixFailedImportsRequest.php index 71e7db4..597f1f6 100644 --- a/app/Http/Requests/FixFailedImportsRequest.php +++ b/app/Http/Requests/FixFailedImportsRequest.php @@ -2,9 +2,9 @@ namespace App\Http\Requests; -use Illuminate\Foundation\Http\FormRequest; +// use Illuminate\Foundation\Http\FormRequest; -class FixFailedImportsRequest extends FormRequest +class FixFailedImportsRequest extends ApiFormRequest { /** * Get the validation rules that apply to the request. diff --git a/app/Http/Requests/ImportAnalyzeRequest.php b/app/Http/Requests/ImportAnalyzeRequest.php index f40fda9..e3a8d33 100644 --- a/app/Http/Requests/ImportAnalyzeRequest.php +++ b/app/Http/Requests/ImportAnalyzeRequest.php @@ -2,9 +2,9 @@ namespace App\Http\Requests; -use Illuminate\Foundation\Http\FormRequest; +// use Illuminate\Foundation\Http\FormRequest; -class ImportAnalyzeRequest extends FormRequest +class ImportAnalyzeRequest extends ApiFormRequest { public function rules(): array { diff --git a/app/Http/Requests/ImportConfirmRequest.php b/app/Http/Requests/ImportConfirmRequest.php index 35e0d37..ff7d0b4 100644 --- a/app/Http/Requests/ImportConfirmRequest.php +++ b/app/Http/Requests/ImportConfirmRequest.php @@ -2,9 +2,9 @@ namespace App\Http\Requests; -use Illuminate\Foundation\Http\FormRequest; +// use Illuminate\Foundation\Http\FormRequest; -class ImportConfirmRequest extends FormRequest +class ImportConfirmRequest extends ApiFormRequest { public function rules(): array { diff --git a/app/Http/Requests/StoreTransactionRequest.php b/app/Http/Requests/StoreTransactionRequest.php new file mode 100644 index 0000000..9860178 --- /dev/null +++ b/app/Http/Requests/StoreTransactionRequest.php @@ -0,0 +1,50 @@ +|string> + */ + public function rules(): array + { + return [ + 'convert_myself_to_transfer' => 'sometimes|boolean', + 'client_id' => ['nullable', 'string', new ValidateClientId()], + 'amount' => 'required|numeric|min:0.01', + 'type' => 'required|string|in:income,expense', + 'description' => 'nullable|string', + 'datetime' => ['nullable', new Iso8601DateTime()], + 'created_at' => ['nullable', new Iso8601DateTime()], + 'group_id' => 'nullable|integer|exists:groups,id', + 'party_id' => 'nullable|integer|exists:parties,id', + 'wallet_id' => 'required|integer|exists:wallets,id', + 'categories' => 'nullable|array', + 'categories.*' => 'integer|exists:categories,id', + 'is_recurring' => 'nullable|boolean', + 'recurrence_period' => 'nullable|string|in:daily,weekly,monthly,yearly', + 'recurrence_interval' => 'nullable|integer|min:1', + 'recurrence_ends_at' => ['nullable', 'date', 'after:today', new Iso8601DateTime()], + 'files' => 'nullable|array', + 'files.*' => 'file|mimes:' . FileService::ALLOWED_EXTENSIONS . '|max:' . FileService::MAX_KILOBYTES, + 'from_wallet_id' => 'required_if:convert_myself_to_transfer,true|integer|exists:wallets,id', + ]; + } +} diff --git a/app/Http/Requests/UpdateTransactionRequest.php b/app/Http/Requests/UpdateTransactionRequest.php new file mode 100644 index 0000000..a31fef9 --- /dev/null +++ b/app/Http/Requests/UpdateTransactionRequest.php @@ -0,0 +1,45 @@ +|string> + */ + public function rules(): array + { + return [ + 'client_id' => ['nullable', 'string', new ValidateClientId()], + 'amount' => 'nullable|numeric|min:0.01', + 'type' => 'nullable|string|in:income,expense', + 'datetime' => ['nullable', new Iso8601DateTime()], + 'description' => 'nullable|string', + 'party_id' => 'nullable|integer|exists:parties,id', + 'wallet_id' => 'sometimes|integer|exists:wallets,id', + 'group_id' => 'nullable|integer|exists:groups,id', + 'categories' => 'nullable|array', + 'categories.*' => 'integer|exists:categories,id', + 'is_recurring' => 'nullable|boolean', + 'recurrence_period' => 'nullable|string|in:daily,weekly,monthly,yearly', + 'recurrence_interval' => 'nullable|integer|min:1', + 'recurrence_ends_at' => ['nullable', 'date', 'after:today', new Iso8601DateTime()], + 'updated_at' => ['nullable', new Iso8601DateTime()], + ]; + } +}