Skip to content

Commit 774f677

Browse files
committed
wip
1 parent ebde2c6 commit 774f677

File tree

6 files changed

+92
-13
lines changed

6 files changed

+92
-13
lines changed

packages/database/src/Builder/QueryBuilders/InsertQueryBuilder.php

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,15 @@
1111
use Tempest\Database\OnDatabase;
1212
use Tempest\Database\Query;
1313
use Tempest\Database\QueryStatements\InsertStatement;
14+
use Tempest\Mapper\Mappers\ArrayToObjectMapper;
1415
use Tempest\Mapper\SerializerFactory;
1516
use Tempest\Reflection\ClassReflector;
1617
use Tempest\Support\Arr\ImmutableArray;
1718
use Tempest\Support\Conditions\HasConditions;
1819

20+
use Tests\Tempest\Integration\ORM\Models\DateTimeModel;
1921
use function Tempest\Database\model;
22+
use function Tempest\map;
2023

2124
final class InsertQueryBuilder implements BuildsQuery
2225
{
@@ -88,12 +91,12 @@ private function resolveData(): array
8891
{
8992
$entries = [];
9093

94+
$baseModelName = model($this->model)->getName();
95+
9196
foreach ($this->rows as $model) {
92-
// Raw entries are straight up added
97+
// Raw entries are converted to model objects
9398
if (is_array($model) || $model instanceof ImmutableArray) {
94-
$entries[] = $model;
95-
96-
continue;
99+
$model = map($model)->with(ArrayToObjectMapper::class)->to($baseModelName);
97100
}
98101

99102
// The rest are model objects

packages/mapper/src/SerializerFactoryInitializer.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
use Tempest\Mapper\Serializers\SerializableSerializer;
2828
use Tempest\Mapper\Serializers\StringSerializer;
2929
use Tempest\Reflection\PropertyReflector;
30+
use Tempest\DateTime\DateTime as TempestDateTime;
3031

3132
final class SerializerFactoryInitializer implements Initializer
3233
{
@@ -48,6 +49,7 @@ public function initialize(Container $container): SerializerFactory
4849
->addSerializer(JsonSerializable::class, SerializableSerializer::class)
4950
->addSerializer(BackedEnum::class, EnumSerializer::class)
5051
->addSerializer(DateTime::class, DateTimeSerializer::fromProperty(...))
52+
->addSerializer(TempestDateTime::class, DateTimeSerializer::fromProperty(...))
5153
->addSerializer(fn (PropertyReflector $property) => $property->getIterableType() !== null, ArrayOfObjectsSerializer::class);
5254
}
5355
}

packages/mapper/src/Serializers/DateTimeSerializer.php

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44

55
namespace Tempest\Mapper\Serializers;
66

7-
use DateTimeInterface as NativeDateTimeInterface;
7+
use DateTimeInterface as PhpDateTimeInterface;
88
use Tempest\DateTime\DateTime;
9-
use Tempest\DateTime\DateTimeInterface;
9+
use Tempest\DateTime\DateTimeInterface as TempestDateTimeInterface;
1010
use Tempest\DateTime\FormatPattern;
1111
use Tempest\Mapper\Exceptions\ValueCouldNotBeSerialized;
1212
use Tempest\Mapper\Serializer;
@@ -16,26 +16,35 @@
1616
final readonly class DateTimeSerializer implements Serializer
1717
{
1818
public function __construct(
19-
private FormatPattern|string $format = FormatPattern::ISO8601,
19+
private FormatPattern|string|null $format = null,
2020
) {}
2121

2222
public static function fromProperty(PropertyReflector $property): self
2323
{
24-
$format = $property->getAttribute(DateTimeFormat::class)->format ?? FormatPattern::ISO8601;
24+
$format = $property->getAttribute(DateTimeFormat::class)->format ?? null;
2525

2626
return new self($format);
2727
}
2828

2929
public function serialize(mixed $input): string
3030
{
31-
if ($input instanceof NativeDateTimeInterface) {
31+
if ($input instanceof PhpDateTimeInterface) {
3232
$input = DateTime::parse($input);
3333
}
3434

35-
if (! ($input instanceof DateTimeInterface)) {
36-
throw new ValueCouldNotBeSerialized(DateTimeInterface::class);
35+
if (! ($input instanceof TempestDateTimeInterface)) {
36+
throw new ValueCouldNotBeSerialized(TempestDateTimeInterface::class);
3737
}
3838

39-
return $input->format($this->format);
39+
$format = $this->format;
40+
41+
if ($format === null) {
42+
$format = match(true) {
43+
$input instanceof TempestDateTimeInterface => FormatPattern::SQL_DATE_TIME,
44+
default => 'Y-m-d H:i:s',
45+
};
46+
}
47+
48+
return $input->format($format);
4049
}
4150
}

tests/Integration/ORM/IsDatabaseModelTest.php

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@
55
namespace Tests\Tempest\Integration\ORM;
66

77
use Carbon\Carbon;
8+
use DateTime;
89
use DateTimeImmutable;
9-
use Integration\ORM\Migrations\CreateCasterEnumType;
10+
use Tempest\DateTime\DateTime as TempestDateTime;
1011
use Tempest\Database\Builder\ModelDefinition;
1112
use Tempest\Database\Exceptions\RelationWasMissing;
1213
use Tempest\Database\Exceptions\ValueWasMissing;
@@ -37,6 +38,7 @@
3738
use Tests\Tempest\Integration\ORM\Migrations\CreateCarbonModelTable;
3839
use Tests\Tempest\Integration\ORM\Migrations\CreateCasterModelTable;
3940
use Tests\Tempest\Integration\ORM\Migrations\CreateCTable;
41+
use Tests\Tempest\Integration\ORM\Migrations\CreateDateTimeModelTable;
4042
use Tests\Tempest\Integration\ORM\Migrations\CreateHasManyChildTable;
4143
use Tests\Tempest\Integration\ORM\Migrations\CreateHasManyParentTable;
4244
use Tests\Tempest\Integration\ORM\Migrations\CreateHasManyThroughTable;
@@ -48,12 +50,14 @@
4850
use Tests\Tempest\Integration\ORM\Models\CasterEnum;
4951
use Tests\Tempest\Integration\ORM\Models\CasterModel;
5052
use Tests\Tempest\Integration\ORM\Models\ChildModel;
53+
use Tests\Tempest\Integration\ORM\Models\DateTimeModel;
5154
use Tests\Tempest\Integration\ORM\Models\ModelWithValidation;
5255
use Tests\Tempest\Integration\ORM\Models\ParentModel;
5356
use Tests\Tempest\Integration\ORM\Models\StaticMethodTableNameModel;
5457
use Tests\Tempest\Integration\ORM\Models\ThroughModel;
5558

5659
use function Tempest\Database\model;
60+
use function Tempest\Database\query;
5761
use function Tempest\map;
5862

5963
/**
@@ -613,4 +617,23 @@ public function test_skipped_validation(): void
613617
$this->assertStringNotContainsString('skip', $validationFailed->getMessage());
614618
}
615619
}
620+
621+
public function test_date_field(): void
622+
{
623+
$this->migrate(
624+
CreateMigrationsTable::class,
625+
CreateDateTimeModelTable::class,
626+
);
627+
628+
$id = query(DateTimeModel::class)->insert([
629+
'phpDateTime' => new DateTime('2024-01-01 00:00:00'),
630+
'tempestDateTime' => TempestDateTime::parse('2024-01-01 00:00:00'),
631+
])->execute();
632+
633+
/** @var DateTimeModel $model */
634+
$model = query(DateTimeModel::class)->select()->whereField('id', $id)->first();
635+
636+
$this->assertSame('2024-01-01 00:00:00', $model->phpDateTime->format('Y-m-d H:i:s'));
637+
$this->assertSame('2024-01-01 00:00:00', $model->tempestDateTime->format('yyyy-MM-dd HH:mm:ss'));
638+
}
616639
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?php
2+
3+
namespace Tests\Tempest\Integration\ORM\Migrations;
4+
5+
use Tempest\Database\DatabaseMigration;
6+
use Tempest\Database\QueryStatement;
7+
use Tempest\Database\QueryStatements\CreateTableStatement;
8+
use Tests\Tempest\Integration\ORM\Models\DateTimeModel;
9+
10+
final class CreateDateTimeModelTable implements DatabaseMigration
11+
{
12+
public string $name = '0001_datetime_model_table';
13+
14+
public function up(): QueryStatement
15+
{
16+
return CreateTableStatement::forModel(DateTimeModel::class)
17+
->primary()
18+
->datetime('phpDateTime')
19+
->datetime('tempestDateTime');
20+
}
21+
22+
public function down(): null
23+
{
24+
return null;
25+
}
26+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
namespace Tests\Tempest\Integration\ORM\Models;
4+
5+
use DateTime;
6+
use Tempest\Database\Id;
7+
use Tempest\DateTime\DateTime as TempestDateTime;
8+
9+
final class DateTimeModel
10+
{
11+
public function __construct(
12+
public Id $id,
13+
public DateTime $phpDateTime,
14+
public TempestDateTime $tempestDateTime,
15+
) {}
16+
}

0 commit comments

Comments
 (0)