Skip to content

Commit

Permalink
Merge pull request #1 from HiccupInsurance/add-member-api
Browse files Browse the repository at this point in the history
Add member api
  • Loading branch information
gusdecool committed Nov 14, 2017
2 parents 75df0e5 + 51b5886 commit 6f12e2b
Show file tree
Hide file tree
Showing 6 changed files with 135 additions and 6 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
vendor/
composer.lock
config.yml
4 changes: 4 additions & 0 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,5 +17,9 @@
"require": {
"php": ">=7.0.1",
"guzzlehttp/guzzle": "^6.3"
},
"require-dev": {
"hassankhan/config": "^0.11.2",
"symfony/yaml": "^3.3"
}
}
18 changes: 18 additions & 0 deletions smoke-test/member.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?php

require(__DIR__ . '/../vendor/autoload.php');

use Hiccup\MailChimpApi\MailChimp;
use Noodlehaus\Config;

$config = new Config(__DIR__ . '/../config.yml');
$mailChimp = new MailChimp($config->get('api_key'));

$response = $mailChimp->getMember()->subscribe(
$config->get('list_id'),
[
'email_address' => 'budi.arsana@hiccup.co'
]
);

var_dump($response);
74 changes: 70 additions & 4 deletions src/Api/Member.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@
namespace Hiccup\MailChimpApi\Api;

use GuzzleHttp\Client;
use GuzzleHttp\RequestOptions;
use Hiccup\MailChimpApi\Exception\InvalidParametersException;
use Hiccup\MailChimpApi\MailChimp;

/**
* Class Member
Expand Down Expand Up @@ -48,15 +51,78 @@ public function __construct(Client $client)
/**
* @param string $listId
* @param array $parameters see MailChimp doc for list of available parameters
* @return array
* @throws InvalidParametersException
*/
public function subscribe(string $listId, array $parameters): array
{
if (isset($parameters['email_address']) === false) {
throw new InvalidParametersException(['email_address' => 'required']);
}

$parameters['status_if_new'] = Member::STATUS_SUBSCRIBED;
$parameters['status'] = Member::STATUS_SUBSCRIBED;
$member = $this->put($listId, $parameters);

return $member;
}

/**
* @param string $listId
* @param array $parameters
* @return array
* @throws InvalidParametersException
* @see http://developer.mailchimp.com/documentation/mailchimp/reference/lists/members/#edit-put_lists_list_id_members_subscriber_hash
*/
public function put(string $listId, array $parameters): array
{
if (isset($parameters['email_address']) === false) {
throw new InvalidParametersException(['email_address' => 'required']);
}

$response = $this->client->put(
sprintf('/%s/lists/%s/members/%s', MailChimp::VERSION, $listId, md5($parameters['email_address'])),
[RequestOptions::JSON => $parameters]
);

return json_decode((string) $response->getBody(), true);
}

/**
* @param string $listId
* @param array $parameters
* @return array
* @throws InvalidParametersException
* @see http://developer.mailchimp.com/documentation/mailchimp/reference/lists/members/#edit-patch_lists_list_id_members_subscriber_hash
*/
public function patch(string $listId, array $parameters): array
{
if (isset($parameters['email_address']) === false) {
throw new InvalidParametersException(['email_address' => 'required']);
}

$response = $this->client->patch(
sprintf('/%s/lists/%s/members/%s', MailChimp::VERSION, $listId, md5($parameters['email_address'])),
[RequestOptions::JSON => $parameters]
);

return json_decode((string) $response->getBody(), true);
}

/**
* @param string $listId
* @param string $email
*
* @return array
*
* @see http://developer.mailchimp.com/documentation/mailchimp/reference/lists/members/#create-post_lists_list_id_members
* @see http://developer.mailchimp.com/documentation/mailchimp/reference/lists/members/#read-get_lists_list_id_members_subscriber_hash
*/
public function create(string $listId, array $parameters): array
public function get(string $listId, string $email): array
{
$response = $this->client->post(sprintf('/lists/%s/members', $listId), $parameters);
$response = $this->client->get(
sprintf('/%s/lists/%s/members/%s', MailChimp::VERSION, $listId, md5($email))
);

return json_decode((string) $response, true);
return json_decode((string) $response->getBody(), true);
}
}
34 changes: 34 additions & 0 deletions src/Exception/InvalidParametersException.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<?php

namespace Hiccup\MailChimpApi\Exception;

use Throwable;

final class InvalidParametersException extends \Exception
{

/**
* @param array $errors
* @param int $code
* @param Throwable|null $previous
*/
public function __construct(array $errors, $code = 400, Throwable $previous = null)
{
parent::__construct($this->buildMessage($errors), $code, $previous);
}

/**
* @param array $errors
* @return string
*/
private function buildMessage(array $errors): string
{
$listMessages = [];

foreach ($errors as $parameter => $message) {
$listMessages[] = sprintf('Parameter "%s" is "%s"', $parameter, $message);
}

return implode('. ', $listMessages);
}
}
10 changes: 8 additions & 2 deletions src/MailChimp.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,12 @@
final class MailChimp
{

#----------------------------------------------------------------------------------------------
# Constants
#----------------------------------------------------------------------------------------------

const VERSION = '3.0';

#----------------------------------------------------------------------------------------------
# Properties
#----------------------------------------------------------------------------------------------
Expand All @@ -30,7 +36,7 @@ public function __construct(string $apiKey)
$dataCenter = explode('-', $apiKey)[1];

$client = new Client([
'base_uri' => sprintf('https://%s.api.mailchimp.com/3.0', $dataCenter),
'base_uri' => sprintf('https://%s.api.mailchimp.com', $dataCenter),
'auth' => ['any', $apiKey]
]);

Expand All @@ -44,7 +50,7 @@ public function __construct(string $apiKey)
/**
* @return Member
*/
public function member(): Member
public function getMember(): Member
{
return $this->member;
}
Expand Down

0 comments on commit 6f12e2b

Please sign in to comment.