Users API: Fixed sending invite when using form requests

- Cast send_invite value in cases where it might not have been a boolean,
  which occurs on non-JSON requests.
- Added test to cover.
- Updated API docs to mention and shown boolean usage.
This commit is contained in:
Dan Brown 2023-12-13 15:11:42 +00:00
parent 4896c4047f
commit 56d07f1909
No known key found for this signature in database
GPG Key ID: 46D9F943C24A2EF9
3 changed files with 27 additions and 2 deletions

View File

@ -90,7 +90,7 @@ class UserApiController extends ApiController
public function create(Request $request) public function create(Request $request)
{ {
$data = $this->validate($request, $this->rules()['create']); $data = $this->validate($request, $this->rules()['create']);
$sendInvite = ($data['send_invite'] ?? false) === true; $sendInvite = boolval($data['send_invite'] ?? false) === true;
$user = null; $user = null;
DB::transaction(function () use ($data, $sendInvite, &$user) { DB::transaction(function () use ($data, $sendInvite, &$user) {

View File

@ -66,6 +66,12 @@
</em> </em>
</p> </p>
<p>
<em>
* Form requests can accept boolean (<code>true</code>/<code>false</code>) values via a <code>1</code> or <code>0</code>.
</em>
</p>
<p> <p>
Regardless of format chosen, ensure you set a <code>Content-Type</code> header on requests so that the system can correctly parse your request data. Regardless of format chosen, ensure you set a <code>Content-Type</code> header on requests so that the system can correctly parse your request data.
The API is primarily designed to be interfaced using JSON, since responses are always in JSON format, hence examples in this documentation will be shown as JSON. The API is primarily designed to be interfaced using JSON, since responses are always in JSON format, hence examples in this documentation will be shown as JSON.
@ -82,17 +88,19 @@
<pre><code class="language-json">{ <pre><code class="language-json">{
"name": "My new item", "name": "My new item",
"locked": true,
"books": [105, 263], "books": [105, 263],
"tags": [{"name": "Tag Name", "value": "Tag Value"}], "tags": [{"name": "Tag Name", "value": "Tag Value"}],
}</code></pre> }</code></pre>
<p><strong>x-www-form-urlencoded</strong></p> <p><strong>x-www-form-urlencoded</strong></p>
<pre><code class="language-text">name=My%20new%20item&books%5B0%5D=105&books%5B1%5D=263&tags%5B0%5D%5Bname%5D=Tag%20Name&tags%5B0%5D%5Bvalue%5D=Tag%20Value</code></pre> <pre><code class="language-text">name=My%20new%20item&locked=1&books%5B0%5D=105&books%5B1%5D=263&tags%5B0%5D%5Bname%5D=Tag%20Name&tags%5B0%5D%5Bvalue%5D=Tag%20Value</code></pre>
<p><strong>x-www-form-urlencoded (Decoded for readability)</strong></p> <p><strong>x-www-form-urlencoded (Decoded for readability)</strong></p>
<pre><code class="language-text">name=My new item <pre><code class="language-text">name=My new item
locked=1
books[0]=105 books[0]=105
books[1]=263 books[1]=263
tags[0][name]=Tag Name tags[0][name]=Tag Name

View File

@ -143,6 +143,23 @@ class UsersApiTest extends TestCase
Notification::assertSentTo($user, UserInviteNotification::class); Notification::assertSentTo($user, UserInviteNotification::class);
} }
public function test_create_with_send_invite_works_with_value_of_1()
{
$this->actingAsApiAdmin();
Notification::fake();
$resp = $this->postJson($this->baseEndpoint, [
'name' => 'Benny Boris',
'email' => 'bboris@example.com',
'send_invite' => '1', // Submissions via x-www-form-urlencoded/form-data may use 1 instead of boolean
]);
$resp->assertStatus(200);
/** @var User $user */
$user = User::query()->where('email', '=', 'bboris@example.com')->first();
Notification::assertSentTo($user, UserInviteNotification::class);
}
public function test_create_name_and_email_validation() public function test_create_name_and_email_validation()
{ {
$this->actingAsApiAdmin(); $this->actingAsApiAdmin();