romanpitak/dotMailer-API-v2-PHP-client

View on GitHub
src/Resources/Resources.php

Summary

Maintainability
F
3 days
Test Coverage
<?php
/**
 *
 *
 * @author Roman Piták <roman@pitak.net>
 *
 */


namespace DotMailer\Api\Resources;

use DotMailer\Api\DataTypes\ApiAccount;
use DotMailer\Api\DataTypes\ApiAddressBook;
use DotMailer\Api\DataTypes\ApiAddressBookList;
use DotMailer\Api\DataTypes\ApiCampaign;
use DotMailer\Api\DataTypes\ApiCampaignContactClickList;
use DotMailer\Api\DataTypes\ApiCampaignContactOpenList;
use DotMailer\Api\DataTypes\ApiCampaignContactPageViewList;
use DotMailer\Api\DataTypes\ApiCampaignContactReplyList;
use DotMailer\Api\DataTypes\ApiCampaignContactRoiDetailList;
use DotMailer\Api\DataTypes\ApiCampaignContactSocialBookmarkViewList;
use DotMailer\Api\DataTypes\ApiCampaignContactSummary;
use DotMailer\Api\DataTypes\ApiCampaignContactSummaryList;
use DotMailer\Api\DataTypes\ApiCampaignFromAddressList;
use DotMailer\Api\DataTypes\ApiCampaignList;
use DotMailer\Api\DataTypes\ApiCampaignSend;
use DotMailer\Api\DataTypes\ApiCampaignSummary;
use DotMailer\Api\DataTypes\ApiContact;
use DotMailer\Api\DataTypes\ApiContactImport;
use DotMailer\Api\DataTypes\ApiContactImportReport;
use DotMailer\Api\DataTypes\ApiContactList;
use DotMailer\Api\DataTypes\ApiContactResubscription;
use DotMailer\Api\DataTypes\ApiContactSuppression;
use DotMailer\Api\DataTypes\ApiContactSuppressionList;
use DotMailer\Api\DataTypes\ApiDataField;
use DotMailer\Api\DataTypes\ApiDataFieldList;
use DotMailer\Api\DataTypes\ApiDependencyResult;
use DotMailer\Api\DataTypes\ApiDocument;
use DotMailer\Api\DataTypes\ApiDocumentFolder;
use DotMailer\Api\DataTypes\ApiDocumentFolderList;
use DotMailer\Api\DataTypes\ApiDocumentList;
use DotMailer\Api\DataTypes\ApiFileMedia;
use DotMailer\Api\DataTypes\ApiImage;
use DotMailer\Api\DataTypes\ApiImageFolder;
use DotMailer\Api\DataTypes\ApiImageFolderList;
use DotMailer\Api\DataTypes\ApiJsonData;
use DotMailer\Api\DataTypes\ApiProgram;
use DotMailer\Api\DataTypes\ApiProgramList;
use DotMailer\Api\DataTypes\ApiProgramEnrolment;
use DotMailer\Api\DataTypes\ApiProgramEnrolmentList;
use DotMailer\Api\DataTypes\ApiResubscribeResult;
use DotMailer\Api\DataTypes\ApiSegmentList;
use DotMailer\Api\DataTypes\ApiSegmentRefresh;
use DotMailer\Api\DataTypes\ApiSms;
use DotMailer\Api\DataTypes\ApiTemplate;
use DotMailer\Api\DataTypes\ApiTemplateList;
use DotMailer\Api\DataTypes\ApiTransactionalData;
use DotMailer\Api\DataTypes\ApiTransactionalDataImport;
use DotMailer\Api\DataTypes\ApiTransactionalDataImportReport;
use DotMailer\Api\DataTypes\ApiTransactionalDataList;
use DotMailer\Api\DataTypes\Guid;
use DotMailer\Api\DataTypes\IApiTemplate;
use DotMailer\Api\DataTypes\XsDateTime;
use DotMailer\Api\DataTypes\XsInt;
use DotMailer\Api\DataTypes\XsString;
use DotMailer\Api\Rest\IClient;

final class Resources implements IResources
{
    /** @var IClient */
    private $restClient;

    public function __construct(IClient $restClient)
    {
        $this->restClient = $restClient;
    }


    /**
     * @param string $url
     * @param string $method
     * @param string $data
     * @return string
     */
    private function execute($url, $method = 'GET', $data = null)
    {
        return $this->restClient->execute(array($url, $method, $data), array());
    }

    /*
     * ========== RESOURCES ==========
     */

    /*
     * ========== account-info ==========
     */

    public function GetAccountInfo()
    {
        return new ApiAccount($this->execute('account-info'));
    }

    /*
     * ========== address-books ==========
     */

    public function PostAddressBooks(ApiAddressBook $addressBook)
    {
        return new ApiAddressBook($this->execute('address-books', 'POST', $addressBook->toJson()));
    }

    public function GetAddressBookCampaigns($addressBookId, $select = 1000, $skip = 0)
    {
        $url = sprintf("address-books/%s/campaigns?select=%s&skip=%s", $addressBookId, $select, $skip);
        return new ApiCampaignList($this->execute($url));
    }

    public function DeleteAddressBookContacts($addressBookId)
    {
        $this->execute(sprintf("address-books/%s/contacts", $addressBookId), 'DELETE');
    }

    public function PostAddressBookContacts($addressBookId, ApiContact $apiContact)
    {
        $url = sprintf("address-books/%s/contacts", $addressBookId);
        return new ApiContact($this->execute($url, 'POST', $apiContact->toJson()));
    }

    public function DeleteAddressBookContact($addressBookId, $apiContactId)
    {
        $url = sprintf("address-books/%s/contacts/%s", $addressBookId, $apiContactId);
        $this->execute($url, 'DELETE');
    }

    public function PostAddressBookContactsDelete($addressBookId, $contactIdList)
    {
        $url = sprintf("address-books/%s/contacts/delete", $addressBookId);
        $this->execute($url, 'POST', $contactIdList->toJson());
    }

    public function PostAddressBookContactsImport($addressBookId, ApiFileMedia $apiFileMedia)
    {
        $url = sprintf("address-books/%s/contacts/import", $addressBookId);
        return new ApiContactImport($this->execute($url, 'POST', $apiFileMedia->toJson()));
    }

    public function GetAddressBookContactsModifiedSinceDate($addressBookId, $date, $withFullData = false, $select = 1000, $skip = 0)
    {
        $withFullData = $withFullData ? 'true' : 'false';
        $url = sprintf("address-books/%s/contacts/modified-since/%s?withFullData=%s&select=%s&skip=%s", $addressBookId, $date, $withFullData, $select, $skip);
        return new ApiContactList($this->execute($url));
    }

    public function PostAddressBookContactsResubscribe($addressBookId, ApiContactResubscription $apiContactResubscription)
    {
        $url = sprintf("address-books/%s/contacts/resubscribe", $addressBookId);
        return new ApiResubscribeResult($this->execute($url, 'POST', $apiContactResubscription->toJson()));
    }

    public function PostAddressBookContactsUnsubscribe($addressBookId, ApiContact $apiContact)
    {
        $url = sprintf("address-books/%s/contacts/unsubscribe", $addressBookId);
        return new ApiContactSuppression($this->execute($url, 'POST', $apiContact->toJson()));
    }

    public function GetAddressBookContactsUnsubscribedSinceDate($addressBookId, $date, $select = 1000, $skip = 0)
    {
        $url = sprintf("address-books/%s/contacts/unsubscribed-since/%s?select=%s&skip=%s", $addressBookId, $date, $select, $skip);
        return new ApiContactSuppressionList($this->execute($url));
    }

    public function GetAddressBookContacts($addressBookId, $withFullData = false, $select = 1000, $skip = 0)
    {
        $withFullData = $withFullData ? 'true' : 'false';
        $url = sprintf("address-books/%s/contacts?withFullData=%s&select=%s&skip=%s", $addressBookId, $withFullData, $select, $skip);
        return new ApiContactList($this->execute($url));
    }

    public function GetAddressBookById($addressBookId)
    {
        return new ApiAddressBook($this->execute(sprintf("address-books/%s", $addressBookId)));
    }

    public function UpdateAddressBook(ApiAddressBook $apiAddressBook)
    {
        $url = sprintf("address-books/%s", $apiAddressBook->id);
        return new ApiAddressBook($this->execute($url, 'PUT', $apiAddressBook->toJson()));
    }

    public function DeleteAddressBook($addressBookId)
    {
        $this->execute(sprintf("address-books/%s", $addressBookId), 'DELETE');
    }

    public function GetAddressBooksPrivate($select = 1000, $skip = 0)
    {
        return new ApiAddressBookList($this->execute(sprintf("address-books/private?select=%s&skip=%s", $select, $skip)));
    }

    public function GetAddressBooksPublic($select = 1000, $skip = 0)
    {
        return new ApiAddressBookList($this->execute(sprintf("address-books/public?select=%s&skip=%s", $select, $skip)));
    }

    public function GetAddressBooks($select = 1000, $skip = 0)
    {
        return new ApiAddressBookList($this->execute(sprintf("address-books?select=%s&skip=%s", $select, $skip)));
    }

    /*
     * ========== campaigns ==========
     */

    public function PostCampaigns(ApiCampaign $apiCampaign)
    {
        return new ApiCampaign($this->execute('campaigns', 'POST', $apiCampaign->toJson()));
    }

    public function GetCampaignActivityByContactId($campaignId, $contactId)
    {
        return new ApiCampaignContactSummary($this->execute(sprintf("campaigns/%s/activities/%s", $campaignId, $contactId)));
    }

    public function GetCampaignActivityClicks($campaignId, $contactId, $select = 1000, $skip = 0)
    {
        $url = sprintf("campaigns/%s/activities/%s/clicks?select=%s&skip=%s", $campaignId, $contactId, $select, $skip);
        return new ApiCampaignContactClickList($this->execute($url));
    }

    public function GetCampaignActivityOpens($campaignId, $contactId, $select = 1000, $skip = 0)
    {
        $url = sprintf("campaigns/%s/activities/%s/opens?select=%s&skip=%s", $campaignId, $contactId, $select, $skip);
        return new ApiCampaignContactOpenList($this->execute($url));
    }

    public function GetCampaignActivityPageViews($campaignId, $contactId, $select = 1000, $skip = 0)
    {
        $url = sprintf("campaigns/%s/activities/%s/opens?select=%s&skip=%s", $campaignId, $contactId, $select, $skip);
        return new ApiCampaignContactPageViewList($this->execute($url));
    }

    public function GetCampaignActivityReplies($campaignId, $contactId, $select = 5, $skip = 0)
    {
        $url = sprintf("campaigns/%s/activities/%s/replies?select=%s&skip=%s", $campaignId, $contactId, $select, $skip);
        return new ApiCampaignContactReplyList($this->execute($url));
    }

    public function GetCampaignActivityRoiDetails($campaignId, $contactId, $select = 1000, $skip = 0)
    {
        $url = sprintf("campaigns/%s/activities/%s/roi-details?select=%s&skip=%s", $campaignId, $contactId, $select, $skip);
        return new ApiCampaignContactRoiDetailList($this->execute($url));
    }

    public function GetCampaignActivitySocialBookmarkViews($campaignId, $contactId, $select = 1000, $skip = 0)
    {
        $url = sprintf("campaigns/%s/activities/%s/social-bookmark-views?select=%s&skip=%s", $campaignId, $contactId, $select, $skip);
        return new ApiCampaignContactSocialBookmarkViewList($this->execute($url));
    }

    public function GetCampaignActivitiesSinceDateByDate($campaignId, $dateTime, $select = 1000, $skip = 0)
    {
        $url = sprintf("campaigns/%s/activities/since-date/%s?select=%s&skip=%s", $campaignId, $dateTime, $select, $skip);
        return new ApiCampaignContactSummaryList($this->execute($url));
    }

    public function GetCampaignActivities($campaignId, $select = 1000, $skip = 0)
    {
        $url = sprintf("campaigns/%s/activities?select=%s&skip=%s", $campaignId, $select, $skip);
        return new ApiCampaignContactSummaryList($this->execute($url));
    }

    public function GetCampaignAddressBooks($campaignId, $select = 1000, $skip = 0)
    {
        $url = sprintf("campaigns/%s/address-books?select=%s&skip=%s", $campaignId, $select, $skip);
        return new ApiAddressBookList($this->execute($url));
    }

    public function GetCampaignAttachments($campaignId)
    {
        $url = sprintf("campaigns/%s/attachments", $campaignId);
        return new ApiDocumentList($this->execute($url));
    }

    public function PostCampaignAttachments($campaignId, ApiDocument $apiDocument)
    {
        $url = sprintf("campaigns/%s/attachments", $campaignId);
        return new ApiDocument($this->execute($url, 'POST', $apiDocument->toJson()));
    }

    public function DeleteCampaignAttachment($campaignId, $documentId)
    {
        $this->execute(sprintf("campaigns/%s/attachments/%s", $campaignId, $documentId));
    }

    public function GetCampaignClicks($campaignId, $select = 1000, $skip = 0)
    {
        $url = sprintf("campaigns/%s/clicks?select=%s&skip=%s", $campaignId, $select, $skip);
        return new ApiCampaignContactClickList($this->execute($url));
    }

    public function PostCampaignCopy($campaignId)
    {
        $url = sprintf("campaigns/%s/copy", $campaignId);
        return new ApiCampaign($this->execute($url, 'POST'));
    }

    public function GetCampaignHardBouncingContacts($campaignId, $withFullData = false, $select = 1000, $skip = 0)
    {
        $withFullData = $withFullData ? 'true' : 'false';
        $url = sprintf("/campaigns/%s/hard-bouncing-contacts?withFullData=%s&select=%s&skip=%s", $campaignId, $withFullData, $select, $skip);
        return new ApiContactList($this->execute($url));
    }

    public function GetCampaignOpens($campaignId, $select = 1000, $skip = 0)
    {
        $url = sprintf("campaigns/%s/opens?select=%s&skip=%s", $campaignId, $select, $skip);
        return new ApiCampaignContactOpenList($this->execute($url));
    }

    public function GetCampaignPageViewsSinceDateByDate($campaignId, $dateTime, $select = 1000, $skip = 0)
    {
        $url = sprintf("campaigns/%s/page-views/since-date/%s?select=%s&skip=%s", $campaignId, $dateTime, $select, $skip);
        return new ApiCampaignContactPageViewList($this->execute($url));
    }

    public function GetCampaignRoiDetailsSinceDateByDate($campaignId, $dateTime, $select = 1000, $skip = 0)
    {
        $url = sprintf("campaigns/%s/roi-details/since-date/%s?select=%s&skip=%s", $campaignId, $dateTime, $select, $skip);
        return new ApiCampaignContactRoiDetailList($this->execute($url));
    }

    public function GetCampaignSocialBookmarkViews($campaignId, $select = 1000, $skip = 0)
    {
        $url = sprintf("campaigns/%s/social-bookmark-views?select=%s&skip=%s", $campaignId, $select, $skip);
        return new ApiCampaignContactSocialBookmarkViewList($this->execute($url));
    }

    public function GetCampaignSummary($campaignId)
    {
        return new ApiCampaignSummary($this->execute(sprintf("campaigns/%s/summary", $campaignId)));
    }

    public function GetCampaignById($campaignId)
    {
        return new ApiCampaign($this->execute(sprintf("campaigns/%s", $campaignId)));
    }

    public function UpdateCampaign(ApiCampaign $apiCampaign)
    {
        return new ApiCampaign($this->execute(sprintf("campaigns/%s", $apiCampaign->id), 'PUT', $apiCampaign->toJson()));
    }

    public function PostCampaignsSend(ApiCampaignSend $apiCampaignSend)
    {
        return new ApiCampaignSend($this->execute('campaigns/send', 'POST', $apiCampaignSend->toJson()));
    }

    public function GetCampaignsSendBySendId($sendId)
    {
        return new ApiCampaignSend(sprintf("campaigns/send/%s", $sendId));
    }

    public function GetCampaignsWithActivitySinceDate($dateTime, $select = 1000, $skip = 0)
    {
        $url = sprintf("campaigns/with-activity-since/%s?select=%s&skip=%s", $dateTime, $select, $skip);
        return new ApiCampaignList($this->execute($url));
    }

    public function GetCampaigns($select = 1000, $skip = 0)
    {
        return new ApiCampaignList($this->execute(sprintf("campaigns?select=%s&skip=%s", $select, $skip)));
    }


    /*
     * ========== contacts ==========
     */

    public function PostContacts(ApiContact $apiContact)
    {
        return new ApiContact($this->execute('contacts', 'POST', $apiContact->toJson()));
    }

    public function GetContactAddressBooks($contactId, $select = 1000, $skip = 0)
    {
        $url = sprintf("contacts/%s/address-books?select=%s&skip=%s", $contactId, $select, $skip);
        return new ApiAddressBookList($this->execute($url));
    }

    public function GetContactByEmail($email)
    {
        return new ApiContact($this->execute(sprintf("contacts/%s", $email)));
    }

    public function DeleteContactTransactionalData($contactId, $collectionName)
    {
        $url = sprintf("contacts/%s/transactional-data/%s", $contactId, $collectionName);
        $this->execute($url, 'DELETE');
    }

    public function GetContactTransactionalDataByCollectionName($contactId, $collectionName)
    {
        $url = sprintf("contacts/%s/transactional-data/%s", $contactId, $collectionName);
        return new ApiTransactionalDataList($this->execute($url));
    }

    public function GetContactById($contactId)
    {
        return new ApiContact($this->execute(sprintf("contacts/%s", $contactId)));
    }

    public function UpdateContact(ApiContact $apiContact)
    {
        $url = sprintf("contacts/%s", $apiContact->id);
        return new ApiContact($this->execute($url, 'PUT', $apiContact->toJson()));
    }

    public function DeleteContact($contactId)
    {
        $this->execute(sprintf("contacts/%s", $contactId), 'DELETE');
    }

    public function GetContactsCreatedSinceDate($date, $withFullData = false, $select = 1000, $skip = 0)
    {
        $withFullData = $withFullData ? 'true' : 'false';
        $url = sprintf("contacts/created-since/%s?withFullData=%s&select=%s&skip=%s", $date, $withFullData, $select, $skip);
        return new ApiContactList($this->execute($url));
    }

    public function PostContactsImport(ApiFileMedia $apiFileMedia)
    {
        return new ApiContactImport($this->execute('contacts/import', 'POST', $apiFileMedia->toJson()));
    }

    public function GetContactsImportByImportId($importId)
    {
        $url = sprintf("contacts/import/%s", $importId);
        return new ApiContactImport($this->execute($url));
    }

    public function GetContactsImportReport($importId)
    {
        $url = sprintf("contacts/import/%s/report", $importId);
        return new ApiContactImportReport($this->execute($url));
    }

    public function GetContactsImportReportFaults(Guid $importId)
    {
        $url = sprintf("contacts/import/%s/report-faults", $importId);
        return new XsString($this->execute($url));
    }

    public function GetContactsModifiedSinceDate($date, $withFullData = false, $select = 1000, $skip = 0)
    {
        $withFullData = $withFullData ? 'true' : 'false';
        $url = sprintf("contacts/modified-since/%s?withFullData=%s&select=%s&skip=%s", $date, $withFullData, $select, $skip);
        return new ApiContactList($this->execute($url));
    }

    public function PostContactsResubscribe(ApiContactResubscription $apiContactResubscription)
    {
        return new ApiResubscribeResult($this->execute('contacts/resubscribe', 'POST', $apiContactResubscription->toJson()));
    }

    public function GetContactsSuppressedSinceDate($date, $select = 1000, $skip = 0)
    {
        $url = sprintf("contacts/suppressed-since/%s?select=%s&skip=%s", $date, $select, $skip);
        return new ApiContactSuppressionList($this->execute($url));
    }

    public function PostContactsTransactionalData($collectionName, ApiTransactionalData $apiTransactionalData)
    {
        $url = sprintf("contacts/transactional-data/%s", $collectionName);
        return new ApiTransactionalData($this->execute($url, 'POST', $apiTransactionalData->toJson()));
    }

    public function PostContactsTransactionalDataUpdate($collectionName, $importId, ApiJsonData $apiJsonData)
    {
        $url = sprintf("contacts/transactional-data/%s/%s", $collectionName, $importId);
        return new ApiTransactionalData($this->execute($url, 'POST', $apiJsonData->toJson()));
    }

    public function DeleteContactsTransactionalData($collectionName, $key)
    {
        $url = sprintf("contacts/transactional-data/%s/%s", $collectionName, $key);
        $this->execute($url, 'DELETE');
    }

    public function GetContactsTransactionalDataByKey($collectionName, $key)
    {
        $url = sprintf("contacts/transactional-data/%s/%s", $collectionName, $key);
        return new ApiTransactionalData($this->execute($url));
    }

    public function PostContactsTransactionalDataImport($collectionName, ApiTransactionalDataList $apiTransactionalDataList)
    {
        $url = sprintf("contacts/transactional-data/import/%s", $collectionName);
        return new ApiTransactionalDataImport($this->execute($url, 'POST', $apiTransactionalDataList->toJson()));
    }

    public function GetContactsTransactionalDataImportByImportId($importId)
    {
        $url = sprintf("contacts/transactional-data/import/%s", $importId);
        return new ApiTransactionalDataImport($this->execute($url));
    }

    public function GetContactsTransactionalDataImportReport($importId)
    {
        $url = sprintf("contacts/transactional-data/import/%s/report", $importId);
        return new ApiTransactionalDataImportReport($this->execute($url));
    }

    public function PostContactsUnsubscribe(ApiContact $apiContact)
    {
        return new ApiContactSuppression($this->execute('contacts/unsubscribe', 'POST', $apiContact->toJson()));
    }

    public function GetContactsUnsubscribedSinceDate($data, $select = 1000, $skip = 0)
    {
        $url = sprintf("contacts/unsubscribed-since/%s?select=%s&skip=%s", $data, $select, $skip);
        return new ApiContactSuppressionList($this->execute($url));
    }

    public function GetContacts($withFullData = false, $select = 1000, $skip = 0)
    {
        $withFullData = $withFullData ? 'true' : 'false';
        $url = sprintf("contacts?withFullData=%s&select=%s&skip=%s", $withFullData, $select, $skip);
        return new ApiContactList($this->execute($url));
    }


    /*
     * ========== custom-from-addresses ==========
     */

    public function GetCustomFromAddresses($select = 1000, $skip = 0)
    {
        $url = sprintf("custom-from-addresses?select=%s&skip=%s", $select, $skip);
        return new ApiCampaignFromAddressList($this->execute($url));
    }


    /*
     * ========== data-fields ==========
     */

    public function PostDataFields(ApiDataField $apiDataField)
    {
        $this->execute('data-fields', 'POST', $apiDataField->toJson());
    }

    public function GetDataFields()
    {
        return new ApiDataFieldList($this->execute('data-fields'));
    }

    public function DeleteDataField($name)
    {
        $url = sprintf("data-fields/%s", $name);
        return new ApiDependencyResult($this->execute($url, 'DELETE'));
    }

    /*
     * ========== document-folders ==========
     */

    public function GetDocumentFolders()
    {
        return new ApiDocumentFolderList($this->execute('document-folders'));
    }

    public function PostDocumentFolder($folderId, ApiDocumentFolder $apiDocumentFolder)
    {
        $url = sprintf("document-folders/%s", $folderId);
        return new ApiDocumentFolder($this->execute($url, 'POST', $apiDocumentFolder->toJson()));
    }

    public function GetDocumentFolderDocuments($folderId)
    {
        $url = sprintf("document-folders/%s/documents", $folderId);
        return new ApiDocumentList($this->execute($url));
    }

    public function PostDocumentFolderDocuments($folderId, ApiFileMedia $apiFileMedia)
    {
        $url = sprintf("document-folders/%s/documents", $folderId);
        return new ApiDocument($this->execute($url, 'POST', $apiFileMedia->toJson()));
    }

    /*
     * ========== image-folders ==========
     */

    public function GetImageFolders()
    {
        return new ApiImageFolderList($this->execute('image-folders'));
    }

    public function PostImageFolderImages(XsInt $folderId, ApiFileMedia $apiFileMedia)
    {
        $url = sprintf("image-folders/%s/images", $folderId);
        return new ApiImage($this->execute($url, 'POST', $apiFileMedia->toJson()));
    }

    public function GetImageFolderById(XsInt $folderId)
    {
        $url = sprintf("image-folders/%s", $folderId);
        return new ApiImageFolder($this->execute($url));
    }

    public function PostImageFolder(XsInt $folderId, ApiImageFolder $apiImageFolder)
    {
        $url = sprintf("image-folders/%s", $folderId);
        return new ApiImageFolder($this->execute($url, 'POST', $apiImageFolder->toJson()));
    }

    /*
    * ========== programs and enrolments ==========
    */

    public function GetProgramById(XsInt $programId)
    {
        $url = sprintf("programs/%s", $programId);
        return new ApiProgram($this->execute($url));
    }

    public function PostProgramsEnrolments(ApiProgramEnrolment $apiProgramEnrolment)
    {
        $this->execute('programs/enrolments', 'POST', $apiProgramEnrolment->toJson());
    }

    public function GetProgramsEnrolmentByEnrolmentId($enrolmentId)
    {
        $url = sprintf("programs/enrolments/%s", $enrolmentId);
        return new ApiProgramEnrolment($this->execute($url));
    }

    public function GetProgramsEnrolmentReportFaults($enrolmentId)
    {
        $url = sprintf("programs/enrolments/%s/report-faults", $enrolmentId);
        return new ApiProgramEnrolment($this->execute($url));
    }

    public function GetProgramsEnrolmentByStatus($status, $select = 1000, $skip = 0)
    {
        $url = sprintf("programs/enrolments/%s/?select=%s&skip=%s", $status, $select, $skip);
        return new ApiProgramEnrolmentList($this->execute($url));
    }

    public function GetPrograms($select = 1000, $skip = 0)
    {
        $url = sprintf("programs/?select=%s&skip=%s", $select, $skip);
        return new ApiProgramList($this->execute($url));
    }

    /*
     * ========== segments ==========
     */

    public function PostSegmentsRefresh(XsInt $segmentId)
    {
        $url = sprintf("segments/refresh/%s", $segmentId);
        return new ApiSegmentRefresh($this->execute($url, 'POST'));
    }

    public function GetSegmentsRefreshById(XsInt $segmentId)
    {
        $url = sprintf("segments/refresh/%s", $segmentId);
        return new ApiSegmentRefresh($this->execute($url));
    }

    public function GetSegments($select = 1000, $skip = 0)
    {
        $url = sprintf("segments?select=%s&skip=%s", $select, $skip);
        return new ApiSegmentList($this->execute($url));
    }

    /*
     * ========== server-time ==========
     */

    public function GetServerTime()
    {
        return new XsDateTime($this->execute('server-time'));
    }

    /*
     * ========== sms-messages ==========
     */

    public function PostSmsMessagesSendTo(XsString $telephoneNumber, ApiSms $apiSms)
    {
        $this->execute(sprintf("/sms-messages/send-to/%s", $telephoneNumber), 'POST', $apiSms->toJson());
    }

    /*
     * ========== templates ==========
     */

    public function PostTemplates(IApiTemplate $apiTemplate)
    {
        return new ApiTemplate($this->execute('templates', 'POST', $apiTemplate->toJson()));
    }

    public function GetTemplateById(XsInt $templateId)
    {
        $url = sprintf("templates/%s", $templateId);
        return new ApiTemplate($this->execute($url));
    }

    public function UpdateTemplate(IApiTemplate $apiTemplate)
    {
        $url = sprintf("templates/%s", $apiTemplate->id);
        return new ApiTemplate($this->execute($url, 'PUT', $apiTemplate->toJson()));
    }

    public function GetTemplates($select = 1000, $skip = 0)
    {
        $url = sprintf("templates?select=%s&skip=%s", $select, $skip);
        return new ApiTemplateList($this->execute($url));
    }
}