Skip to content

Commit a97014c

Browse files
authored
feat(http): map uploaded files into the request properties (#702)
1 parent 8e6b650 commit a97014c

File tree

6 files changed

+38
-2
lines changed

6 files changed

+38
-2
lines changed

src/Tempest/Http/src/IsRequest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ public function __construct(
2727
) {
2828
$this->path ??= $this->resolvePath();
2929
$this->query ??= $this->resolveQuery();
30+
$this->files ??= [];
3031
}
3132

3233
public function get(string $key, mixed $default = null): mixed

src/Tempest/Http/src/Mappers/PsrRequestToRequestMapper.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ public function map(mixed $from, mixed $to): array|object
5454
'query' => $query,
5555
'files' => $uploads,
5656
...$data,
57+
...$uploads,
5758
])->to($requestClass);
5859

5960
$validator = new Validator();

src/Tempest/Http/src/Mappers/RequestToPsrRequestMapper.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ public function map(mixed $from, mixed $to): PsrRequest
2727
cookieParams: $from->getCookies(),
2828
queryParams: $from->getQuery(),
2929
parsedBody: $from->getBody(),
30+
uploadedFiles: $from->getFiles()
3031
);
3132
}
3233
}

src/Tempest/Mapper/src/Mappers/ArrayToObjectMapper.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,9 +160,9 @@ private function resolveValueFromArray(
160160

161161
$caster = $this->casterFactory->forProperty($property);
162162

163-
foreach ($data as $item) {
163+
foreach ($data as $key => $item) {
164164
if (! is_array($item)) {
165-
$values[] = $caster?->cast($item) ?? $item;
165+
$values[$key] = $caster?->cast($item) ?? $item;
166166

167167
continue;
168168
}

tests/Fixtures/Modules/Books/Requests/CreateBookRequest.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,13 @@
66

77
use Tempest\Http\IsRequest;
88
use Tempest\Http\Request;
9+
use Tempest\Http\Upload;
910

1011
final class CreateBookRequest implements Request
1112
{
1213
use IsRequest;
1314

1415
public string $title;
16+
17+
public Upload $cover;
1518
}

tests/Integration/Mapper/PsrRequestToRequestMapperTest.php

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
use Tempest\Http\Request;
1111
use Tempest\Http\Upload;
1212
use Tempest\Mapper\Exceptions\MissingValuesException;
13+
use function Tempest\Support\arr;
14+
use Tests\Tempest\Fixtures\Modules\Books\Requests\CreateBookRequest;
1315
use Tests\Tempest\Fixtures\Modules\Posts\PostRequest;
1416
use Tests\Tempest\Integration\FrameworkIntegrationTestCase;
1517

@@ -113,4 +115,32 @@ public function test_files(): void
113115
$this->assertSame('hello', $upload->getClientFilename());
114116
$this->assertSame('application/octet-stream', $upload->getClientMediaType());
115117
}
118+
119+
public function test_map_upload_file_into_request_property(): void
120+
{
121+
$currentPath = __DIR__ . '/Fixtures/upload.txt';
122+
123+
$mapper = new PsrRequestToRequestMapper();
124+
125+
$psrRequest = $this->http->makePsrRequest(
126+
uri: '/books',
127+
body: ['title' => 'Timeline Taxi'],
128+
files: ['cover' => new UploadedFile(
129+
streamOrFile: $currentPath,
130+
size: null,
131+
errorStatus: UPLOAD_ERR_OK,
132+
)]
133+
);
134+
135+
$request = $mapper->map(
136+
from: $psrRequest,
137+
to: CreateBookRequest::class
138+
);
139+
140+
$this->assertInstanceOf(CreateBookRequest::class, $request);
141+
$this->assertInstanceOf(Upload::class, $request->cover);
142+
143+
$this->assertEquals('cover', array_key_first($request->getFiles()));
144+
$this->assertTrue(arr($request->getFiles())->isAssoc());
145+
}
116146
}

0 commit comments

Comments
 (0)