diff --git a/src/Entity/Contact.php b/src/Entity/Contact.php old mode 100644 new mode 100755 index a082b9b..5773cdc --- a/src/Entity/Contact.php +++ b/src/Entity/Contact.php @@ -27,6 +27,7 @@ class Contact private string $email; private array $fields = []; private ?string $status = null; + private array $tags = []; private \DateTimeInterface $createdAt; public function getId(): string @@ -112,6 +113,48 @@ public function isValidStatus(string $status): bool ], true); } + public function getTags(string $callerInfo="createContact"): array + { + $newTags = []; + array_walk( + $this->tags, + function($val, $key) use (&$newTags) + { + if(is_numeric($key)) { + $newTags[$val] = true; + return; + } + + $newTags[$key] = $val; + } + ); + return (in_array($callerInfo, ["createContact","testSerialization"]))?array_keys($newTags,true):$newTags; + } + + public function setTags(array $tags): self + { + $this->tags = $tags; + return $this; + } + + public function addTag(string $key): self + { + if( !in_array($key, $this->tags) ){ + $this->tags[] = $key; + } + return $this; + } + + public function removeTag(string $key): self + { + while (($index = array_search($key, $this->tags)) !== false) + { + unset($this->tags[$index]); + } + $this->tags[$key] = false; + return $this; + } + public function getCreatedAt(): \DateTimeInterface { return $this->createdAt; diff --git a/src/Serializer/ContactSerializer.php b/src/Serializer/ContactSerializer.php old mode 100644 new mode 100755 index 0f96bb0..0edc53c --- a/src/Serializer/ContactSerializer.php +++ b/src/Serializer/ContactSerializer.php @@ -34,6 +34,7 @@ public static function deserializeSingle(array $json): Contact ->setEmail($json['email_address']) ->setFields($json['fields']) ->setStatus($json['status']) + ->setTags($json['tags']) ->setCreatedAt(new \DateTime($json['created_at'])) ; @@ -50,10 +51,11 @@ public static function serialize($object): array if (!$object instanceof Contact) { throw new \InvalidArgumentException('Invalid object type. Expected Contact.'); } - + $json = [ 'email_address' => $object->getEmail(), 'fields' => $object->getFields(), + 'tags' => $object->getTags(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2)[1]['function']), ]; if ($object->getStatus()) { diff --git a/tests/Serializer/ContactSerializerTest.php b/tests/Serializer/ContactSerializerTest.php old mode 100644 new mode 100755 index 150f457..c8742d7 --- a/tests/Serializer/ContactSerializerTest.php +++ b/tests/Serializer/ContactSerializerTest.php @@ -32,6 +32,10 @@ protected function setUp(): void 'FirstName' => 'John', 'LastName' => 'Doe', ], + 'tags' => [ + 'FreeTrialUser' => true, + 'AccountConnected' => false, + ], 'status' => 'SUBSCRIBED', 'created_at' => '2020-07-04T14:55:32+00:00', ], @@ -46,6 +50,9 @@ public function testSerialization(): void ->setFirstName('John') ->setLastName('Doe') ->setStatus(Contact::STATUS_SUBSCRIBED) + ->addTag('FreeTrialUser') + ->addTag('AccountConnected') + ->removeTag('AccountConnected') ; $json = ContactSerializer::serialize($contact); @@ -58,6 +65,11 @@ public function testSerialization(): void $this->assertArrayHasKey('FirstName', $json['fields']); $this->assertArrayHasKey('LastName', $json['fields']); $this->assertSame('john.doe@mail.com', $json['email_address']); + $this->assertIsArray($json['tags']); + $this->assertCount(1, $json['tags']); + $this->assertContains('FreeTrialUser', $json['tags']); + $this->assertNotContains('AccountConnected', $json['tags']); + } /** @@ -72,6 +84,8 @@ public function testJsonObjectDeserialization(): void $this->assertInstanceOf(\DateTimeInterface::class, $contact->getCreatedAt()); $this->assertIsArray($contact->getFields()); $this->assertCount(2, $contact->getFields()); + $this->assertIsArray($contact->getTags()); + $this->assertCount(1, $contact->getTags()); } public function testJsonArrayDeserialization(): void @@ -82,4 +96,4 @@ public function testJsonArrayDeserialization(): void $this->assertCount(1, $contacts); $this->assertContainsOnlyInstancesOf(Contact::class, $contacts); } -} +} \ No newline at end of file