From 2f6f7aa14a04c0f4817db102b169d890a29f6f95 Mon Sep 17 00:00:00 2001 From: Oleksandr Mykhailenko Date: Thu, 7 Mar 2024 22:22:48 +0200 Subject: [PATCH 1/7] Add dependabot. Change php-cs-fixer --- .github/workflows/dependabot.yml | 7 +++++++ .github/workflows/php.yml | 5 ----- .php-cs-fixer.php | 3 ++- 3 files changed, 9 insertions(+), 6 deletions(-) create mode 100644 .github/workflows/dependabot.yml diff --git a/.github/workflows/dependabot.yml b/.github/workflows/dependabot.yml new file mode 100644 index 00000000..332d43f8 --- /dev/null +++ b/.github/workflows/dependabot.yml @@ -0,0 +1,7 @@ +version: 2 +updates: +- package-ecosystem: composer + directory: "/" + schedule: + interval: daily + open-pull-requests-limit: 3 diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index a4aab629..9272130c 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -23,11 +23,6 @@ jobs: php-version: ${{ matrix.php-versions }} tools: none - #- name: Install composer dependencies - # uses: ramsey/composer-install@v2 - # with: - # dependency-versions: ${{ matrix.dependency-versions }} - - name: Install dependencies run: composer install --prefer-dist --no-progress --no-suggest diff --git a/.php-cs-fixer.php b/.php-cs-fixer.php index 133e4fed..2463084f 100644 --- a/.php-cs-fixer.php +++ b/.php-cs-fixer.php @@ -16,7 +16,8 @@ ->setRiskyAllowed(true) ->setRules([ '@PSR2' => true, - '@Symfony' => true, + '@PSR12' => true, + '@Symfony' => false, 'strict_param' => true, 'array_syntax' => ['syntax' => 'short'], 'declare_strict_types' => true, From f84822d20f0127e1c2b71eab65841d258023bdd2 Mon Sep 17 00:00:00 2001 From: Oleksandr Mykhailenko Date: Sat, 27 Apr 2024 13:01:17 +0300 Subject: [PATCH 2/7] Domains. V4 --- src/Api/DomainV4.php | 487 +++++++++++++++++++++++++++++++++++++++++++ src/Mailgun.php | 8 + 2 files changed, 495 insertions(+) create mode 100644 src/Api/DomainV4.php diff --git a/src/Api/DomainV4.php b/src/Api/DomainV4.php new file mode 100644 index 00000000..3ff26e77 --- /dev/null +++ b/src/Api/DomainV4.php @@ -0,0 +1,487 @@ + $limit, + 'skip' => $skip, + ]; + + $response = $this->httpGet('/v4/domains', $params, $requestHeaders); + + return $this->hydrateResponse($response, IndexResponse::class); + } + + /** + * Returns a single domain. + * @param string $domain name of the domain + * @param array $requestHeaders + * @return ShowResponse|array|ResponseInterface + * @throws ClientExceptionInterface + */ + public function show(string $domain, array $requestHeaders = []) + { + Assert::stringNotEmpty($domain); + + $response = $this->httpGet(sprintf('/v3/domains/%s', $domain), [], $requestHeaders); + + return $this->hydrateResponse($response, ShowResponse::class); + } + + /** + * Creates a new domain for the account. + * See below for spam filtering parameter information. + * {@link https://documentation.mailgun.com/en/latest/user_manual.html#um-spam-filter}. + * + * @see https://documentation.mailgun.com/en/latest/api-domains.html#domains + * @param string $domain name of the domain + * @param string|null $smtpPass password for SMTP authentication + * @param string|null $spamAction `disable` or `tag` - inbound spam filtering + * @param bool $wildcard domain will accept email for subdomains + * @param bool $forceDkimAuthority force DKIM authority + * @param string[] $ips an array of ips to be assigned to the domain + * @param ?string $pool_id pool id to assign to the domain + * @param string $webScheme `http` or `https` - set your open, click and unsubscribe URLs to use http or https. The default is http + * @param string $dkimKeySize Set length of your domain’s generated DKIM + * key + * @return CreateResponse|array|ResponseInterface + * @throws Exception + */ + public function create( + string $domain, + string $smtpPass = null, + string $spamAction = null, + bool $wildcard = null, + bool $forceDkimAuthority = null, + ?array $ips = null, + ?string $pool_id = null, + string $webScheme = 'http', + string $dkimKeySize = '1024', + array $requestHeaders = [] + ) { + Assert::stringNotEmpty($domain); + + $params['name'] = $domain; + + if (!empty($smtpPass)) { + Assert::stringNotEmpty($smtpPass); + + $params['smtp_password'] = $smtpPass; + } + + if (!empty($spamAction)) { + Assert::stringNotEmpty($spamAction); + + $params['spam_action'] = $spamAction; + } + + if (null !== $wildcard) { + Assert::boolean($wildcard); + + $params['wildcard'] = $wildcard ? 'true' : 'false'; + } + + if (null !== $forceDkimAuthority) { + Assert::boolean($forceDkimAuthority); + + $params['force_dkim_authority'] = $forceDkimAuthority ? 'true' : 'false'; + } + + if (null !== $ips) { + Assert::isList($ips); + Assert::allString($ips); + + $params['ips'] = join(',', $ips); + } + + if (!empty($webScheme)) { + Assert::stringNotEmpty($webScheme); + Assert::oneOf($webScheme, ['https', 'http']); + $params['web_scheme'] = $webScheme; + } + + if (null !== $pool_id) { + Assert::stringNotEmpty($pool_id); + + $params['pool_id'] = $pool_id; + } + if (!empty($dkimKeySize)) { + Assert::oneOf( + $dkimKeySize, + self::DKIM_SIZES, + 'Length of your domain’s generated DKIM key must be 1024 or 2048' + ); + $params['dkim_key_size'] = $dkimKeySize; + } + + $response = $this->httpPost('/v3/domains', $params, $requestHeaders); + + return $this->hydrateResponse($response, CreateResponse::class); + } + + /** + * Removes a domain from the account. + * WARNING: This action is irreversible! Be cautious! + * @param string $domain name of the domain + * @param array $requestHeaders + * @return DeleteResponse|array|ResponseInterface + * @throws ClientExceptionInterface + */ + public function delete(string $domain, array $requestHeaders = []) + { + Assert::stringNotEmpty($domain); + + $response = $this->httpDelete(sprintf('/v3/domains/%s', $domain), [], $requestHeaders); + + return $this->hydrateResponse($response, DeleteResponse::class); + } + + /** + * Returns a list of SMTP credentials for the specified domain. + * @param string $domain name of the domain + * @param int $limit Number of credentials to return + * @param int $skip Number of credentials to omit from the list + * @param array $requestHeaders + * @return CredentialResponse + * @throws ClientExceptionInterface + */ + public function credentials(string $domain, int $limit = 100, int $skip = 0, array $requestHeaders = []) + { + Assert::stringNotEmpty($domain); + $params = [ + 'limit' => $limit, + 'skip' => $skip, + ]; + + $response = $this->httpGet(sprintf('/v3/domains/%s/credentials', $domain), $params, $requestHeaders); + + return $this->hydrateResponse($response, CredentialResponse::class); + } + + /** + * Create a new SMTP credential pair for the specified domain. + * @param string $domain name of the domain + * @param string $login SMTP Username + * @param string $password SMTP Password. Length min 5, max 32. + * @param array $requestHeaders + * @return CreateCredentialResponse|array|ResponseInterface + * @throws ClientExceptionInterface + */ + public function createCredential(string $domain, string $login, string $password, array $requestHeaders = []) + { + Assert::stringNotEmpty($domain); + Assert::stringNotEmpty($login); + Assert::stringNotEmpty($password); + Assert::lengthBetween($password, 5, 32, 'SMTP password must be between 5 and 32 characters.'); + + $params = [ + 'login' => $login, + 'password' => $password, + ]; + + $response = $this->httpPost(sprintf('/v3/domains/%s/credentials', $domain), $params, $requestHeaders); + + return $this->hydrateResponse($response, CreateCredentialResponse::class); + } + + /** + * Update a set of SMTP credentials for the specified domain. + * + * @param string $domain name of the domain + * @param string $login SMTP Username + * @param string $pass New SMTP Password. Length min 5, max 32. + * + * @return UpdateCredentialResponse|array|ResponseInterface + * @throws ClientExceptionInterface + */ + public function updateCredential(string $domain, string $login, string $pass, array $requestHeaders = []) + { + Assert::stringNotEmpty($domain); + Assert::stringNotEmpty($login); + Assert::stringNotEmpty($pass); + Assert::lengthBetween($pass, 5, 32, 'SMTP password must be between 5 and 32 characters.'); + + $params = [ + 'password' => $pass, + ]; + + $response = $this->httpPut(sprintf('/v3/domains/%s/credentials/%s', $domain, $login), $params, $requestHeaders); + + return $this->hydrateResponse($response, UpdateCredentialResponse::class); + } + + /** + * Remove a set of SMTP credentials from the specified domain. + * @param string $domain name of the domain + * @param string $login SMTP Username + * @param array $requestHeaders + * @return DeleteCredentialResponse|array|ResponseInterface + * @throws ClientExceptionInterface + */ + public function deleteCredential(string $domain, string $login, array $requestHeaders = []) + { + Assert::stringNotEmpty($domain); + Assert::stringNotEmpty($login); + + $response = $this->httpDelete( + sprintf( + '/v3/domains/%s/credentials/%s', + $domain, + $login + ), + [], + $requestHeaders + ); + + return $this->hydrateResponse($response, DeleteCredentialResponse::class); + } + + /** + * Returns delivery connection settings for the specified domain. + * @param string $domain name of the domain + * @param array $requestHeaders + * @return ConnectionResponse|ResponseInterface + * @throws ClientExceptionInterface + */ + public function connection(string $domain, array $requestHeaders = []) + { + Assert::stringNotEmpty($domain); + + $response = $this->httpGet(sprintf('/v3/domains/%s/connection', $domain), [], $requestHeaders); + + return $this->hydrateResponse($response, ConnectionResponse::class); + } + + /** + * Updates the specified delivery connection settings for the specified domain. + * If a parameter is passed in as null, it will not be updated. + * @param string $domain name of the domain + * @param bool|null $requireTLS enforces that messages are sent only over a TLS connection + * @param bool|null $noVerify disables TLS certificate and hostname verification + * @param array $requestHeaders + * @return UpdateConnectionResponse|array|ResponseInterface + * @throws ClientExceptionInterface + */ + public function updateConnection(string $domain, ?bool $requireTLS, ?bool $noVerify, array $requestHeaders = []) + { + Assert::stringNotEmpty($domain); + $params = []; + + if (null !== $requireTLS) { + $params['require_tls'] = $requireTLS ? 'true' : 'false'; + } + + if (null !== $noVerify) { + $params['skip_verification'] = $noVerify ? 'true' : 'false'; + } + + $response = $this->httpPut(sprintf('/v3/domains/%s/connection', $domain), $params, $requestHeaders); + + return $this->hydrateResponse($response, UpdateConnectionResponse::class); + } + + /** + * Update webScheme for existing domain + * See below for spam filtering parameter information. + * {@link https://documentation.mailgun.com/en/latest/user_manual.html#um-spam-filter}. + * @see https://documentation.mailgun.com/en/latest/api-domains.html#domains + * @param string $domain name of the domain + * @param string $webScheme `http` or `https` - set your open, click and unsubscribe URLs to use http or https. The default is http + * @param array $requestHeaders + * @return WebSchemeResponse|array|ResponseInterface + * @throws ClientExceptionInterface + */ + public function updateWebScheme(string $domain, string $webScheme = 'http', array $requestHeaders = []) + { + $params = []; + Assert::stringNotEmpty($domain); + Assert::stringNotEmpty($webScheme); + Assert::oneOf($webScheme, ['https', 'http']); + + $params['web_scheme'] = $webScheme; + + $response = $this->httpPut(sprintf('/v3/domains/%s', $domain), $params, $requestHeaders); + + return $this->hydrateResponse($response, WebSchemeResponse::class); + } + + /** + * Returns a single domain. + * @param string $domain name of the domain + * @param array $requestHeaders + * @return VerifyResponse|array|ResponseInterface + * @throws ClientExceptionInterface + */ + public function verify(string $domain, array $requestHeaders = []) + { + Assert::stringNotEmpty($domain); + + $response = $this->httpPut(sprintf('/v3/domains/%s/verify', $domain), [], $requestHeaders); + + return $this->hydrateResponse($response, VerifyResponse::class); + } + + /** + * Returns a domain tracking settings. + * @param string $domain name of the domain + * @param array $requestHeaders + * @return TrackingResponse|array|ResponseInterface + * @throws ClientExceptionInterface + */ + public function tracking(string $domain, array $requestHeaders = []) + { + Assert::stringNotEmpty($domain); + + $response = $this->httpGet(sprintf('/v3/domains/%s/tracking', $domain), [], $requestHeaders); + + return $this->hydrateResponse($response, TrackingResponse::class); + } + + /** + * Updates a domain click tracking settings. + * @param string $domain The name of the domain + * @param string $active The status for this tracking (one of: yes, no) + * @param array $requestHeaders + * @return UpdateClickTrackingResponse|array|ResponseInterface + * @throws ClientExceptionInterface + */ + public function updateClickTracking(string $domain, string $active, array $requestHeaders = []) + { + Assert::stringNotEmpty($domain); + Assert::stringNotEmpty($active); + Assert::oneOf($active, ['yes', 'no', 'htmlonly']); + + $params = [ + 'active' => $active, + ]; + + $response = $this->httpPut(sprintf('/v3/domains/%s/tracking/click', $domain), $params, $requestHeaders); + + return $this->hydrateResponse($response, UpdateClickTrackingResponse::class); + } + + /** + * Updates a domain open tracking settings. + * @param string $domain The name of the domain + * @param string $active The status for this tracking (one of: yes, no) + * @param array $requestHeaders + * @return UpdateOpenTrackingResponse|array|ResponseInterface + * @throws ClientExceptionInterface + */ + public function updateOpenTracking(string $domain, string $active, array $requestHeaders = []) + { + Assert::stringNotEmpty($domain); + Assert::stringNotEmpty($active); + Assert::oneOf($active, ['yes', 'no']); + + $params = [ + 'active' => $active, + ]; + + $response = $this->httpPut(sprintf('/v3/domains/%s/tracking/open', $domain), $params, $requestHeaders); + + return $this->hydrateResponse($response, UpdateOpenTrackingResponse::class); + } + + /** + * Updates a domain unsubscribe tracking settings. + * @param string $domain The name of the domain + * @param string $active The status for this tracking (one of: yes, no) + * @param string $htmlFooter The footer for HTML emails + * @param string $textFooter The footer for plain text emails + * @param array $requestHeaders + * @return UpdateUnsubscribeTrackingResponse|array|ResponseInterface + * @throws ClientExceptionInterface + */ + public function updateUnsubscribeTracking(string $domain, string $active, string $htmlFooter, string $textFooter, array $requestHeaders = []) + { + Assert::stringNotEmpty($domain); + Assert::stringNotEmpty($active); + Assert::oneOf($active, ['yes', 'no', 'true', 'false']); + Assert::stringNotEmpty($htmlFooter); + Assert::nullOrString($textFooter); + + $params = [ + 'active' => (in_array($active, ['yes', 'true'], true)) ? 'true' : 'false', + 'html_footer' => $htmlFooter, + 'text_footer' => $textFooter, + ]; + + $response = $this->httpPut(sprintf('/v3/domains/%s/tracking/unsubscribe', $domain), $params, $requestHeaders); + + return $this->hydrateResponse($response, UpdateUnsubscribeTrackingResponse::class); + } + + /** + * Updates a CNAME used for tracking opens and clicks. + * + * @param string $domain The name of the domain + * @param string $webPrefix The tracking CNAME for a domain + * + * @return WebPrefixResponse|array|ResponseInterface + * @throws ClientExceptionInterface + */ + public function updateWebPrefix(string $domain, string $webPrefix) + { + Assert::stringNotEmpty($domain); + Assert::stringNotEmpty($webPrefix); + + $params = [ + 'web_prefix' => $webPrefix, + ]; + + $response = $this->httpPut(sprintf('/v3/domains/%s/web_prefix', $domain), $params); + + return $this->hydrateResponse($response, WebPrefixResponse::class); + } +} diff --git a/src/Mailgun.php b/src/Mailgun.php index 42db2626..b7649a5e 100644 --- a/src/Mailgun.php +++ b/src/Mailgun.php @@ -127,6 +127,14 @@ public function domains(): Api\Domain return new Api\Domain($this->httpClient, $this->requestBuilder, $this->hydrator); } + /** + * @return Api\DomainV4 + */ + public function domainsV4(): Api\DomainV4 + { + return new Api\DomainV4($this->httpClient, $this->requestBuilder, $this->hydrator); + } + /** * @return EmailValidation */ From 8ffe44d84999c6b754522406fb0bde799be3a6c0 Mon Sep 17 00:00:00 2001 From: Oleksandr Mykhailenko Date: Sun, 7 Jul 2024 15:44:47 +0300 Subject: [PATCH 3/7] Merge branch 'master' of github.com:mailgun/mailgun-php # Conflicts: # src/Api/DomainV4.php --- src/Api/DomainV4.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Api/DomainV4.php b/src/Api/DomainV4.php index 60886ecc..8b84cee1 100644 --- a/src/Api/DomainV4.php +++ b/src/Api/DomainV4.php @@ -105,8 +105,6 @@ public function create( string $spamAction = null, bool $wildcard = null, bool $forceDkimAuthority = null, - ?bool $wildcard = null, - ?bool $forceDkimAuthority = null, ?array $ips = null, ?string $pool_id = null, string $webScheme = 'http', From 266669b546b2189039790581b81251fe13b151f5 Mon Sep 17 00:00:00 2001 From: Oleksandr Mykhailenko Date: Tue, 30 Jul 2024 00:00:39 +0300 Subject: [PATCH 4/7] Fix stats endpoints. Added new method --- src/Api/Tag.php | 25 ++++++-- src/Model/Tag/TagLimitResponse.php | 99 ++++++++++++++++++++++++++++++ 2 files changed, 120 insertions(+), 4 deletions(-) create mode 100644 src/Model/Tag/TagLimitResponse.php diff --git a/src/Api/Tag.php b/src/Api/Tag.php index 12602ae1..a1de2d03 100644 --- a/src/Api/Tag.php +++ b/src/Api/Tag.php @@ -19,6 +19,7 @@ use Mailgun\Model\Tag\ProviderResponse; use Mailgun\Model\Tag\ShowResponse; use Mailgun\Model\Tag\StatisticsResponse; +use Mailgun\Model\Tag\TagLimitResponse; use Mailgun\Model\Tag\UpdateResponse; use Psr\Http\Client\ClientExceptionInterface; use Psr\Http\Message\ResponseInterface; @@ -104,12 +105,13 @@ public function update(string $domain, string $tag, string $description, array $ * @return StatisticsResponse|ResponseInterface * @throws ClientExceptionInterface */ - public function stats(string $domain, string $tag, array $params, array $requestHeaders = []) + public function stats(string $domain, array $params, array $requestHeaders = []) { Assert::stringNotEmpty($domain); - Assert::stringNotEmpty($tag); + Assert::stringNotEmpty($params['event']); + Assert::stringNotEmpty($params['tag']); - $response = $this->httpGet(sprintf('/v3/%s/tags/%s/stats', $domain, $tag), $params, $requestHeaders); + $response = $this->httpGet(sprintf('/v3/%s/tag/stats', $domain), $params, $requestHeaders); return $this->hydrateResponse($response, StatisticsResponse::class); } @@ -127,7 +129,7 @@ public function delete(string $domain, string $tag, array $requestHeaders = []) Assert::stringNotEmpty($domain); Assert::stringNotEmpty($tag); - $response = $this->httpDelete(sprintf('/v3/%s/tags/%s', $domain, $tag), [], $requestHeaders); + $response = $this->httpDelete(sprintf('/v3/%s/tag', $domain), ['tag' => $tag], $requestHeaders); return $this->hydrateResponse($response, DeleteResponse::class); } @@ -182,4 +184,19 @@ public function devices(string $domain, string $tag, array $requestHeaders = []) return $this->hydrateResponse($response, DeviceResponse::class); } + + /** + * @param string $domain + * @param array $requestHeaders + * @return TagLimitResponse + * @throws ClientExceptionInterface + */ + public function getTagLimits(string $domain, array $requestHeaders = []): TagLimitResponse + { + Assert::stringNotEmpty($domain); + + $response = $this->httpGet(sprintf('/v3/domains/%s/limits/tag', $domain), [], $requestHeaders); + + return $this->hydrateResponse($response, TagLimitResponse::class); + } } diff --git a/src/Model/Tag/TagLimitResponse.php b/src/Model/Tag/TagLimitResponse.php new file mode 100644 index 00000000..c40f201b --- /dev/null +++ b/src/Model/Tag/TagLimitResponse.php @@ -0,0 +1,99 @@ +setId($data['id'] ?? ''); + $item->setLimit($data['limit'] ?? 0); + $item->setCount($data['count'] ?? 0); + + return $item; + } + + /** + * @return string + */ + public function getId(): string + { + return $this->id; + } + + /** + * @param string $id + * @return void + */ + public function setId(string $id): void + { + $this->id = $id; + } + + /** + * @return int + */ + public function getLimit(): int + { + return $this->limit; + } + + /** + * @param int $limit + * @return void + */ + public function setLimit(int $limit): void + { + $this->limit = $limit; + } + + /** + * @return int + */ + public function getCount(): int + { + return $this->count; + } + + /** + * @param int $count + * @return void + */ + public function setCount(int $count): void + { + $this->count = $count; + } + + /** + * @return array + */ + #[ArrayShape(['id' => "string", 'limit' => "int", 'count' => "int"])] public function toArray(): array + { + return [ + 'id' => $this->getId(), + 'limit' => $this->getLimit(), + 'count' => $this->getCount(), + ]; + } +} From a97aad1dea771b3a718fe2bdd4f6ec86023e94ce Mon Sep 17 00:00:00 2001 From: Oleksandr Mykhailenko Date: Tue, 30 Jul 2024 00:06:22 +0300 Subject: [PATCH 5/7] Fix test --- tests/Api/TagTest.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/Api/TagTest.php b/tests/Api/TagTest.php index 2d578cbb..1866f2dc 100644 --- a/tests/Api/TagTest.php +++ b/tests/Api/TagTest.php @@ -127,10 +127,10 @@ public function testStats() $api = $this->getApiMock(); $api->expects($this->once()) ->method('httpGet') - ->with('/v3/domain/tags/foo/stats', ['event' => 'foo']) + ->with('/v3/domain/tag/stats', ['event' => 'foo', 'tag' => 'tag']) ->willReturn(new Response()); - $api->stats('domain', 'foo', ['event' => 'foo']); + $api->stats('domain', ['event' => 'foo', 'tag' => 'tag']); } public function testDelete() @@ -138,7 +138,7 @@ public function testDelete() $api = $this->getApiMock(); $api->expects($this->once()) ->method('httpDelete') - ->with('/v3/domain/tags/foo') + ->with('/v3/domain/tag') ->willReturn(new Response()); $api->delete('domain', 'foo'); From 4f897f3ab61fabfb53c137b2884738739afe7baf Mon Sep 17 00:00:00 2001 From: Oleksandr Mykhailenko Date: Tue, 30 Jul 2024 00:11:30 +0300 Subject: [PATCH 6/7] Fix test --- src/Model/Tag/TagLimitResponse.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Model/Tag/TagLimitResponse.php b/src/Model/Tag/TagLimitResponse.php index c40f201b..20d49993 100644 --- a/src/Model/Tag/TagLimitResponse.php +++ b/src/Model/Tag/TagLimitResponse.php @@ -11,7 +11,6 @@ namespace Mailgun\Model\Tag; -use JetBrains\PhpStorm\ArrayShape; use Mailgun\Model\ApiResponse; final class TagLimitResponse implements ApiResponse @@ -88,7 +87,7 @@ public function setCount(int $count): void /** * @return array */ - #[ArrayShape(['id' => "string", 'limit' => "int", 'count' => "int"])] public function toArray(): array + public function toArray(): array { return [ 'id' => $this->getId(), From 35fc69971c294caada168a5aa9a2bf26d43a51d3 Mon Sep 17 00:00:00 2001 From: Oleksandr Mykhailenko Date: Tue, 30 Jul 2024 00:13:32 +0300 Subject: [PATCH 7/7] Fix test --- src/Api/Tag.php | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/Api/Tag.php b/src/Api/Tag.php index a1de2d03..8b7f00f8 100644 --- a/src/Api/Tag.php +++ b/src/Api/Tag.php @@ -98,10 +98,9 @@ public function update(string $domain, string $tag, string $description, array $ /** * Returns statistics for a single tag. - * @param string $domain - * @param string $tag - * @param array $params - * @param array $requestHeaders + * @param string $domain + * @param array $params + * @param array $requestHeaders * @return StatisticsResponse|ResponseInterface * @throws ClientExceptionInterface */