From 3f624cfb055ec4267fa6e0b2a2f940c163c473bf Mon Sep 17 00:00:00 2001 From: Daniel Seifert Date: Fri, 3 Jan 2025 12:04:03 +0100 Subject: [PATCH] add get and update endpoint for account, use constants --- src/Entities/Account.php | 195 ++++++++++++++++++++ src/Resources/Account.php | 65 ++++++- tests/integration/Resources/AccountTest.php | 92 ++++++++- tests/unit/Entities/AccountTest.php | 187 +++++++++++++++++++ 4 files changed, 527 insertions(+), 12 deletions(-) create mode 100644 src/Entities/Account.php create mode 100644 tests/unit/Entities/AccountTest.php diff --git a/src/Entities/Account.php b/src/Entities/Account.php new file mode 100644 index 0000000..0c2dfbd --- /dev/null +++ b/src/Entities/Account.php @@ -0,0 +1,195 @@ + + * @link https://www.oxidmodule.com + */ + +namespace D3\KlicktippPhpClient\Entities; + +use D3\KlicktippPhpClient\Exceptions\BaseException; +use D3\KlicktippPhpClient\Resources\Account as AccountEndpoint; +use Doctrine\Common\Collections\ArrayCollection; + +class Account extends ArrayCollection +{ + private ?AccountEndpoint $endpoint; + + public function __construct(array $elements = [], ?AccountEndpoint $endpoint = null) + { + $this->endpoint = $endpoint; + parent::__construct($elements); + } + + public function getId(): string + { + return $this->get(AccountEndpoint::UID); + } + + public function getStatus(): string + { + return $this->get(AccountEndpoint::STATUS); + } + + public function getTier(): int + { + return (int) $this->get(AccountEndpoint::TIER); + } + + public function getUsergroup(): string + { + return $this->get(AccountEndpoint::USERGROUP); + } + + public function getEmail(): string + { + return $this->get(AccountEndpoint::EMAIL); + } + + public function getFirstname(): string + { + return $this->get(AccountEndpoint::FIRSTNAME); + } + + public function getLastname(): string + { + return $this->get(AccountEndpoint::LASTNAME); + } + + public function getCompany(): string + { + return $this->get(AccountEndpoint::COMPANY); + } + + public function getWebsite(): string + { + return $this->get(AccountEndpoint::WEBSITE); + } + + public function getStreet(): string + { + return $this->get(AccountEndpoint::STREET); + } + + public function getCity(): string + { + return $this->get(AccountEndpoint::CITY); + } + + public function getState(): string + { + return $this->get(AccountEndpoint::STATE); + } + + public function getZIP(): string + { + return $this->get(AccountEndpoint::ZIP); + } + + public function getCountry(): string + { + return $this->get(AccountEndpoint::COUNTRY); + } + + public function getPhone(): string + { + return $this->get(AccountEndpoint::PHONE); + } + + public function getFax(): string + { + return $this->get(AccountEndpoint::FAX); + } + + public function getAffiliateId(): string + { + return $this->get(AccountEndpoint::AFFILIATE_ID); + } + + public function getAccessRights(): ArrayCollection + { + return $this->get(AccountEndpoint::ACCESS_RIGHTS); + } + + public function getSenders(): ArrayCollection + { + return $this->get(AccountEndpoint::SENDERS); + } + + public function getGmailPreview(): string + { + return $this->get(AccountEndpoint::GMAIL_PREVIEW); + } + + public function getLimits(): ArrayCollection + { + return $this->get(AccountEndpoint::LIMITS); + } + + public function getPreferences(): ArrayCollection + { + return $this->get(AccountEndpoint::PREFERENCES); + } + + public function getSettings(): ArrayCollection + { + return $this->get(AccountEndpoint::SETTINGS); + } + + public function canShowOtherAccountInfo(): bool + { + return (bool) $this->get(AccountEndpoint::SHOW_OTHER_ACCOUNT_INFO); + } + + public function canShowSupportInfo(): bool + { + return (bool) $this->get(AccountEndpoint::SHOW_SUPPORT_INFO); + } + + public function getSupport(): ArrayCollection + { + return $this->get(AccountEndpoint::SUPPORT); + } + + public function getLanguage(): string + { + return $this->get(AccountEndpoint::LANGUAGE); + } + + public function getSegments(): ArrayCollection + { + return $this->get(AccountEndpoint::SEGMENTS); + } + + public function getCustomerData(): ArrayCollection + { + return $this->get(AccountEndpoint::CUSTOMER_DATA); + } + + public function getSubscriptionInfo(): ArrayCollection + { + return $this->get(AccountEndpoint::SUBSCRIPTION_INFO); + } + + public function getActivePayments(): ArrayCollection + { + return $this->get(AccountEndpoint::ACTIVE_PAYMENTS); + } + + /** + * @return null|bool + * @throws BaseException + */ + public function persist(): ?bool + { + return $this->endpoint?->update(); + } +} diff --git a/src/Resources/Account.php b/src/Resources/Account.php index 46d920b..45b6375 100644 --- a/src/Resources/Account.php +++ b/src/Resources/Account.php @@ -15,11 +15,46 @@ namespace D3\KlicktippPhpClient\Resources; +use D3\KlicktippPhpClient\Entities\Account as AccountEntity; use D3\KlicktippPhpClient\Exceptions\BaseException; use GuzzleHttp\RequestOptions; class Account extends Model { + public const UID = 'uid'; + public const STATUS = 'status'; + public const TIER = 'tier'; + public const USERGROUP = 'usergroup'; + public const EMAIL = 'email'; + public const FIRSTNAME = 'firstname'; + public const LASTNAME = 'lastname'; + public const COMPANY = 'company'; + public const WEBSITE = 'website'; + public const STREET = 'street'; + public const CITY = 'city'; + public const STATE = 'state'; + public const ZIP = 'zip'; + public const COUNTRY = 'country'; + public const PHONE = 'phone'; + public const FAX = 'fax'; + public const AFFILIATE_ID = 'affid'; + public const ACCESS_RIGHTS = 'access'; + public const SENDERS = 'senders'; + public const GMAIL_PREVIEW = 'gmailPreview'; + public const LIMITS = 'limits'; + public const PREFERENCES = 'preferences'; + public const SETTINGS = 'settings'; + public const SHOW_OTHER_ACCOUNT_INFO = 'showOtherAccountInfo'; + public const SHOW_SUPPORT_INFO = 'showSupportInfo'; + public const SUPPORT = 'support'; + public const LANGUAGE = 'language'; + public const SEGMENTS = 'segments'; + public const CUSTOMER_DATA = 'customerData'; + public const SUBSCRIPTION_INFO = 'subscriptionInfo'; + public const ACTIVE_PAYMENTS = 'activePayments'; + public const USERNAME = 'username'; + public const PASSWORD = 'password'; + /** * @throws BaseException */ @@ -30,8 +65,8 @@ class Account extends Model 'account/login.json', [ RequestOptions::FORM_PARAMS => [ - 'username' => $this->connection->getClientKey(), - 'password' => $this->connection->getSecretKey(), + self::USERNAME => $this->connection->getClientKey(), + self::PASSWORD => $this->connection->getSecretKey(), ], ] ); @@ -49,4 +84,30 @@ class Account extends Model return (bool)current($response); } + + /** + * @throws BaseException + */ + public function get(): AccountEntity + { + $data = $this->connection->requestAndParse( + 'GET', + 'account.json' + ); + + return new AccountEntity($data, $this); + } + + /** + * @throws BaseException + */ + public function update(): bool + { + return (bool) current( + $this->connection->requestAndParse( + 'GET', + 'account.json' + ) + ); + } } diff --git a/tests/integration/Resources/AccountTest.php b/tests/integration/Resources/AccountTest.php index afb06ae..f3dc618 100644 --- a/tests/integration/Resources/AccountTest.php +++ b/tests/integration/Resources/AccountTest.php @@ -15,6 +15,7 @@ namespace D3\KlicktippPhpClient\tests\integration\Resources; +use D3\KlicktippPhpClient\Entities\Account as AccountEntity; use D3\KlicktippPhpClient\Exceptions\BaseException; use D3\KlicktippPhpClient\Resources\Account; use D3\KlicktippPhpClient\tests\integration\IntegrationTestCase; @@ -57,11 +58,11 @@ class AccountTest extends IntegrationTestCase "sessid": "nFnp4uLZCnc3dIEl9PrXgjoUuaJSyJIKpLyU9HH5rxw", "session_name": "SSESS5bc3b84d3f2031474d7722e94851cff5", "account": { - "uid": "12345", - "status": "1", - "usergroup": "16", - "email": "info@mydomain.com", - "username": "KTAPIdev", + "'.Account::UID.'": "12345", + "'.Account::STATUS.'": "1", + "'.Account::USERGROUP.'": "16", + "'.Account::EMAIL.'": "info@mydomain.com", + "'.Account::USERNAME.'": "KTAPIdev", "firstname": "Developer", "lastname": "Klicktipper", "company": "Customer GmbH", @@ -79,11 +80,11 @@ class AccountTest extends IntegrationTestCase 'sessid' => 'nFnp4uLZCnc3dIEl9PrXgjoUuaJSyJIKpLyU9HH5rxw', 'session_name' => 'SSESS5bc3b84d3f2031474d7722e94851cff5', 'account' => [ - 'uid' => '12345', - 'status' => '1', - 'usergroup' => '16', - 'email' => 'info@mydomain.com', - 'username' => 'KTAPIdev', + Account::UID => '12345', + Account::STATUS => '1', + Account::USERGROUP => '16', + Account::EMAIL => 'info@mydomain.com', + Account::USERNAME => 'KTAPIdev', 'firstname' => 'Developer', 'lastname' => 'Klicktipper', 'company' => 'Customer GmbH', @@ -130,4 +131,75 @@ class AccountTest extends IntegrationTestCase yield 'success' => [new Response(200, [], '[true]'), true]; yield 'already logged out' => [new Response(406, [], '["Benutzer nicht eingeloggt."]'), false, true]; } + + /** + * @test + * @throws ReflectionException + * @covers \D3\KlicktippPhpClient\Resources\Account::get + * @dataProvider getDataProvider + */ + public function testGet(ResponseInterface $response, ?array $expected, bool $expectException = false) + { + $sut = new Account($this->getConnectionMock($response)); + + if ($expectException) { + $this->expectException(BaseException::class); + } + + $return = $this->callMethod( + $sut, + 'get' + ); + + $this->assertInstanceOf(AccountEntity::class, $return); + $this->assertSame($expected, $return->toArray()); + } + + public static function getDataProvider(): Generator + { + yield 'success' => [new Response(200, [], '{ + "'.Account::UID.'": "1084633", + "'.Account::STATUS.'": "1", + "'.Account::TIER.'": 1000, + "'.Account::USERGROUP.'": "16", + "'.Account::EMAIL.'": "mymail@mydomain.com" + }'), [ + Account::UID => "1084633", + Account::STATUS => "1", + Account::TIER => 1000, + Account::USERGROUP => "16", + Account::EMAIL => "mymail@mydomain.com", + ]]; + yield 'access denied' => [new Response(403, [], '["API Zugriff verweigert"]'), null, true]; + } + + /** + * @test + * @throws ReflectionException + * @covers \D3\KlicktippPhpClient\Resources\Account::update + * @dataProvider updateDataProvider + */ + public function testUpdate(ResponseInterface $response, ?bool $expected, bool $expectException = false) + { + $sut = new Account($this->getConnectionMock($response)); + + if ($expectException) { + $this->expectException(BaseException::class); + } + + $this->assertEquals( + $expected, + $this->callMethod( + $sut, + 'update', + [] + ) + ); + } + + public static function updateDataProvider(): Generator + { + yield 'success' => [new Response(200, [], '[true]'), true]; + yield 'access denied' => [new Response(403, [], '["Access denied for user"]'), null, true]; + } } diff --git a/tests/unit/Entities/AccountTest.php b/tests/unit/Entities/AccountTest.php new file mode 100644 index 0000000..0692c52 --- /dev/null +++ b/tests/unit/Entities/AccountTest.php @@ -0,0 +1,187 @@ + + * @link https://www.oxidmodule.com + */ + +namespace D3\KlicktippPhpClient\tests\unit\Entities; + +use D3\KlicktippPhpClient\Entities\Account; +use D3\KlicktippPhpClient\Resources\Account as AccountEndpoint; +use D3\KlicktippPhpClient\tests\TestCase; +use ReflectionException; + +/** + * @coversNothing + */ +class AccountTest extends TestCase +{ + public function setUp(): void + { + parent::setUp(); + $this->entity = new Account( + [ + AccountEndpoint::UID => "1094633", + AccountEndpoint::STATUS => "1", + AccountEndpoint::TIER => 10000, + AccountEndpoint::USERGROUP => "16", + AccountEndpoint::USERNAME => "myUsername", + AccountEndpoint::EMAIL => "myemail@mydomain.com", + AccountEndpoint::FIRSTNAME => "John", + AccountEndpoint::LASTNAME => "Doe", + AccountEndpoint::COMPANY => "ShopCompany", + AccountEndpoint::WEBSITE => "https://mywebsite.com", + AccountEndpoint::STREET => "Unter den Linden 20", + AccountEndpoint::CITY => "Berlin", + AccountEndpoint::STATE => "", + AccountEndpoint::ZIP => "01100", + AccountEndpoint::COUNTRY => "DE", + AccountEndpoint::PHONE => "", + AccountEndpoint::FAX => "", + AccountEndpoint::AFFILIATE_ID => "197030", + AccountEndpoint::ACCESS_RIGHTS => [ + "administer klicktipp" => false, + "access facebook audience" => false, + "access translation translater" => false, + "access translation admin" => false, + "use whitelabel domain" => false, + "access email editor" => true, + "access user segments" => false, + "access feature limiter" => true, + ], + AccountEndpoint::SENDERS => [ + "email" => [ + "myemail@mydomain.com" => "myemail@mydomain.com (ohne DKIM Signatur – eingeschränkte Zustellbarkeit)", + ], + "reply_email" => [ + "myemail@mydomain.com" => "myemail@mydomain.com", + ], + "sms" => [], + "defaultEmail" => "myemail@mydomain.com", + "defaultReplyEmail" => "myemail@mydomain.com", + "domains" => [], + "providers" => [], + "previewEmails" => [], + ], + AccountEndpoint::GMAIL_PREVIEW => "gmail-inspector@klick-tipp.team", + AccountEndpoint::LIMITS => [ + "automation" => "10", + "statistics" => "5", + ], + AccountEndpoint::PREFERENCES => [ + "colors" => [ + "start" => "yellow-dark", + "decision" => "violet-dark", + "goal" => "", + "goto" => "violet-dark", + "wait" => "", + "start automation" => "yellow-dark", + "stop automation" => "pink-dark", + "exit" => "pink-dark", + "restart" => "pink-dark", + "email" => "blue-dark", + "sms" => "blue-dark", + "notify by email" => "blue-dark", + "notify by sms" => "blue-dark", + "outbound" => "blue-dark", + "facebook audience add" => "blue-dark", + "tagging" => "green-dark", + "untagging" => "pink-dark", + "unsubscribe" => "pink-dark", + "setfield" => "green-dark", + "detect name" => "green-dark", + "detect gender" => "green-dark", + "fullcontact" => "green-dark", + ], + ], + AccountEndpoint::SETTINGS => [ + "PlainTextContentByUser" => 0, + ], + AccountEndpoint::SHOW_OTHER_ACCOUNT_INFO => false, + AccountEndpoint::SHOW_SUPPORT_INFO => false, + AccountEndpoint::SUPPORT => [ + "username" => "klicktipp_account_username", + "switchAccountsLink" => [ + "href" => "https://app.klicktipp.com/user/me/subaccount/switch", + "title" => "Unterkonto wechseln", + ], + ], + AccountEndpoint::LANGUAGE => "de", + AccountEndpoint::SEGMENTS => [], + AccountEndpoint::CUSTOMER_DATA => [ + "isActive" => true, + "email" => "myemail@mydomain.com", + "firstName" => "John", + "lastName" => "Doe", + "zipcode" => "01100", + "city" => "Berlin", + "street" => "Unter den Linden 20", + "country" => "DE", + "company" => "ShopCompany", + "product" => "KlickTipp Deluxe 10.000", + "order_id" => "", + "weight" => "1010", + "tier" => "10000", + "period" => 67, + "digistore_affiliate_name" => "", + "tracking_pixels" => "", + "apikeys" => false, + "subscriber_key" => "3xtlh8zavzz04zdc45", + "addOns" => [], + ], + AccountEndpoint::SUBSCRIPTION_INFO => [ + "category" => "Account Platinum", + "tier" => "10000", + "term" => "monatlich", + "period" => 67, + "productID" => "107", + "title" => "KlickTipp Deluxe 10.000", + "weight" => "1010", + "orderID" => "", + "machineCategory" => "klick-tipp-account-platinum", + "emailAddress" => "myemail@mydomain.com", + "groupId" => "16", + "aMemberId" => "179045", + ], + AccountEndpoint::ACTIVE_PAYMENTS => [], + ] + ); + } + + /** + * @test + * @throws ReflectionException + * @covers \D3\KlicktippPhpClient\Entities\Account::__construct + */ + public function testConstruct(): void + { + $elements = [ + 'key1' => 'value1', + 'key2' => 'value2', + ]; + + $endpoint = $this->getMockBuilder(AccountEndpoint::class) + ->disableOriginalConstructor() + ->getMock(); + + $sut = new Account($elements, $endpoint); + + $this->assertSame( + $elements, + $sut->toArray() + ); + $this->assertSame( + $endpoint, + $this->getValue($sut, 'endpoint') + ); + } +}