badgr_badge-8.x-1.x-dev/src/BadgrService.php
src/BadgrService.php
<?php
namespace Drupal\badgr_badge;
use Drupal\Core\Session\AccountInterface;
use GuzzleHttp\Exception\RequestException;
use Drupal\Component\Serialization\Json;
use GuzzleHttp\ClientInterface;
use Drupal\node\Entity\Node;
/**
* Badgr token api uri
*/
const BADGR_TOKEN_API = 'https://api.badgr.io/o/token';
/**
* Badgr user authenticate api uri
*/
const BADGR_USER_AUTHENTICATE_API = 'https://api.badgr.io/v2/users/self';
/**
* Badgr issuers api uri
*/
const BADGR_ISSUERS = 'https://api.badgr.io/v2/issuers';
/**
* Badgr badgeclass api uri
*/
const BADGR_BADGECLASS = 'https://api.badgr.io/v2/badgeclasses';
/**
* Class BadgrService.
*/
class BadgrService implements BadgrServiceInterface {
/**
* The current user.
*
* @var \Drupal\Core\Session\AccountProxyInterface
*/
protected $currentUser;
/**
* An http client.
*
* @var \GuzzleHttp\ClientInterface
*/
protected $httpClient;
/**
* Constructs a new BadgrService object.
*
* @param \Drupal\Core\Session\AccountInterface $currentUser
* An current user.
* @param \GuzzleHttp\ClientInterface $http_client
* An HTTP client.
*/
public function __construct(AccountInterface $currentUser, ClientInterface $http_client) {
$this->currentUser = $currentUser;
$this->httpClient = $http_client;
}
/**
* Initiating badgr authentication by User details
*
* @param array $_post_details
*
* @return mixed
* @throws \GuzzleHttp\Exception\GuzzleException
*/
public function badgr_initiate(array $_post_details) {
try {
$request = $this->httpClient->request('POST', BADGR_TOKEN_API, [
'verify' => true,
'form_params' => $_post_details
]);
$access_token_data = Json::decode($request->getBody()->getContents());
}
catch (RequestException $e) {
//An error happened.
if ($e->hasResponse()) {
$response = $e->getResponse();
return Json::decode((string) $response->getBody());
}
}
return $access_token_data;
}
/**
* Refreshing the token if the access token gets expired.
*
* @param string $refresh_token
*
* @return mixed
* @throws \GuzzleHttp\Exception\GuzzleException
*/
public function badgr_refresh_token(string $refresh_token) {
$_post_details = [
'grant_type' => 'refresh_token',
'refresh_token' => $refresh_token
];
try {
$request = $this->httpClient->request('POST', BADGR_TOKEN_API, [
'verify' => true,
'form_params' => $_post_details
]);
$access_token_data = Json::decode($request->getBody()->getContents());
}
catch (RequestException $e) {
//An error happened.
if ($e->hasResponse()) {
watchdog_exception('badgr_badge', $e);
}
}
return $access_token_data;
}
/**
* Sets Badgr Header authorization
*
* @param string $access_token
*
* @return array
*/
public function badgr_set_header(string $access_token) {
return [
'accept' => 'application/json',
'Content-Type' => 'application/json',
'Authorization' => 'Bearer ' . $access_token,
];
}
/**
* To check whether the user is already authenticated.
*
* @param string $access_token
*
* @return boolean
* @throws \GuzzleHttp\Exception\GuzzleException
*/
public function badgr_user_authenticate(string $access_token) {
$_headers = $this->badgr_set_header($access_token);
try {
$request = $this->httpClient->request('GET', BADGR_USER_AUTHENTICATE_API, [
'headers' => $_headers
]);
$access_token_data = Json::decode($request->getBody()->getContents());
}
catch (RequestException $e) {
//An error happened.
if ($e->hasResponse()) {
return FALSE;
}
}
return $access_token_data['status']['success'];
}
/**
* To reinitiate the token based on the badgr account
*
* @param string $access_token
* @param string $badgr_account_id
*/
public function reauthenticate_token_badgr_account(string &$access_token, string $badgr_account_id) {
if ($badgr_account_id) {
$badge_account = Node::load($badgr_account_id);
$badgr_refresh_token = $badge_account->get('field_badgr_refresh_token')->getValue();
$badgr_refresh_data = $this->badgr_refresh_token($badgr_refresh_token[0]['value']);
if (isset($badgr_refresh_data['access_token']) && isset($badgr_refresh_data['refresh_token'])) {
$badge_account->set('field_badgr_access_token', $badgr_refresh_data['access_token']);
$badge_account->set('field_badgr_refresh_token', $badgr_refresh_data['refresh_token']);
$badge_account->save();
$access_token = $badgr_refresh_data['access_token'];
}
}
}
/**
* To create an issuer on the badgr account
*
* @param string $access_token
* @param string $_post_details
* @param string $badgr_account_id
*
* @return mixed
* @throws \GuzzleHttp\Exception\GuzzleException
*/
public function badgr_create_issuer(string $access_token, string $_post_details, string $badgr_account_id) {
if (!$this->badgr_user_authenticate($access_token)) {
$this->reauthenticate_token_badgr_account($access_token, $badgr_account_id);
}
$_headers = $this->badgr_set_header($access_token);
try {
$request = $this->httpClient->request('POST', BADGR_ISSUERS, [
'verify' => true,
'body' => $_post_details,
'headers' => $_headers
]);
$issuer_data = Json::decode($request->getBody()->getContents());
}
catch (RequestException $e) {
//An error happened.
if ($e->hasResponse()) {
watchdog_exception('badgr_badge', $e);
}
}
return $issuer_data;
}
/**
* To read/update/delete an issuer on the badgr account
*
* @param string $access_token
* @param string $entity_id
* @param string|null $method
* @param array|null $_post_details
* @param int $badgr_account_id
*
* @return mixed
* @throws \GuzzleHttp\Exception\GuzzleException
*/
public function badgr_update_rud_issuer(string $access_token, string $entity_id, string $method = NULL, array $_post_details = NULL, int $badgr_account_id) {
if (!$this->badgr_user_authenticate($access_token)) {
$this->reauthenticate_token_badgr_account($access_token, $badgr_account_id);
}
$_headers = $this->badgr_set_header($access_token);
try {
$api_url = BADGR_ISSUERS . '/' . $entity_id;
if ($method == 'PUT' && !empty($_post_details)) {
$request = $this->httpClient->request($method, $api_url, [
'verify' => true,
'form_params' => $_post_details,
'headers' => $_headers
]);
}
elseif ($method == 'DELETE') {
$request = $this->httpClient->request($method, $api_url, [
'verify' => true,
'headers' => $_headers
]);
}
else {
$request = $this->httpClient->request('GET', $api_url, [
'verify' => true,
'headers' => $_headers
]);
}
$issuer_data = Json::decode($request->getBody()->getContents());
}
catch (RequestException $e) {
//An error happened.
if ($e->hasResponse()) {
watchdog_exception('badgr_badge', $e);
}
}
return $issuer_data;
}
/**
* To get list of issuer on the badgr account
*
* @param string $access_token
* @param int $badgr_account_id
*
* @return mixed
* @throws \GuzzleHttp\Exception\GuzzleException
*/
public function badgr_list_all_issuer(string &$access_token, int $badgr_account_id) {
if (!$this->badgr_user_authenticate($access_token)) {
$this->reauthenticate_token_badgr_account($access_token, $badgr_account_id);
}
$_headers = $this->badgr_set_header($access_token);
try {
$request = $this->httpClient->request('GET', BADGR_ISSUERS, [
'verify' => true,
'headers' => $_headers
]);
$issuer_data = Json::decode($request->getBody()->getContents());
}
catch (RequestException $e) {
//An error happened.
if ($e->hasResponse()) {
$response = $e->getResponse();
return Json::decode((string) $response->getBody());
}
}
return $issuer_data;
}
/**
* To get list of existing issuer on the badgr account
*
* @param string $access_token
* @param int $badgr_account_id
*
* @return mixed
* @throws \GuzzleHttp\Exception\GuzzleException
*/
public function badgr_list_all_existing_issuer(string &$access_token, int $badgr_account_id) {
$issuer_data = [];
// Fetch all issuers from badgr
$_all_issuers = $this->badgr_list_all_issuer($access_token, $badgr_account_id);
if ($_all_issuers['status']['success']) {
if (count($_all_issuers['result']) > 0) {
foreach ($_all_issuers['result'] as $key_issuer => $value_issuer) {
$issuer_data[$value_issuer['entityId']] = t($value_issuer['name']);
}
}
}
return $issuer_data;
}
/**
* To create an based to the issuer on the badgr account
*
* @param string $access_token
* @param string $_post_details
* @param string $entity_id
* @param int $badgr_account_id
*
* @return mixed
* @throws \GuzzleHttp\Exception\GuzzleException
*/
public function badgr_create_issuer_badges(string &$access_token, string $_post_details, string $entity_id, int $badgr_account_id) {
if (!$this->badgr_user_authenticate($access_token)) {
$this->reauthenticate_token_badgr_account($access_token, $badgr_account_id);
}
$_headers = $this->badgr_set_header($access_token);
try {
$api_url = BADGR_ISSUERS . '/' . $entity_id . '/badgeclasses';
$request = $this->httpClient->request('POST', $api_url, [
'verify' => true,
'body' => $_post_details,
'headers' => $_headers
]);
$badges_data = Json::decode($request->getBody()->getContents());
}
catch (RequestException $e) {
//An error happened.
if ($e->hasResponse()) {
watchdog_exception('badgr_badge', $e);
}
}
return $badges_data;
}
/**
* To get list of badges on the badgr account
*
* @param string $access_token
* @param int $badgr_account_id
*
* @return mixed
* @throws \GuzzleHttp\Exception\GuzzleException
*/
public function badgr_list_all_badges(string &$access_token, int $badgr_account_id) {
if (!$this->badgr_user_authenticate($access_token)) {
$this->reauthenticate_token_badgr_account($access_token, $badgr_account_id);
}
$_headers = $this->badgr_set_header($access_token);
try {
$request = $this->httpClient->request('GET', BADGR_BADGECLASS, [
'verify' => true,
'headers' => $_headers
]);
$issuer_data = Json::decode($request->getBody()->getContents());
}
catch (RequestException $e) {
//An error happened.
if ($e->hasResponse()) {
watchdog_exception('badgr_badge', $e);
}
}
return $issuer_data;
}
/**
* To get list of badges on the badgr account
*
* @param string $access_token
* @param int $badgr_account_id
*
* @return mixed
* @throws \GuzzleHttp\Exception\GuzzleException
*/
public function badgr_list_all_existing_badges(string &$access_token, int $badgr_account_id) {
$badges_options = [];
$_all_badges = $this->badgr_list_all_badges($access_token, $badgr_account_id);
if ($_all_badges['status']['success']) {
if (count($_all_badges['result']) > 0) {
foreach ($_all_badges['result'] as $key_badges => $value_badges) {
$badges_options[$value_badges['issuer']][$value_badges['entityId']] = t($value_badges['name']);
}
}
}
return $badges_options;
}
/**
* To read/update/delete an issuer on the badgr account
*
* @param string $access_token
* @param string $entity_id
* @param string|NULL $method
* @param array|NULL $_post_details
* @param int $badgr_account_id
*
* @return mixed
* @throws \GuzzleHttp\Exception\GuzzleException
*/
public function badgr_update_rud_badges(string $access_token, string $entity_id, string $method = NULL, array $_post_details = NULL, int $badgr_account_id) {
if (!$this->badgr_user_authenticate($access_token)) {
$this->reauthenticate_token_badgr_account($access_token, $badgr_account_id);
}
$_headers = $this->badgr_set_header($access_token);
try {
$api_url = BADGR_BADGECLASS . '/' . $entity_id;
if ($method == 'PUT' && !empty($_post_details)) {
$request = $this->httpClient->request($method, $api_url, [
'verify' => true,
'form_params' => $_post_details,
'headers' => $_headers
]);
}
elseif ($method == 'DELETE') {
$request = $this->httpClient->request($method, $api_url, [
'verify' => true,
'headers' => $_headers
]);
}
else {
$request = $this->httpClient->request('GET', $api_url, [
'verify' => true,
'headers' => $_headers
]);
}
$badges_data = Json::decode($request->getBody()->getContents());
}
catch (RequestException $e) {
//An error happened.
if ($e->hasResponse()) {
watchdog_exception('badgr_badge', $e);
}
}
return $badges_data;
}
/**
* Award badges on the badgr account
*
* @param string $access_token
* @param string $_post_details
* @param string $entity_id
* @param int $badgr_account_id
*
* @return mixed
* @throws \GuzzleHttp\Exception\GuzzleException
*/
public function badgr_award_badges(string &$access_token, string $_post_details, string $entity_id, int $badgr_account_id) {
if (!$this->badgr_user_authenticate($access_token)) {
$this->reauthenticate_token_badgr_account($access_token, $badgr_account_id);
}
$badges_data = NULL;
$_headers = $this->badgr_set_header($access_token);
try {
$api_url = BADGR_BADGECLASS . '/' . $entity_id . '/assertions';
$request = $this->httpClient->request('POST', $api_url, [
'verify' => true,
'body' => $_post_details,
'headers' => $_headers
]);
$badges_data = Json::decode($request->getBody()->getContents());
}
catch (RequestException $e) {
//An error happened.
if ($e->hasResponse()) {
watchdog_exception('badgr_badge', $e);
}
}
return $badges_data;
}
/**
* To get list of badges on the badgr account
*
* @param string $access_token
* @param int $badgr_account_id
* @param string $entity_id
* @param string $recipient
*
* @return mixed
* @throws \GuzzleHttp\Exception\GuzzleException
*/
public function badgr_get_award_badges(string &$access_token, int $badgr_account_id, string $entity_id, string $recipient) {
if (!$this->badgr_user_authenticate($access_token)) {
$this->reauthenticate_token_badgr_account($access_token, $badgr_account_id);
}
$_headers = $this->badgr_set_header($access_token);
try {
$api_url = BADGR_BADGECLASS . '/' . $entity_id . '/assertions?recipient=' . $recipient;
$request = $this->httpClient->request('GET', $api_url, [
'verify' => true,
'headers' => $_headers
]);
$all_awarded_badges = Json::decode($request->getBody()->getContents());
}
catch (RequestException $e) {
//An error happened.
if ($e->hasResponse()) {
watchdog_exception('badgr_badge', $e);
}
}
return $all_awarded_badges;
}
}
