invoiceninja / invoiceninja

Invoices, Expenses and Tasks built with Laravel, Flutter and React

Home Page:https://invoiceninja.com

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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

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

image

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.