Skip to content

Commit 99a0422

Browse files
committed
wip
1 parent 973968c commit 99a0422

18 files changed

+50
-60
lines changed

src/Enums/BuiltInType.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ enum BuiltInType: string
88
case Array = 'array';
99
case Iterable = 'iterable';
1010

11-
case Integer = 'int';
11+
case Integer = 'integer';
1212
case Float = 'float';
1313

1414
case String = 'string';

src/Mapper.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use Illuminate\Foundation\Http\FormRequest;
66
use Illuminate\Http\Request;
7+
use Illuminate\Support\Collection;
78
use OpenSoutheners\LaravelDto\DataTransferObjects\MappingValue;
89
use OpenSoutheners\LaravelDto\Enums\BuiltInType;
910
use ReflectionClass;
@@ -50,6 +51,7 @@ protected function takeDataFrom(mixed $input): mixed
5051
is_object($input->route()) ? $input->route()->parameters() : [],
5152
$input instanceof FormRequest ? $input->validated() : $input->all()
5253
),
54+
$input instanceof Collection => $input->all(),
5355
is_object($input) => $this->extractProperties($input),
5456
default => $input,
5557
};

src/Mappers/CollectionPropertyMapper.php renamed to src/Mappers/CollectionDataMapper.php

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -32,34 +32,26 @@ public function assert(MappingValue $mappingValue): bool
3232
*/
3333
public function resolve(MappingValue $mappingValue): mixed
3434
{
35-
if ($mappingValue->objectClass === Collection::class) {
36-
return $mappingValue->data instanceof EloquentCollection
37-
? $mappingValue->data->toBase()
38-
: $mappingValue->data;
35+
if ($mappingValue->objectClass === EloquentCollection::class) {
36+
return $mappingValue->data->toBase();
3937
}
40-
41-
$propertyType = reset($mappingValue->types);
42-
38+
4339
if (
4440
count(array_filter($mappingValue->types, fn (Type $type) => $type->getBuiltinType() === Type::BUILTIN_TYPE_STRING)) > 0
4541
&& ! str_contains($mappingValue->types, ',')
4642
) {
4743
return $mappingValue->data;
4844
}
4945

50-
if (is_json_structure($mappingValue->data)) {
51-
$collection = Collection::make(json_decode($mappingValue->data, true));
52-
} else {
53-
$collection = Collection::make(
54-
is_array($mappingValue->data)
55-
? $mappingValue->data
56-
: explode(',', $mappingValue->data)
57-
);
58-
}
46+
$collection = match (true) {
47+
is_json_structure($mappingValue->data) => Collection::make(json_decode($mappingValue->data, true)),
48+
is_string($mappingValue->data) => Collection::make(explode(',', $mappingValue->data)),
49+
default => Collection::make($mappingValue->data),
50+
};
5951

60-
$collectionTypes = $propertyType->getCollectionValueTypes();
52+
$collectionTypes = $mappingValue->preferredType->getCollectionValueTypes();
6153

62-
$preferredCollectionType = reset($collectionTypes);
54+
$preferredCollectionType = head($collectionTypes);
6355
$preferredCollectionTypeClass = $preferredCollectionType ? $preferredCollectionType->getClassName() : null;
6456

6557
$collection = $collection->map(fn ($value) => is_string($value) ? trim($value) : $value)
@@ -75,7 +67,7 @@ public function resolve(MappingValue $mappingValue): mixed
7567
}
7668
}
7769

78-
if ($propertyType->getBuiltinType() === Type::BUILTIN_TYPE_ARRAY) {
70+
if ($mappingValue->preferredType->getBuiltinType() === Type::BUILTIN_TYPE_ARRAY) {
7971
$collection = $collection->all();
8072
}
8173

File renamed without changes.

src/Mappers/ObjectPropertyMapper.php renamed to src/Mappers/ObjectDataMapper.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ public function resolve(MappingValue $mappingValue): mixed
8282
continue;
8383
}
8484

85-
$preferredType = reset($propertyTypes);
85+
$preferredType = $propertyTypes[0] ?? null;
8686
$propertyTypesClasses = array_filter(array_map(fn (Type $type) => $type->getClassName(), $propertyTypes));
8787
$preferredTypeClass = $preferredType->getClassName();
8888

src/ServiceProvider.php

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,20 @@
77
use OpenSoutheners\LaravelDto\Attributes\Validate;
88
use OpenSoutheners\LaravelDto\Commands\DtoMakeCommand;
99
use OpenSoutheners\LaravelDto\Commands\DtoTypescriptGenerateCommand;
10-
use OpenSoutheners\LaravelDto\Contracts\DataTransferObject;
11-
use OpenSoutheners\LaravelDto\PropertyMappers\PropertyMapper;
10+
use OpenSoutheners\LaravelDto\Contracts\RouteTransferableObject;
11+
use OpenSoutheners\LaravelDto\Mappers;
1212
use ReflectionClass;
1313

1414
class ServiceProvider extends BaseServiceProvider
1515
{
1616
protected static $mappers = [
17-
PropertyMappers\CollectionPropertyMapper::class,
18-
PropertyMappers\ModelPropertyMapper::class,
19-
20-
PropertyMappers\CarbonPropertyMapper::class,
21-
PropertyMappers\BackedEnumPropertyMapper::class,
22-
PropertyMappers\GenericObjectPropertyMapper::class,
23-
PropertyMappers\ObjectPropertyMapper::class,
17+
Mappers\CollectionDataMapper::class,
18+
Mappers\ModelDataMapper::class,
2419

20+
Mappers\CarbonDataMapper::class,
21+
Mappers\BackedEnumDataMapper::class,
22+
Mappers\GenericObjectDataMapper::class,
23+
Mappers\ObjectDataMapper::class,
2524
];
2625

2726
/**
@@ -40,7 +39,7 @@ public function boot()
4039
}
4140

4241
$this->app->beforeResolving(
43-
DataTransferObject::class,
42+
RouteTransferableObject::class,
4443
function ($dataClass, $parameters, $app) {
4544
/** @var \Illuminate\Foundation\Application $app */
4645
$app->scoped($dataClass, function () use ($dataClass, $app) {
@@ -70,7 +69,7 @@ public function register()
7069
/**
7170
* Register new dynamic mappers.
7271
*/
73-
public function registerMapper(string|array $mapper, bool $replacing = false): void
72+
public static function registerMapper(string|array $mapper, bool $replacing = false): void
7473
{
7574
$mappers = (array) $mapper;
7675

@@ -89,7 +88,7 @@ public static function getMappers(): array
8988
foreach (static::$mappers as $mapper) {
9089
$mapperInstance = new $mapper;
9190

92-
if ($mapperInstance instanceof PropertyMapper) {
91+
if ($mapperInstance instanceof Mappers\DataMapper) {
9392
$mappers[] = $mapperInstance;
9493
}
9594
}

tests/Unit/DataTransferObjectTest.php

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@
88
use Illuminate\Support\Carbon;
99
use Illuminate\Support\Collection;
1010
use Mockery;
11-
use OpenSoutheners\LaravelDto\ObjectMapper;
11+
use OpenSoutheners\LaravelDto\Mappers;
12+
use OpenSoutheners\LaravelDto\ServiceProvider;
1213
use PHPUnit\Framework\TestCase;
1314
use Workbench\App\DataTransferObjects\CreateComment;
1415
use Workbench\App\DataTransferObjects\CreateManyPostData;
@@ -23,13 +24,14 @@ protected function setUp(): void
2324
{
2425
parent::setUp();
2526

26-
ObjectMapper::registerMapper([
27-
new PropertyMappers\ModelPropertyMapper,
28-
new PropertyMappers\CollectionPropertyMapper,
29-
new PropertyMappers\ObjectPropertyMapper,
30-
new PropertyMappers\GenericObjectPropertyMapper,
31-
new PropertyMappers\CarbonPropertyMapper,
32-
new PropertyMappers\BackedEnumPropertyMapper,
27+
ServiceProvider::registerMapper([
28+
Mappers\CollectionDataMapper::class,
29+
Mappers\ModelDataMapper::class,
30+
31+
Mappers\CarbonDataMapper::class,
32+
Mappers\BackedEnumDataMapper::class,
33+
Mappers\GenericObjectDataMapper::class,
34+
Mappers\ObjectDataMapper::class,
3335
]);
3436

3537
$mockedConfig = Mockery::mock(Repository::class);
@@ -245,8 +247,8 @@ public function test_data_transfer_object_date_properties_does_not_get_mapped_fr
245247
])->to(CreatePostData::class);
246248

247249
$this->assertTrue($data->dates instanceof Collection);
248-
$this->assertFalse($data->dates->first() instanceof Carbon);
249-
$this->assertIsString($data->dates->first());
250+
$this->assertTrue($data->dates->first() instanceof Carbon);
251+
$this->assertTrue($data->dates->last() instanceof Carbon);
250252
}
251253

252254
public function test_data_transfer_object_sent_into_another_as_collected_will_be_mapped_from_array()

workbench/app/DataTransferObjects/CreateComment.php

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@
22

33
namespace Workbench\App\DataTransferObjects;
44

5-
use OpenSoutheners\LaravelDto\Contracts\DataTransferObject;
6-
7-
class CreateComment implements DataTransferObject
5+
class CreateComment
86
{
97
public function __construct(
108
public string $content,

workbench/app/DataTransferObjects/CreateManyPostData.php

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,8 @@
33
namespace Workbench\App\DataTransferObjects;
44

55
use Illuminate\Support\Collection;
6-
use OpenSoutheners\LaravelDto\Contracts\DataTransferObject;
76

8-
class CreateManyPostData implements DataTransferObject
7+
class CreateManyPostData
98
{
109
/**
1110
* @param \Illuminate\Support\Collection<\Workbench\App\DataTransferObjects\CreatePostData> $posts

workbench/app/DataTransferObjects/CreatePostData.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@
55
use Illuminate\Support\Carbon;
66
use Illuminate\Support\Collection;
77
use OpenSoutheners\LaravelDto\Attributes\Authenticated;
8-
use OpenSoutheners\LaravelDto\Contracts\DataTransferObject;
8+
use OpenSoutheners\LaravelDto\Contracts\RouteTransferableObject;
99
use stdClass;
1010
use Workbench\App\Enums\PostStatus;
1111
use Workbench\App\Models\Post;
1212
use Workbench\App\Models\User;
1313

14-
class CreatePostData implements DataTransferObject
14+
class CreatePostData implements RouteTransferableObject
1515
{
1616
public mixed $authorEmail = 'me@d8vjork.com';
1717

workbench/app/DataTransferObjects/UpdatePostData.php

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,9 @@
22

33
namespace Workbench\App\DataTransferObjects;
44

5-
use OpenSoutheners\LaravelDto\Contracts\DataTransferObject;
65
use Workbench\App\Models\Post;
76

8-
class UpdatePostData implements DataTransferObject
7+
class UpdatePostData
98
{
109
/**
1110
* @param string[] $tags

workbench/app/DataTransferObjects/UpdatePostWithDefaultData.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@
44

55
use OpenSoutheners\LaravelDto\Attributes\Authenticated;
66
use OpenSoutheners\LaravelDto\Attributes\ResolveModel;
7-
use OpenSoutheners\LaravelDto\Contracts\DataTransferObject;
7+
use OpenSoutheners\LaravelDto\Contracts\RouteTransferableObject;
88
use Workbench\App\Models\Post;
99
use Workbench\App\Models\Tag;
1010
use Workbench\App\Models\User;
1111

12-
class UpdatePostWithDefaultData implements DataTransferObject
12+
class UpdatePostWithDefaultData implements RouteTransferableObject
1313
{
1414
/**
1515
* @param string[] $tags

workbench/app/DataTransferObjects/UpdatePostWithRouteBindingData.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
use OpenSoutheners\LaravelDto\Attributes\Authenticated;
99
use OpenSoutheners\LaravelDto\Attributes\ModelWith;
1010
use OpenSoutheners\LaravelDto\Attributes\Validate;
11-
use OpenSoutheners\LaravelDto\Contracts\DataTransferObject;
11+
use OpenSoutheners\LaravelDto\Contracts\RouteTransferableObject;
1212
use stdClass;
1313
use Workbench\App\Enums\PostStatus;
1414
use Workbench\App\Http\Requests\PostUpdateFormRequest;
@@ -17,7 +17,7 @@
1717

1818
#[AsType('UpdatePostFormData')]
1919
#[Validate(PostUpdateFormRequest::class)]
20-
class UpdatePostWithRouteBindingData implements DataTransferObject
20+
class UpdatePostWithRouteBindingData implements RouteTransferableObject
2121
{
2222
/**
2323
* @param \Illuminate\Support\Collection<\Workbench\App\Models\Tag>|null $tags

workbench/app/DataTransferObjects/UpdatePostWithTags.php

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,9 @@
33
namespace Workbench\App\DataTransferObjects;
44

55
use Illuminate\Support\Collection;
6-
use OpenSoutheners\LaravelDto\Contracts\DataTransferObject;
76
use Workbench\App\Models\Post;
87

9-
class UpdatePostWithTags implements DataTransferObject
8+
class UpdatePostWithTags
109
{
1110
public function __construct(
1211
public Post $post,

workbench/app/DataTransferObjects/UpdateTagData.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,15 @@
66
use OpenSoutheners\LaravelDto\Attributes\Authenticated;
77
use OpenSoutheners\LaravelDto\Attributes\ResolveModel;
88
use OpenSoutheners\LaravelDto\Attributes\Validate;
9-
use OpenSoutheners\LaravelDto\Contracts\DataTransferObject;
9+
use OpenSoutheners\LaravelDto\Contracts\RouteTransferableObject;
1010
use Workbench\App\Http\Requests\TagUpdateFormRequest;
1111
use Workbench\App\Models\Film;
1212
use Workbench\App\Models\Post;
1313
use Workbench\App\Models\Tag;
1414
use Workbench\App\Models\User;
1515

1616
#[Validate(TagUpdateFormRequest::class)]
17-
class UpdateTagData implements DataTransferObject
17+
class UpdateTagData implements RouteTransferableObject
1818
{
1919
/**
2020
* @param \Illuminate\Support\Collection<\Workbench\App\Models\Post|\Workbench\App\Models\Film> $taggable

0 commit comments

Comments
 (0)