Skip to content

Commit 55c2b7e

Browse files
authored
Fix one-to-many relations (#964)
1 parent 874215b commit 55c2b7e

File tree

10 files changed

+76
-17
lines changed

10 files changed

+76
-17
lines changed

src/Objects/BaseObject.php

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ protected function getPropertyValue($property, $default = null)
6060

6161
$relations = $this->relations();
6262
if (isset($relations[$property])) {
63-
return $relations[$property]::make($value);
63+
return $this->getRelationValue($property, $value);
6464
}
6565

6666
/** @var BaseObject $class */
@@ -77,6 +77,34 @@ protected function getPropertyValue($property, $default = null)
7777
return $value;
7878
}
7979

80+
/**
81+
* @param string $relationName
82+
* @param array $relationRawData
83+
* @return array|\Illuminate\Support\Enumerable|\Illuminate\Support\Traits\EnumeratesValues|\Telegram\Bot\Objects\BaseObject
84+
*/
85+
protected function getRelationValue(string $relationName, iterable $relationRawData)
86+
{
87+
/** @var class-string<\Telegram\Bot\Objects\BaseObject>|list<class-string<\Telegram\Bot\Objects\BaseObject>> $relation */
88+
$relation = $this->relations()[$relationName];
89+
90+
if (is_string($relation) && class_exists($relation)) {
91+
return $relation::make($relationRawData);
92+
}
93+
94+
$isOneToManyRelation = is_array($relation);
95+
if ($isOneToManyRelation) {
96+
/** @var class-string<\Telegram\Bot\Objects\BaseObject> $clasString */
97+
$clasString = $relation[0];
98+
$relatedObjects = Collection::make(); // @todo array type can be used in v4
99+
foreach ($relationRawData as $singleObjectRawData) {
100+
$relatedObjects[] = $clasString::make($singleObjectRawData);
101+
}
102+
return $relatedObjects;
103+
}
104+
105+
throw new \InvalidArgumentException("Unknown type of the relationship data for the $relationName relation.");
106+
}
107+
80108
/**
81109
* Get an item from the collection by key.
82110
*

src/Objects/Game.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ class Game extends BaseObject
2222
public function relations()
2323
{
2424
return [
25-
'photo' => PhotoSize::class,
26-
'text_entities' => MessageEntity::class,
27-
'animation' => Animation::class,
25+
'photo' => [PhotoSize::class],
26+
'text_entities' => [MessageEntity::class],
27+
'animation' => Animation::class,
2828
];
2929
}
3030
}

src/Objects/Message.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -71,14 +71,14 @@ public function relations()
7171
'forward_from' => User::class,
7272
'forward_from_chat' => Chat::class,
7373
'reply_to_message' => self::class,
74-
'entities' => MessageEntity::class,
75-
'caption_entities' => MessageEntity::class,
74+
'entities' => [MessageEntity::class],
75+
'caption_entities' => [MessageEntity::class],
7676
'audio' => Audio::class,
7777
'dice' => Dice::class,
7878
'animation' => Animation::class,
7979
'document' => Document::class,
8080
'game' => Game::class,
81-
'photo' => PhotoSize::class,
81+
'photo' => [PhotoSize::class],
8282
'sticker' => Sticker::class,
8383
'video' => Video::class,
8484
'voice' => Voice::class,
@@ -88,9 +88,9 @@ public function relations()
8888
'venue' => Venue::class,
8989
'poll' => Poll::class,
9090
'new_chat_member' => ChatMember::class,
91-
'new_chat_members' => User::class,
91+
'new_chat_members' => [User::class],
9292
'left_chat_member' => User::class,
93-
'new_chat_photo' => PhotoSize::class,
93+
'new_chat_photo' => [PhotoSize::class],
9494
'delete_chat_photo' => ChatPhoto::class,
9595
'pinned_message' => self::class,
9696
'invoice' => Invoice::class,

src/Objects/Passport/EncryptedPassportElement.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,11 @@ class EncryptedPassportElement extends BaseObject
2626
public function relations()
2727
{
2828
return [
29-
'files' => PassportFile::class,
29+
'files' => [PassportFile::class],
3030
'front_side' => PassportFile::class,
3131
'reverse_side' => PassportFile::class,
3232
'selfie' => PassportFile::class,
33-
'translation' => PassportFile::class,
33+
'translation' => [PassportFile::class],
3434
];
3535
}
3636
}

src/Objects/Passport/SecureValue.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ public function relations()
2626
'front_side' => FileCredentials::class,
2727
'reverse_side' => FileCredentials::class,
2828
'selfie' => FileCredentials::class,
29-
'translation' => FileCredentials::class,
30-
'files' => FileCredentials::class,
29+
'translation' => [FileCredentials::class],
30+
'files' => [FileCredentials::class],
3131
];
3232
}
3333
}

src/Objects/Payments/ShippingOption.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ class ShippingOption extends BaseObject
1919
public function relations()
2020
{
2121
return [
22-
'prices' => LabeledPrice::class,
22+
'prices' => [LabeledPrice::class],
2323
];
2424
}
2525
}

src/Objects/Poll.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ class Poll extends BaseObject
2424
public function relations()
2525
{
2626
return [
27-
'options' => PollOption::class,
27+
'options' => [PollOption::class],
2828
];
2929
}
3030
}

src/Objects/StickerSet.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class StickerSet extends BaseObject
2020
public function relations()
2121
{
2222
return [
23-
'stickers' => Sticker::class,
23+
'stickers' => [Sticker::class],
2424
'thumb' => PhotoSize::class,
2525
];
2626
}

src/Objects/UserProfilePhotos.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ class UserProfilePhotos extends BaseObject
1717
public function relations()
1818
{
1919
return [
20-
'photos' => PhotoSize::class,
20+
'photos' => [PhotoSize::class],
2121
];
2222
}
2323
}

tests/Unit/Objects/MessageTest.php

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
3+
namespace Telegram\Bot\Tests\Unit\Objects;
4+
5+
use PHPUnit\Framework\TestCase;
6+
use Telegram\Bot\Objects\Message;
7+
use Telegram\Bot\Objects\PhotoSize;
8+
9+
/** @covers \Telegram\Bot\Objects\Message */
10+
class MessageTest extends TestCase
11+
{
12+
/** @test */
13+
public function it_inits_one_to_many_relation(): void
14+
{
15+
$message = Message::make([
16+
'photo' => [
17+
['file_id' => ''],
18+
['file_id' => ''],
19+
['file_id' => ''],
20+
['file_id' => ''],
21+
],
22+
]);
23+
24+
$this->assertIsIterable($message->photo);
25+
$this->assertCount(4, $message->photo);
26+
$this->assertInstanceOf(PhotoSize::class, $message->photo[0]);
27+
$this->assertInstanceOf(PhotoSize::class, $message->photo[1]);
28+
$this->assertInstanceOf(PhotoSize::class, $message->photo[2]);
29+
$this->assertInstanceOf(PhotoSize::class, $message->photo[3]);
30+
}
31+
}

0 commit comments

Comments
 (0)