164 lines
4.2 KiB
PHP
164 lines
4.2 KiB
PHP
<?php
|
|
|
|
namespace WPML\TM\ATE\Sync;
|
|
|
|
use WPML\FP\Fns;
|
|
use WPML\FP\Logic;
|
|
use WPML\FP\Obj;
|
|
use WPML\FP\Relation;
|
|
use WPML\TM\API\Job\Map;
|
|
use WPML\TM\API\Jobs;
|
|
use WPML\TM\ATE\Download\Job;
|
|
use WPML\TM\ATE\Log\EventsTypes;
|
|
use WPML_TM_ATE_API;
|
|
use WPML_TM_ATE_Job_Repository;
|
|
use WPML\TM\ATE\Log\Storage;
|
|
use WPML\TM\ATE\Log\Entry;
|
|
use function WPML\FP\pipe;
|
|
|
|
class Process {
|
|
|
|
const LOCK_RELEASE_TIMEOUT = 1 * MINUTE_IN_SECONDS;
|
|
|
|
/** @var WPML_TM_ATE_API $api */
|
|
private $api;
|
|
|
|
/** @var WPML_TM_ATE_Job_Repository $ateRepository */
|
|
private $ateRepository;
|
|
|
|
public function __construct( WPML_TM_ATE_API $api, WPML_TM_ATE_Job_Repository $ateRepository ) {
|
|
$this->api = $api;
|
|
$this->ateRepository = $ateRepository;
|
|
}
|
|
|
|
/**
|
|
* @param Arguments $args
|
|
*
|
|
* @return Result
|
|
*/
|
|
public function run( Arguments $args ) {
|
|
$result = new Result();
|
|
|
|
if ( $args->page ) {
|
|
$result = $this->runSyncOnPages( $result, $args );
|
|
} else {
|
|
$includeManualAndLongstandingJobs = (bool) Obj::propOr( true , 'includeManualAndLongstandingJobs', $args);
|
|
$result = $this->runSyncInit( $result, $includeManualAndLongstandingJobs );
|
|
}
|
|
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* This will run the sync on extra pages.
|
|
*
|
|
* @param Result $result
|
|
* @param Arguments $args
|
|
*
|
|
* @return Result
|
|
*/
|
|
private function runSyncOnPages( Result $result, Arguments $args ) {
|
|
$apiPage = $args->page - 1; // ATE API pagination starts at 0.
|
|
$data = $this->api->sync_page( $args->ateToken, $apiPage );
|
|
|
|
$jobs = Obj::propOr( [], 'items', $data );
|
|
$result->jobs = $this->handleJobs( $jobs );
|
|
|
|
if ( !$result->jobs ){
|
|
Storage::add( Entry::createForType(
|
|
EventsTypes::JOBS_SYNC,
|
|
[
|
|
'numberOfPages' => $args->numberOfPages,
|
|
'page' => $args->page,
|
|
'downloadQueueSize' => $result->downloadQueueSize,
|
|
'nextPage' => $result->nextPage,
|
|
]
|
|
) );
|
|
}
|
|
|
|
if ( $args->numberOfPages > $args->page ) {
|
|
$result->nextPage = $args->page + 1;
|
|
$result->numberOfPages = $args->numberOfPages;
|
|
$result->ateToken = $args->ateToken;
|
|
}
|
|
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* This will run the first sync iteration.
|
|
* We send all the job IDs we want to sync.
|
|
*
|
|
* @param Result $result
|
|
* @param boolean $includeManualAndLongstandingJobs
|
|
*
|
|
* @return Result
|
|
*/
|
|
private function runSyncInit( Result $result, $includeManualAndLongstandingJobs = true ) {
|
|
$ateJobIds = $this->getAteJobIdsToSync( $includeManualAndLongstandingJobs );
|
|
|
|
|
|
if ( $ateJobIds ) {
|
|
$this->ateRepository->increment_ate_sync_count( $ateJobIds );
|
|
$data = $this->api->sync_all( $ateJobIds );
|
|
|
|
$jobs = Obj::propOr( [], 'items', $data );
|
|
$result->jobs = $this->handleJobs( $jobs );
|
|
|
|
if ( isset( $data->next->pagination_token, $data->next->pages_number ) ) {
|
|
$result->ateToken = $data->next->pagination_token;
|
|
$result->numberOfPages = $data->next->pages_number;
|
|
$result->nextPage = 1; // We start pagination at 1 to avoid carrying a falsy value.
|
|
}
|
|
}
|
|
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* @param boolean $includeManualAndLongstandingJobs
|
|
*
|
|
* @return array
|
|
*/
|
|
private function getAteJobIdsToSync( $includeManualAndLongstandingJobs = true ) {
|
|
return $this->ateRepository
|
|
->get_jobs_to_sync( $includeManualAndLongstandingJobs )
|
|
->map_to_property( 'editor_job_id' );
|
|
}
|
|
|
|
/**
|
|
* @param array $items
|
|
*
|
|
* @return Job[] $items
|
|
*/
|
|
private function handleJobs( array $items ) {
|
|
$setStatus = function ( $status ) {
|
|
return pipe(
|
|
Fns::tap( Jobs::setStatus( Fns::__, $status ) ),
|
|
Obj::assoc('status', $status)
|
|
);
|
|
};
|
|
|
|
$updateStatus = Logic::cond( [
|
|
[
|
|
Relation::propEq( 'status', \WPML_TM_ATE_API::CANCELLED_STATUS ),
|
|
$setStatus( ICL_TM_NOT_TRANSLATED ),
|
|
],
|
|
[
|
|
Relation::propEq( 'status', \WPML_TM_ATE_API::SHOULD_HIDE_STATUS ),
|
|
$setStatus( ICL_TM_ATE_CANCELLED ),
|
|
],
|
|
[
|
|
Fns::always( true ),
|
|
Fns::identity(),
|
|
]
|
|
] );
|
|
|
|
return wpml_collect( $items )
|
|
->map( [ Job::class, 'fromAteResponse' ] )
|
|
->map( Obj::over( Obj::lensProp( 'jobId' ), Map::fromRid() ) ) // wpmlJobId returned by ATE endpoint represents RID column in wp_icl_translation_status
|
|
->map( $updateStatus )
|
|
->toArray();
|
|
}
|
|
}
|