API: Improve error message for using an undefined array_key in a request (found in POST request for payments)
CodeShakingSheep opened this issue · comments
Setup
- Version: 5.8.38
- Environment: ZIP
Interface
- Flutter: []
- React: []
- Both: [x]
Checklist
- Can you replicate the issue on our v5 demo site https://demo.invoiceninja.com or https://react.invoicing.co/demo?
- Have you searched existing issues?
- Have you reported this to Slack/forum before posting?
- Have you inspected the logs in storage/logs/laravel.log for any errors?
Describe the bug
The API returns a HTTP 500 error for creating a payment via POST request when I accidentally used an undefined array key.
Steps To Reproduce
Send a HTTP POST request against https://<INVOICE_NINJA_URL>/api/v1/payments
with an undefined array key, such as invoice_id:
(note the faulty colon inside the array key). For example use this body:
{
"client_id": "{{CLIENT_ID}}",
"user_id": "{{USER_ID}}",
"amount": "66",
"paymentables": {
"invoice_id:": "{{INVOICE_ID}}",
"amount": "66"
},
"invoices": [
{
"invoice_id:": "{{INVOICE_ID}}",
"amount": "66"
}
]
}
Expected Behavior
The API should return an appropriate error message about what exactly is wrong with the body. I would suggest to use the error message from the logs Undefined array key "invoice_id"
.
Additional context
I just wanted to create a payment via API for a given invoice and accidentally used an undefined array key (note the faulty colon inside invoice_id:
). FYI, when I removed the faulty colon, everything was working fine. So, low prio for me. This issue is just about improving the error message to make debugging easier for devs.
Screenshots
Logs
[2024-04-22 21:44:03] production.ERROR: Undefined array key "invoice_id" {"userId":1,"exception":"[object] (ErrorException(code: 0): Undefined array key \"invoice_id\" at /var/www/invoiceninja5/app/Http/Requests/Payment/StorePaymentReque>
[stacktrace]
#0 /var/www/invoiceninja5/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php(255): Illuminate\\Foundation\\Bootstrap\\HandleExceptions->handleError()
#1 /var/www/invoiceninja5/app/Http/Requests/Payment/StorePaymentRequest.php(97): Illuminate\\Foundation\\Bootstrap\\HandleExceptions->Illuminate\\Foundation\\Bootstrap\\{closure}()
#2 /var/www/invoiceninja5/vendor/laravel/framework/src/Illuminate/Validation/ValidatesWhenResolvedTrait.php(19): App\\Http\\Requests\\Payment\\StorePaymentRequest->prepareForValidation()
#3 /var/www/invoiceninja5/vendor/laravel/framework/src/Illuminate/Foundation/Providers/FormRequestServiceProvider.php(30): Illuminate\\Foundation\\Http\\FormRequest->validateResolved()
#4 /var/www/invoiceninja5/vendor/laravel/framework/src/Illuminate/Container/Container.php(1302): Illuminate\\Foundation\\Providers\\FormRequestServiceProvider->Illuminate\\Foundation\\Providers\\{closure}()
#5 /var/www/invoiceninja5/vendor/laravel/framework/src/Illuminate/Container/Container.php(1266): Illuminate\\Container\\Container->fireCallbackArray()
#6 /var/www/invoiceninja5/vendor/laravel/framework/src/Illuminate/Container/Container.php(1252): Illuminate\\Container\\Container->fireAfterResolvingCallbacks()
#7 /var/www/invoiceninja5/vendor/laravel/framework/src/Illuminate/Container/Container.php(813): Illuminate\\Container\\Container->fireResolvingCallbacks()
#8 /var/www/invoiceninja5/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(957): Illuminate\\Container\\Container->resolve()
#9 /var/www/invoiceninja5/vendor/laravel/framework/src/Illuminate/Container/Container.php(731): Illuminate\\Foundation\\Application->resolve()
#10 /var/www/invoiceninja5/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(942): Illuminate\\Container\\Container->make()
#11 /var/www/invoiceninja5/vendor/laravel/framework/src/Illuminate/Routing/ResolvesRouteDependencies.php(85): Illuminate\\Foundation\\Application->make()
#12 /var/www/invoiceninja5/vendor/laravel/framework/src/Illuminate/Routing/ResolvesRouteDependencies.php(50): Illuminate\\Routing\\ControllerDispatcher->transformDependency()
#13 /var/www/invoiceninja5/vendor/laravel/framework/src/Illuminate/Routing/ResolvesRouteDependencies.php(29): Illuminate\\Routing\\ControllerDispatcher->resolveMethodDependencies()
#14 /var/www/invoiceninja5/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(59): Illuminate\\Routing\\ControllerDispatcher->resolveClassMethodDependencies()
#15 /var/www/invoiceninja5/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(40): Illuminate\\Routing\\ControllerDispatcher->resolveParameters()
#16 /var/www/invoiceninja5/vendor/sentry/sentry-laravel/src/Sentry/Laravel/Tracing/Routing/TracingControllerDispatcherTracing.php(21): Illuminate\\Routing\\ControllerDispatcher->dispatch()
#17 /var/www/invoiceninja5/vendor/sentry/sentry-laravel/src/Sentry/Laravel/Tracing/Routing/TracingRoutingDispatcher.php(19): Sentry\\Laravel\\Tracing\\Routing\\TracingControllerDispatcherTracing->Sentry\\Laravel\\Tracing\\Routing\\{closu>
#18 /var/www/invoiceninja5/vendor/sentry/sentry-laravel/src/Sentry/Laravel/Tracing/Routing/TracingControllerDispatcherTracing.php(20): Sentry\\Laravel\\Tracing\\Routing\\TracingRoutingDispatcher->wrapRouteDispatch()
#19 /var/www/invoiceninja5/vendor/laravel/framework/src/Illuminate/Routing/Route.php(259): Sentry\\Laravel\\Tracing\\Routing\\TracingControllerDispatcherTracing->dispatch()
#20 /var/www/invoiceninja5/vendor/laravel/framework/src/Illuminate/Routing/Route.php(205): Illuminate\\Routing\\Route->runController()
#21 /var/www/invoiceninja5/vendor/laravel/framework/src/Illuminate/Routing/Router.php(806): Illuminate\\Routing\\Route->run()
#22 /var/www/invoiceninja5/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Routing\\Router->Illuminate\\Routing\\{closure}()
#23 /var/www/invoiceninja5/vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php(122): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#24 /var/www/invoiceninja5/vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php(87): Illuminate\\Routing\\Middleware\\ThrottleRequests->handleRequestUsingNamedLimiter()
#25 /var/www/invoiceninja5/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Routing\\Middleware\\ThrottleRequests->handle()
#26 /var/www/invoiceninja5/app/Http/Middleware/QueryLogging.php(39): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#27 /var/www/invoiceninja5/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): App\\Http\\Middleware\\QueryLogging->handle()
#28 /var/www/invoiceninja5/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(50): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#29 /var/www/invoiceninja5/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\\Routing\\Middleware\\SubstituteBindings->handle()
#30 /var/www/invoiceninja5/app/Http/Middleware/Locale.php(87): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#31 /var/www/invoiceninja5/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): App\\Http\\Middleware\\Locale->handle()
#32 /var/www/invoiceninja5/app/Http/Middleware/TokenAuth.php(102): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#33 /var/www/invoiceninja5/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): App\\Http\\Middleware\\TokenAuth->handle()
#34 /var/www/invoiceninja5/app/Http/Middleware/SetDb.php(40): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#35 /var/www/invoiceninja5/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): App\\Http\\Middleware\\SetDb->handle()
#36 /var/www/invoiceninja5/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#37 /var/www/invoiceninja5/vendor/laravel/framework/src/Illuminate/Routing/Router.php(805): Illuminate\\Pipeline\\Pipeline->then()
#38 /var/www/invoiceninja5/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\\Routing\\Router->runRouteWithinStack()
#39 /var/www/invoiceninja5/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\\Routing\\Router->runRoute()
#40 /var/www/invoiceninja5/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\\Routing\\Router->dispatchToRoute()
#41 /var/www/invoiceninja5/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\\Routing\\Router->dispatch()
#42 /var/www/invoiceninja5/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}()
#43 /var/www/invoiceninja5/vendor/sentry/sentry-laravel/src/Sentry/Laravel/Http/SetRequestIpMiddleware.php(45): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#44 /var/www/invoiceninja5/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Sentry\\Laravel\\Http\\SetRequestIpMiddleware->handle()
#45 /var/www/invoiceninja5/vendor/sentry/sentry-laravel/src/Sentry/Laravel/Http/SetRequestMiddleware.php(31): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#46 /var/www/invoiceninja5/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Sentry\\Laravel\\Http\\SetRequestMiddleware->handle()
#47 /var/www/invoiceninja5/vendor/livewire/livewire/src/Features/SupportDisablingBackButtonCache/DisableBackButtonCacheMiddleware.php(19): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#48 /var/www/invoiceninja5/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Livewire\\Features\\SupportDisablingBackButtonCache\\DisableBackButtonCacheMiddleware->handle()
Thanks for reporting this one, i've checked in a fix.