tmgmt_smartling-8.x-4.11/src/Smartling/SmartlingApiWrapper.php
src/Smartling/SmartlingApiWrapper.php
<?php
/**
* @file
* SmartlingApiWrapper.php.
*/
namespace Drupal\tmgmt_smartling\Smartling;
use DateTime;
use Drupal\Core\Session\AccountProxyInterface;
use Drupal\tmgmt\Entity\Translator;
use Drupal\tmgmt\JobInterface;
use Exception;
use Psr\Log\LoggerInterface;
use Smartling\AuditLog\Params\CreateRecordParameters;
use Smartling\Batch\Params\CreateBatchParameters;
use Smartling\Exceptions\SmartlingApiException;
use Smartling\Jobs\Params\CancelJobParameters;
use Smartling\Jobs\Params\CreateJobParameters;
use Smartling\Jobs\Params\ListJobsParameters;
use Smartling\Jobs\Params\ListJobFilesParameters;
use Smartling\Jobs\Params\UpdateJobParameters;
use Smartling\TranslationRequests\Params\CreateTranslationRequestParams;
use Smartling\TranslationRequests\Params\SearchTranslationRequestParams;
use Smartling\TranslationRequests\Params\UpdateTranslationRequestParams;
use Smartling\ProgressTracker\Params\RecordParameters;
use Smartling\TranslationRequests\Params\SearchTranslationSubmissionParams;
/**
* Class SmartlingApiWrapper
* @package Drupal\tmgmt_smartling\Smartling
*/
class SmartlingApiWrapper {
/**
* @var SmartlingApiFactory
*/
private $apiFactory;
/**
* @var LoggerInterface
*/
private $logger;
/**
* @var array
*/
private $settings = [];
/**
* SmartlingApiWrapper constructor.
* @param \Drupal\tmgmt_smartling\Smartling\SmartlingApiFactory $api_factory
* @param \Psr\Log\LoggerInterface $logger
*/
public function __construct(SmartlingApiFactory $api_factory, LoggerInterface $logger) {
$this->apiFactory = $api_factory;
$this->logger = $logger;
}
/**
* @param string $api_type
* @return mixed
* @throws Exception
* @throws SmartlingApiException
*/
public function getApi($api_type = 'file') {
return $this->apiFactory->create($this->settings, $api_type);
}
/**
* Returns list of jobs by name.
*
* @param null $name
* @param array $statuses
* @return array
*/
public function listJobs($name = NULL, array $statuses = []) {
$result = [];
try {
$params = new ListJobsParameters();
if (!empty($name)) {
$params->setName($name);
}
if (!empty($statuses)) {
$params->setStatuses($statuses);
}
$result = $this->getApi('jobs')->listJobs($params);
}
catch (SmartlingApiException $e) {
$this->logger->error('Smartling failed to fetch list of available jobs:<br/>Error: @error', [
'@error' => $e->getMessage(),
]);
}
return $result;
}
/**
* Creates Smartling job.
*
* @param $name
* @param $description
* @param \DateTime|NULL $due_date
* @return array
*/
public function createJob($name, $description, DateTime $due_date = NULL) {
$job_id = NULL;
try {
$params = new CreateJobParameters();
$params->setName($name);
$params->setDescription($description);
if (!empty($due_date)) {
$params->setDueDate($due_date);
}
$response = $this->getApi('jobs')->createJob($params);
$job_id = $response['translationJobUid'];
$this->logger->info('Smartling created a job:<br/>
Id: @id<br/>
Name: @name<br/>
Description: @description<br/>
Due date (UTC): @due_date<br/>', [
'@id' => $job_id,
'@name' => $name,
'@description' => $description,
'@due_date' => empty($due_date) ? '' : $due_date->format('Y-m-d H:i'),
]);
}
catch (Exception $e) {
$this->logger->error('Smartling failed to create a job:<br/>
Name: @name<br/>
Description: @description<br/>
Due date (UTC): @due_date<br/>
Error: @error', [
'@name' => $name,
'@description' => $description,
'@due_date' => empty($due_date) ? '' : $due_date->format('Y-m-d H:i'),
'@error' => $e->getMessage(),
]);
}
return $job_id;
}
/**
* Updates Smartling job.
*
* @param $job_id
* @param $name
* @param $description
* @param \DateTime|NULL $due_date
* @return array
*/
public function updateJob($job_id, $name, $description, DateTime $due_date = NULL) {
$result = NULL;
try {
$params = new UpdateJobParameters();
$params->setName($name);
if (!empty($description)) {
$params->setDescription($description);
}
if (!empty($due_date)) {
$params->setDueDate($due_date);
}
$result = $this->getApi('jobs')->updateJob($job_id, $params);
$this->logger->info('Smartling updated a job:<br/>
Id: @id<br/>
Name: @name<br/>
Description: @description<br/>
Due date (UTC): @due_date<br/>', [
'@id' => $result['translationJobUid'],
'@name' => $name,
'@description' => $description,
'@due_date' => empty($due_date) ? '' : $due_date->format('Y-m-d H:i'),
]);
}
catch (Exception $e) {
$this->logger->error('Smartling failed to update a job:<br/>
Name: @name<br/>
Description: @description<br/>
Due date (UTC): @due_date<br/>
Error: @error', [
'@name' => $name,
'@description' => $description,
'@due_date' => empty($due_date) ? '' : $due_date->format('Y-m-d H:i'),
'@error' => $e->getMessage(),
]);
}
return $result;
}
/**
* Returns job.
*
* @param $job_id
* @return array
*/
public function getJob($job_id) {
$result = [];
try {
$result = $this->getApi('jobs')->getJob($job_id);
}
catch (SmartlingApiException $e) {
$this->logger->error('Smartling failed to fetch a job:<br/>
Job id: @job_id
Error: @error', [
'@job_id' => $job_id,
'@error' => $e->getMessage(),
]);
}
return $result;
}
/**
* Returns amount of files in a given job.
*
* @param $job_id
* @return integer
*/
public function getJobFilesCount($job_id) {
$result = NULL;
try {
$params = new ListJobFilesParameters(1, 0);
$response = $this->getApi('jobs')->listJobFiles($job_id, $params);
$result = $response["totalCount"];
}
catch (SmartlingApiException $e) {
$this->logger->error('Smartling failed to fetch a job files count:<br/>
Job id: @job_id
Error: @error', [
'@job_id' => $job_id,
'@error' => $e->getMessage(),
]);
}
return $result;
}
/**
* Cancels job.
*
* @param $job_id
* @param string $reason
* @return array
*/
public function cancelJob($job_id, $reason = '') {
$result = [];
try {
$params = new CancelJobParameters();
$params->setReason($reason);
$result = $this->getApi('jobs')->cancelJobSync($job_id, $params);
}
catch (SmartlingApiException $e) {
$this->logger->error('Smartling failed to cancel a job:<br/>
Job id: @job_id
Error: @error', [
'@job_id' => $job_id,
'@error' => $e->getMessage(),
]
);
}
return $result;
}
/**
* Creates Smartling batch.
*
* @param $job_id
* @param $authorize
* @return array
*/
public function createBatch($job_id, $authorize) {
$batch_uid = NULL;
try {
$params = new CreateBatchParameters();
$params->setTranslationJobUid($job_id);
$params->setAuthorize($authorize);
$response = $this->getApi('batch')->createBatch($params);
$batch_uid = $response['batchUid'];
$this->logger->info('Smartling created a batch:<br/>Id: @id', [
'@id' => $batch_uid,
]);
}
catch (SmartlingApiException $e) {
$this->logger->error('Smartling failed to create a batch:<br/>Error: @error', [
'@error' => $e->getMessage(),
]);
}
return $batch_uid;
}
/**
* Executes Smartling batch.
*
* @param $batch_uid
* @return bool
*/
public function executeBatch($batch_uid) {
$result = FALSE;
try {
$this->getApi('batch')->executeBatch($batch_uid);
$this->logger->info('Smartling executed a batch:<br/>Id: @id', [
'@id' => $batch_uid,
]);
}
catch (SmartlingApiException $e) {
$this->logger->error('Smartling failed to execute a batch @batch_uid:<br/>Error: @error', [
'@batch_uid' => $batch_uid,
'@error' => $e->getMessage(),
]);
}
return $result;
}
/**
* @param $spaceId
* @param $objectId
* @param $ttl
* @param $data
* @return null
*/
public function createFirebaseRecord($spaceId, $objectId, $ttl, $data) {
$result = NULL;
try {
$params = new RecordParameters();
$params->setTtl($ttl);
$params->setData($data);
$this->getApi('progress')->createRecord($spaceId, $objectId, $params);
$result = TRUE;
}
catch (SmartlingApiException $e) {
$this->logger->error('Smartling failed to create a record:<br/>Error: @error', [
'@error' => $e->getMessage(),
]);
}
return $result;
}
/**
* Create translation request.
*
* @param $bucketName
* @param \Smartling\TranslationRequests\Params\CreateTranslationRequestParams $params
*
* @return mixed
*/
public function createTranslationRequest($bucketName, CreateTranslationRequestParams $params) {
$result = FALSE;
try {
$result = $this->getApi('translation_request')->createTranslationRequest($bucketName, $params);
}
catch (SmartlingApiException $e) {
$this->logger->error('Smartling failed to create translation request:<br/>
Bucket name: @bucket
Params: @params
Error: @error', [
'@bucket' => $bucketName,
'@params' => json_encode($params->exportToArray()),
'@error' => $e->getMessage(),
]);
}
return $result;
}
/**
* @param $bucketName
* @param $translationRequestUid
* @param \Smartling\TranslationRequests\Params\UpdateTranslationRequestParams $params
*
* @return null
*/
public function updateTranslationRequest($bucketName, $translationRequestUid, UpdateTranslationRequestParams $params) {
$result = FALSE;
try {
$result = $this->getApi('translation_request')->updateTranslationRequest($bucketName, $translationRequestUid, $params);
}
catch (SmartlingApiException $e) {
$this->logger->error('Smartling failed to update translation request:<br/>
Bucket name: @bucket
Params: @params
Error: @error', [
'@bucket' => $bucketName,
'@params' => json_encode($params->exportToArray()),
'@error' => $e->getMessage(),
]);
}
return $result;
}
/**
* Returns translation request by search params.
*
* @param $bucketName
* @param \Smartling\TranslationRequests\Params\SearchTranslationRequestParams $params
*
* @return mixed
*/
public function searchTranslationRequest($bucketName, SearchTranslationRequestParams $params) {
$result = [];
try {
$response = $this->getApi('translation_request')->searchTranslationRequests($bucketName, $params);
$result = $response['items'];
}
catch (SmartlingApiException $e) {
$this->logger->error('Smartling failed to search translation request:<br/>
Bucket name: @bucket
Params: @params
Error: @error', [
'@bucket' => $bucketName,
'@params' => json_encode($params->exportToArray()),
'@error' => $e->getMessage(),
]);
}
return $result;
}
/**
* Returns translation submission by search params.
*
* @param $bucketName
* @param \Smartling\TranslationRequests\Params\SearchTranslationSubmissionParams $params
*
* @return mixed
*/
public function searchTranslationSubmissions($bucketName, SearchTranslationSubmissionParams $params) {
$result = [];
try {
$response = $this->getApi('translation_request')->searchTranslationSubmissions($bucketName, $params);
$result = $response['items'];
}
catch (SmartlingApiException $e) {
$this->logger->error('Smartling failed to search translation submmission:<br/>
Bucket name: @bucket
Params: @params
Error: @error', [
'@bucket' => $bucketName,
'@params' => json_encode($params->exportToArray()),
'@error' => $e->getMessage(),
]);
}
return $result;
}
/**
* Returns translation request by uid.
*
* @param $bucketName
* @param $uid
*
* @return mixed
*/
public function getTranslationRequestByUid($bucketName, $uid) {
$result = FALSE;
try {
$result = $this->getApi('translation_request')->getTranslationRequest($bucketName, $uid);
}
catch (SmartlingApiException $e) {
$this->logger->error('Smartling failed to get translation request:<br/>
Bucket name: @bucket
Params: @params
Error: @error', [
'@bucket' => $bucketName,
'@uid' => $uid,
'@error' => $e->getMessage(),
]);
}
return $result;
}
/**
* Delete file.
*
* @param $fileUri
* @return bool
*/
public function deleteFile($fileUri) {
$result = FALSE;
try {
$result = $this->getApi('file')->deleteFile($fileUri);
$this->logger->info('Smartling deleted a file in Dashboard: @uri', [
'@uri' => $fileUri,
]);
}
catch (SmartlingApiException $e) {
$this->logger->error('Smartling failed to delete a file in Dashboard: @uri.<br/>Error: @error', [
'@uri' => $fileUri,
'@error' => $e->getMessage(),
]);
}
return $result;
}
/**
* @param \Drupal\tmgmt\JobInterface $job
* @param \Drupal\tmgmt\Entity\Translator $translator
* @param \Drupal\Core\Session\AccountProxyInterface $current_user
* @param $action_type
*/
public function createAuditLogRecord(
JobInterface $job = NULL,
Translator $translator = NULL,
AccountProxyInterface $current_user,
$action_type
) {
try {
// Provider settings can be grabbed from job or from translator (support
// for job events and translator events).
$provider_settings = [];
$locale_mapping = [];
$resolved_translator = NULL;
if (!empty($job)) {
$resolved_translator = $job->getTranslator();
}
if (empty($resolved_translator) && !empty($translator)) {
$resolved_translator = $translator;
}
// Retrieve provider settings.
if (!empty($resolved_translator)) {
$locale_mapping = $resolved_translator->getRemoteLanguagesMappings();
$provider_settings = $resolved_translator->getSettings();
// Do not send sensitive data.
unset(
$provider_settings['project_id'],
$provider_settings['user_id'],
$provider_settings['token_secret'],
$provider_settings['basic_auth']
);
}
$params = new CreateRecordParameters();
$params
->setActionTime(time())
->setActionType($action_type)
->setEnvId(php_uname('n'))
->setClientUserId($current_user->id())
->setClientUserEmail((string) $current_user->getEmail())
->setClientUserName((string) $current_user->getAccountName())
->setClientData('provider_settings', $provider_settings)
->setClientData('locale_mappings', $locale_mapping);
if ($job) {
$params->setFileUri((string) $job->getTranslatorPlugin()->getFileName($job))
->setClientData('tmgmt_job_id', (string) $job->id())
->setClientData('tmgmt_job_label', (string) $job->label())
->setClientData('tmgmt_job_translator', (string) $job->getTranslatorLabel())
->setClientData('tmgmt_job_state', (string) $job->getState())
->setClientData('tmgmt_job_created', (string) $job->getCreatedTime())
->setClientData('tmgmt_job_changed', (string) $job->getChangedTime())
->setSourceLocaleId((string) $job->getSourceLangcode())
->setTargetLocaleIds([(string) $job->getRemoteTargetLanguage()])
->setTranslationJobUid((string) $job->getSetting('job_id'))
->setTranslationJobName((string) $job->getSetting('job_name'))
->setTranslationJobDueDate((string) $job->getSetting('due_date'))
->setTranslationJobAuthorize($job->getSetting('authorize'))
->setBatchUid((string) $job->getSetting('batch_uid'))
->setClientData('batch_execute_on_job', (string) $job->getSetting('batch_execute_on_job'));
}
$this->getApi('audit')->createProjectLevelLogRecord($params);
}
catch (Exception $e) {
$this->logger->warning('Smartling failed to create an audit log record.<br/>Error: @error.', [
'@error' => $e->getMessage(),
]);
}
}
/**
* @param array $settings
*/
public function setSettings($settings) {
$this->settings = $settings;
}
}
