Sync.php
4.01 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
<?php
namespace WPML\TM\ATE\REST;
use WP_REST_Request;
use WPML\FP\Cast;
use WPML\FP\Fns;
use WPML\FP\Logic;
use WPML\FP\Lst;
use WPML\FP\Obj;
use WPML\FP\Relation;
use WPML\TM\ATE\Sync\Arguments;
use WPML\TM\ATE\Sync\Process;
use WPML\TM\ATE\Sync\Result;
use WPML\TM\ATE\SyncLock;
use WPML\TM\REST\Base;
use WPML_TM_ATE_AMS_Endpoints;
use function WPML\Container\make;
class Sync extends Base {
/**
* @return array
*/
public function get_routes() {
return [
[
'route' => WPML_TM_ATE_AMS_Endpoints::SYNC_JOBS,
'args' => [
'methods' => 'POST',
'callback' => [ $this, 'sync' ],
'args' => [
'lockKey' => self::getStringType(),
'ateToken' => self::getStringType(),
'page' => self::getIntType(),
'numberOfPages' => self::getIntType(),
],
],
],
];
}
/**
* @param WP_REST_Request $request
*
* @return array
*/
public function get_allowed_capabilities( WP_REST_Request $request ) {
return [
'manage_options',
'manage_translations',
'translate',
];
}
/**
* @param WP_REST_Request $request
*
* @return array
* @throws \Auryn\InjectionException
*/
public function sync( WP_REST_Request $request ) {
$args = new Arguments();
$args->ateToken = $request->get_param( 'ateToken' );
$args->page = $request->get_param( 'nextPage' );
$args->numberOfPages = $request->get_param( 'numberOfPages' );
$args->includeManualAndLongstandingJobs = $request->get_param( 'includeManualAndLongstandingJobs' );
$lock = make( SyncLock::class );
$lockKey = $lock->create( $request->get_param( 'lockKey' ) );
if ( $lockKey ) {
/** @var Result $result */
$result = make( Process::class )->run( $args );
$result->lockKey = $lockKey;
$jobsFromDB = Fns::filter(
Logic::complement( $this->findSyncedJob( $result->jobs ) ),
$this->getJobStatuses( $request->get_param( 'jobIds' ), $request->get_param( 'returnUrl' ) )
);
/** @phpstan-ignore-next-line */
$result = $this->createResultWithJobs( Lst::concat( $result->jobs, $jobsFromDB ), $result );
} else {
$result = $this->createResultWithJobs( $this->getJobStatuses( $request->get_param( 'jobIds' ), $request->get_param( 'returnUrl' ) ) );
}
return (array) $result;
}
/**
* @return array
*/
private function getJobStatuses( $wpmlJobIds, $returnUrl ) {
if ( ! $wpmlJobIds ) {
return [];
}
global $wpdb;
$ids = wpml_prepare_in( $wpmlJobIds, '%d' );
$sql = "
SELECT jobs.job_id as jobId, statuses.status as status, jobs.editor_job_id as ateJobId, jobs.automatic FROM {$wpdb->prefix}icl_translate_job as jobs
INNER JOIN {$wpdb->prefix}icl_translation_status as statuses ON statuses.rid = jobs.rid
WHERE jobs.job_id IN ( {$ids} ) AND 1 = %d
"; // I need additional AND condition to utilize prepare function which is required to make writing unit tests easier. It's not perfect but saves a lot of time now
$result = $wpdb->get_results( $wpdb->prepare( $sql , 1) );
if ( ! is_array( $result ) ) {
return [];
}
$jobs = Fns::map( Obj::evolve( [
'jobId' => Cast::toInt(),
'status' => Cast::toInt(),
'ateJobId' => Cast::toInt(),
] ), $result );
list( $completed, $notCompleted ) = \wpml_collect( $jobs )->partition( Relation::propEq( 'status', ICL_TM_COMPLETE ) );
if ( count( $completed ) ) {
$completed = Download::getJobs( $completed, $returnUrl )->map( function ( $job ) {
return (array) $job;
} );
}
return $completed->merge( $notCompleted )->all();
}
private function findSyncedJob( $jobsFromATE ) {
return function ( $jobFromDb ) use ( $jobsFromATE ) {
return Lst::find( Relation::propEq( 'jobId', Obj::prop( 'jobId', $jobFromDb ) ), $jobsFromATE );
};
}
/**
* @param array $jobs
* @param Result|null $template
*
* @return Result
*/
private function createResultWithJobs( array $jobs, Result $template = null ) {
$result = $template ? clone $template : new Result();
$result->jobs = $jobs;
return $result;
}
}