mailjet-8.x-2.7/src/MailjetIframe.php
src/MailjetIframe.php
<?php
namespace Drupal\mailjet;
/**
* @description MailjetIframe API v.3
* @package MailjetIframes API v.3
*/
class MailjetIframe
{
public const ON = 'on';
public const OFF = 'off';
public const PAGE_STATS = 'stats';
public const PAGE_CAMPAIGNS = 'campaigns';
public const PAGE_CONTACTS = 'contacts';
public const PAGE_AUTOMATION = 'workflow';
public const PAGE_WIDGET = 'widget';
public const PAGE_TEMPLATES = 'templates';
public const PAGE_EDIT_TEMPLATE = 'template/{param}/build';
public const SESSION_NAME = 'MailjetIframeToken';
public const SESSION_SET = 'MailjetIframeTokenSet';
/**
*
* @var \Mailjet\Client|null
*/
private $mailjetApi;
/**
*
* @var array
*/
private array $locales = ['fr_FR', 'en_US', 'en_GB', 'en_EU', 'de_DE', 'es_ES', 'it_IT'];
/**
*
* @var array
*/
private array $allowedPages = [
self::PAGE_STATS,
self::PAGE_CONTACTS,
self::PAGE_CAMPAIGNS,
self::PAGE_AUTOMATION,
self::PAGE_WIDGET,
self::PAGE_TEMPLATES,
self::PAGE_EDIT_TEMPLATE,
];
/**
*
* @var string
*/
private string $url = 'https://app.mailjet.com/';
/**
*
* @var string
*/
private string $callback = '';
/**
*
* @var string
*/
private string $locale = 'fr_FR';
/**
*
* @var int
*/
private int $sessionExpiration = 3600;
/**
*
* @var array
*/
private array $tokenAccessAvailable = ['campaigns', 'contacts', 'stats', 'email_automation', 'widget', 'transactional'];
/**
*
* @var string
*/
private string $tokenAccess = '';
/**
*
* @var string
*/
private string $documentationProperties = self::ON;
/**
*
* @var string
*/
private string $newContactListCreation = self::ON;
/**
*
* @var string
*/
private string $menu = self::ON;
/**
* Flag to mark if to display the black campaign name title bar in the iframe.
*
* @access private
* @var string 'on''off'
*/
private string $showBar = self::ON;
/**
* Flag to mark if "create campaign" button in the campaign page should be displayed.
*
* @access private
* @var string 'on''off'
*/
private string $crc = self::OFF;
/**
* Flag to mark if MJ sending policy should be removed or not.
*
* @access private
* @var string 'on''off'
*/
private string $sp = self::OFF;
/**
*
* @var string
*/
private string $initialPage = self::PAGE_STATS;
/**
* Flag to mark if footer should be displayed.
*
* @access private
* @var string
*/
private string $showFooter = self::ON;
/**
*
* @param string $apiKey
* @param string $secretKey
* @param bool $startSession
* @throws \Exception
*/
public function __construct(string $apiKey, string $secretKey, bool $startSession = \true) {
if (\true === $startSession) {
$this->startSession();
}
$this->mailjetApi = MailjetApi::getApiClient($apiKey, $secretKey);
}//end __construct()
/**
* Turn email footer signature on/off.
*
* @param string $flag
*/
public function turnFooter($flag) {
$this->showFooter = $flag;
return $this;
}//end turnFooter()
/**
*
* @param int $seconds
* @return MailjetIframe
* @throws \MailjetIframe\MailjetException
*/
public function setTokenExpiration(int $seconds = 600): MailjetIframe {
if (!\is_numeric($seconds)) {
throw new MailjetException('Token expiration should be a valid number.');
}
if ($seconds <= 0) {
throw new MailjetException('Token expiration should be greater than 0');
}
$this->sessionExpiration = $seconds;
return $this;
}//end setTokenExpiration()
/**
*
* @param string $callback
* @param bool $isEncoded
* @return MailjetIframe
*/
public function setCallback($callback = '', $isEncoded = \false): MailjetIframe {
if ($isEncoded) {
$this->callback = $callback;
}
else {
$this->callback = \urldecode($callback);
}
return $this;
}//end setCallback()
/**
*
* @param string $locale
* @return MailjetIframe
* @throws MailjetException
*/
public function setLocale($locale = 'fr_FR'): MailjetIframe {
if (!\in_array($locale, $this->locales)) {
throw new MailjetException("{$locale} is not supported.");
}
$this->locale = $locale;
return $this;
}//end setLocale()
/**
* @param array $access
* @return MailjetIframe
* @throws MailjetException
*/
public function setTokenAccess(array $access = []): MailjetIframe {
foreach ($access as $value) {
if (!\in_array($value, $this->tokenAccessAvailable)) {
throw new MailjetException("{$value} is not a valid token access.");
}
}
$this->tokenAccess = \implode(', ', $access);
return $this;
}//end setTokenAccess()
/**
* @param string $flag
* @return MailjetIframe
* @throws MailjetException
*/
public function turnDocumentationProperties(string $flag = self::ON): MailjetIframe {
if (!$this->isAllowedOnOffParameter($flag)) {
throw new MailjetException('Documentation properties requires a valid on/off parameter.');
}
$this->documentationProperties = $flag;
return $this;
}//end turnDocumentationProperties()
/**
* @param string $flag
* @return MailjetIframe
* @throws MailjetException
*/
public function turnNewContactListCreation(string $flag = self::ON): MailjetIframe {
if (!$this->isAllowedOnOffParameter($flag)) {
throw new MailjetException('New contact list creation requires a valid on/off parameter.');
}
$this->newContactListCreation = $flag;
return $this;
}//end turnNewContactListCreation()
/**
* @param string $flag
* @return MailjetIframe
* @throws MailjetException
*/
public function turnMenu(string $flag = self::ON): MailjetIframe {
if (!$this->isAllowedOnOffParameter($flag)) {
throw new MailjetException('Menu requires a valid on/off parameter.');
}
$this->menu = $flag;
return $this;
}//end turnMenu()
/**
* @param string $flag
* @return MailjetIframe
* @throws MailjetException
*/
public function turnBar(string $flag = self::ON): MailjetIframe {
if (!$this->isAllowedOnOffParameter($flag)) {
throw new MailjetException('Bar requires a valid on/off parameter.');
}
$this->showBar = $flag;
return $this;
}//end turnBar()
/**
* @param string $flag
* @return MailjetIframe
* @throws MailjetException
*/
public function turnCreateCampaignButton(string $flag = self::ON): MailjetIframe {
if (!$this->isAllowedOnOffParameter($flag)) {
throw new MailjetException('Create campaign requires a valid on/off parameter.');
}
$this->crc = $flag;
return $this;
}//end turnCreateCampaignButton()
/**
* @param string $flag
* @return MailjetIframe
* @throws MailjetException
*/
public function turnSendingPolicy(string $flag = self::ON): MailjetIframe {
if (!$this->isAllowedOnOffParameter($flag)) {
throw new MailjetException('Sending policy requires a valid on/off parameter.');
}
$this->sp = $flag;
return $this;
}//end turnSendingPolicy()
/**
* @param string $page
* @param string $param
* @return MailjetIframe
* @throws MailjetException
*/
public function setInitialPage(string $page = self::PAGE_STATS, $param = NULL): MailjetIframe {
if (!\in_array($page, $this->allowedPages)) {
throw new MailjetException("{$page} is unknown.");
}
if (\strpos($page, '{param}') !== \false) {
if (!isset($param)) {
throw new MailjetException("{$page} need a parameter");
}
$page = \str_replace('{param}', $param, $page);
}
$this->initialPage = $page;
return $this;
}//end setInitialPage()
/**
*
* @return string
*/
public function getHtml($isPassportIframe = \false): string {
$iframeUrl = $this->getIframeUrl($isPassportIframe);
$html = <<<HTML
<iframe
width="100%s"
height="100%s"
frameborder="0" style="border:0"
src="%s">
</iframe>
HTML;
return \sprintf($html, '%', '%', $iframeUrl);
}//end getHtml()
/**
*
* @param mixed $parameter
* @return bool
*/
private function isAllowedOnOffParameter($parameter): bool {
if ($parameter !== self::ON && $parameter !== self::OFF) {
return \false;
}
return \true;
}//end isAllowedOnOffParameter()
/**
*
* @return string
* @throws MailjetException
*/
private function getToken() {
if (!isset($_SESSION[self::SESSION_NAME])) {
$_SESSION[self::SESSION_NAME] = $this->generateToken();
$_SESSION[self::SESSION_SET] = \time();
}
else {
if ((\time() - $_SESSION[self::SESSION_SET]) >= $this->sessionExpiration) {
$_SESSION[self::SESSION_NAME] = $this->generateToken();
$_SESSION[self::SESSION_SET] = \time();
}
}
return $_SESSION[self::SESSION_NAME];
}//end getToken()
/**
*
* @return string
* @throws MailjetException
* @throws \Exception
*/
private function generateToken() {
$config_mailjet = \Drupal::configFactory()->getEditable('mailjet.settings');
$apiToken = $config_mailjet->get('APItoken');
if ($apiToken) {
return $apiToken;
}
$params = [
'AllowedAccess' => 'campaigns,contacts,stats,pricing,account,reports',
'APIKeyALT' => $config_mailjet->get('mailjet_username'),
'TokenType' => 'iframe',
'IsActive' => TRUE,
'SentData' => serialize(['plugin' => 'drupal-3.0']),
];
$response = MailjetApi::createApiToken($params);
if ($response) {
$config_mailjet->set('APItoken', $response[0]['Token']);
$config_mailjet->save();
}
return $response[0]['Token'] ?? NULL;
}//end generateToken()
/**
*
* @return string
*/
private function getIframeUrl($isPassportIframe = \false): string {
$url = $this->url . $this->initialPage . '?t=' . $this->getToken();
if ($isPassportIframe) {
$url .= '&lang=' . $this->locale;
}
else {
$url .= '&locale=' . $this->locale;
}
if ($this->callback !== '') {
$url .= '&cb=' . $this->callback;
}
if ($this->documentationProperties === self::OFF) {
$url .= '&d=hide';
}
if ($this->newContactListCreation === self::OFF) {
$url .= '&l=yes';
}
if ($this->menu === self::OFF) {
$url .= '&show_menu=none';
}
if ($this->showBar === self::ON) {
$url .= '&show_bar=yes';
}
if ($this->crc === self::OFF) {
$url .= '&crc=hide';
}
if ($this->sp === self::ON) {
$url .= '&sp=display';
}
$url .= $this->showFooter === self::OFF ? '&sftr=empty' : '';
return $url;
}//end getIframeUrl()
/**
* @return void
*/
private function startSession(): void {
if (\false === $this->isSessionStarted()) {
\session_start();
}
}//end startSession()
/**
* @return bool
*/
private function isSessionStarted(): bool {
if (php_sapi_name() !== 'cli') {
if (\version_compare(\phpversion(), '7.4', '>=')) {
return \session_status() === \PHP_SESSION_ACTIVE;
}
return !(session_id() === '');
}
return \false;
}//end isSessionStarted()
}//end class
