first commit

This commit is contained in:
2023-09-12 21:41:04 +02:00
commit 3361a7f053
13284 changed files with 2116755 additions and 0 deletions

View File

@@ -0,0 +1,74 @@
<?php
/**
* @author OnTheGo Systems
*/
namespace WPML\TM\ATE\REST;
use WP_REST_Request;
use WPML\Collect\Support\Collection;
use function WPML\Container\make;
use WPML\TM\ATE\Download\Job;
use WPML\TM\ATE\Download\Process;
use WPML\TM\Jobs\Utils\ElementLinkFactory;
use WPML\TM\REST\Base;
use WPML_TM_ATE_AMS_Endpoints;
class Download extends Base {
const PROCESS_QUANTITY = 5;
/**
* @return array
*/
public function get_routes() {
return [
[
'route' => WPML_TM_ATE_AMS_Endpoints::DOWNLOAD_JOBS,
'args' => [
'methods' => 'POST',
'callback' => [ $this, 'download' ],
],
],
];
}
/**
* @param WP_REST_Request $request
*
* @return array
*/
public function get_allowed_capabilities( WP_REST_Request $request ) {
return [
'manage_options',
'manage_translations',
'translate',
];
}
public function download() {
$result = make( Process::class )->run( self::PROCESS_QUANTITY );
return [
'jobs' => $this->getJobs( $result->processedJobs ),
'downloadQueueSize' => $result->downloadQueueSize,
];
}
private function getJobs( Collection $processedJobs ) {
$jobIds = $processedJobs->pluck( 'wpmlJobId' );
$viewLinks = $jobIds->map( [ wpml_tm_load_job_factory(), 'get_translation_job' ] )
->map( [ ElementLinkFactory::create(), 'getTranslation' ] );
return $jobIds->zip( $viewLinks )
->map(
function ( $pair ) {
return [
'jobId' => (int) $pair[0],
'viewLink' => $pair[1],
];
}
)
->toArray();
}
}

View File

@@ -0,0 +1,73 @@
<?php
namespace WPML\TM\ATE\REST;
use WP_REST_Request;
use WPML\Rest\Adaptor;
use WPML\TM\ATE\Sync\Arguments;
use WPML\TM\ATE\Sync\Factory;
use WPML\TM\REST\Base;
use WPML_TM_ATE_AMS_Endpoints;
class Sync extends Base {
/**
* @var Factory $factory
*/
private $factory;
public function __construct( Adaptor $adaptor, Factory $factory ) {
$this->factory = $factory;
parent::__construct( $adaptor );
}
/**
* @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->lockKey = $request->get_param( 'lockKey' );
$args->ateToken = $request->get_param( 'ateToken' );
$args->page = $request->get_param( 'nextPage' );
$args->numberOfPages = $request->get_param( 'numberOfPages' );
return (array) $this->factory->create()->run( $args );
}
}

View File

@@ -0,0 +1,35 @@
<?php
/**
* @author OnTheGo Systems
*/
abstract class WPML_TM_ATE_Required_Rest_Base extends WPML_REST_Base {
const REST_NAMESPACE = 'wpml/tm/v1';
/**
* WPML_TM_ATE_Required_Rest_Base constructor.
*/
public function __construct() {
parent::__construct( self::REST_NAMESPACE );
}
/**
* @param WP_REST_Request $request
*
* @return bool
*/
public function validate_permission( WP_REST_Request $request ) {
return WPML_TM_ATE_Status::is_enabled() && parent::validate_permission( $request );
}
/**
* @param string $endpoint
*
* @return string
*/
static function get_url( $endpoint ) {
return get_rest_url( null, '/' . self::REST_NAMESPACE . $endpoint );
}
}

View File

@@ -0,0 +1,12 @@
<?php
class WPML_TM_REST_AMS_Clients_Factory extends WPML_REST_Factory_Loader {
/**
* @return \WPML_TM_REST_AMS_Clients
* @throws \Auryn\InjectionException
*/
public function create() {
return \WPML\Container\make( '\WPML_TM_REST_AMS_Clients' );
}
}

View File

@@ -0,0 +1,146 @@
<?php
/**
* @author OnTheGo Systems
*/
class WPML_TM_REST_AMS_Clients extends WPML_REST_Base {
private $api;
private $ams_user_records;
/** @var WPML_TM_AMS_Translator_Activation_Records $translator_activation_records */
private $translator_activation_records;
/**
* @var WPML_TM_ATE_AMS_Endpoints
*/
private $strings;
public function __construct(
WPML_TM_AMS_API $api,
WPML_TM_AMS_Users $ams_user_records,
WPML_TM_AMS_Translator_Activation_Records $translator_activation_records,
WPML_TM_MCS_ATE_Strings $strings
) {
parent::__construct( 'wpml/tm/v1' );
$this->api = $api;
$this->ams_user_records = $ams_user_records;
$this->translator_activation_records = $translator_activation_records;
$this->strings = $strings;
}
function add_hooks() {
$this->register_routes();
}
function register_routes() {
parent::register_route(
'/ams/register_manager',
array(
'methods' => 'POST',
'callback' => array( $this, 'register_manager' ),
)
);
parent::register_route(
'/ams/synchronize/translators',
array(
'methods' => 'GET',
'callback' => array( $this, 'synchronize_translators' ),
)
);
parent::register_route(
'/ams/synchronize/managers',
array(
'methods' => 'GET',
'callback' => array( $this, 'synchronize_managers' ),
)
);
parent::register_route(
'/ams/status',
array(
'methods' => 'GET',
'callback' => array( $this, 'get_status' ),
)
);
parent::register_route(
'/ams/console',
array(
'methods' => 'GET',
'callback' => array( $this, 'get_console' ),
)
);
}
/**
* @return array|WP_Error
* @throws \InvalidArgumentException
*/
public function register_manager() {
$current_user = wp_get_current_user();
$translators = $this->ams_user_records->get_translators();
$managers = $this->ams_user_records->get_managers();
$result = $this->api->register_manager( $current_user, $translators, $managers );
if ( is_wp_error( $result ) ) {
return $result;
}
return array( 'enabled' => $result );
}
/**
* @return array|WP_Error
* @throws \InvalidArgumentException
*/
public function synchronize_translators() {
$translators = $this->ams_user_records->get_translators();
$result = $this->api->synchronize_translators( $translators );
if ( is_wp_error( $result ) ) {
return $result;
}
$this->translator_activation_records->update( $result['translators'] );
return array( 'result' => $result );
}
/**
* @return array|WP_Error
* @throws \InvalidArgumentException
*/
public function synchronize_managers() {
$managers = $this->ams_user_records->get_managers();
$result = $this->api->synchronize_managers( $managers );
if ( is_wp_error( $result ) ) {
return $result;
}
return array( 'result' => $result );
}
/**
* @return array|mixed|null|object|WP_Error
* @throws \InvalidArgumentException
*/
public function get_status() {
return $this->api->get_status();
}
public function get_console() {
return $this->strings->get_auto_login();
}
function get_allowed_capabilities( WP_REST_Request $request ) {
return array( 'manage_translations', 'manage_options' );
}
}

View File

@@ -0,0 +1,12 @@
<?php
class WPML_TM_REST_ATE_API_Factory extends WPML_REST_Factory_Loader {
/**
* @return \WPML_TM_REST_ATE_API
* @throws \Auryn\InjectionException
*/
public function create() {
return \WPML\Container\make( '\WPML_TM_REST_ATE_API' );
}
}

View File

@@ -0,0 +1,73 @@
<?php
/**
* @author OnTheGo Systems
*/
class WPML_TM_REST_ATE_API extends WPML_TM_ATE_Required_Rest_Base {
const CAPABILITY_CREATE = 'manage_translations';
const CAPABILITY_READ = 'translate';
private $api;
/**
* WPML_TM_REST_AMS_Clients constructor.
*
* @param WPML_TM_ATE_API $api
*/
public function __construct( WPML_TM_ATE_API $api ) {
parent::__construct();
$this->api = $api;
}
function add_hooks() {
$this->register_routes();
}
function register_routes() {
parent::register_route(
'/ate/jobs',
array(
'methods' => 'POST',
'callback' => array( $this, 'create_jobs' ),
)
);
parent::register_route(
'/ate/jobs/(?P<ateJobId>\d+)',
array(
'methods' => 'GET',
'callback' => array( $this, 'get_job' ),
)
);
}
/**
* @param WP_REST_Request $request
*
* @return array|WP_Error
* @throws \InvalidArgumentException
*/
public function create_jobs( WP_REST_Request $request ) {
return $this->api->create_jobs( $request->get_params() );
}
/**
* @param WP_REST_Request $request
*
* @return array|WP_Error
* @throws \InvalidArgumentException
*/
public function get_job( WP_REST_Request $request ) {
$ate_job_id = $request->get_param( 'ateJobId' );
return $this->api->get_job( $ate_job_id );
}
function get_allowed_capabilities( WP_REST_Request $request ) {
if ( 'GET' === $request->get_method() ) {
return array( self::CAPABILITY_CREATE, self::CAPABILITY_READ );
}
return self::CAPABILITY_CREATE;
}
}

View File

@@ -0,0 +1,14 @@
<?php
class WPML_TM_REST_ATE_Jobs_Factory extends WPML_REST_Factory_Loader {
public function create() {
$ate_jobs_records = wpml_tm_get_ate_job_records();
$ate_jobs = new WPML_TM_ATE_Jobs( $ate_jobs_records );
return new WPML_TM_REST_ATE_Jobs(
$ate_jobs,
wpml_tm_get_ate_jobs_repository()
);
}
}

View File

@@ -0,0 +1,70 @@
<?php
/**
* @author OnTheGo Systems
*/
class WPML_TM_REST_ATE_Jobs extends WPML_TM_ATE_Required_Rest_Base {
const CAPABILITY = 'manage_translations';
private $ate_jobs;
/** @var WPML_TM_ATE_Job_Repository */
private $job_repository;
/**
* WPML_TM_REST_ATE_Jobs constructor.
*
* @param WPML_TM_ATE_Jobs $ate_jobs
* @param WPML_TM_ATE_Job_Repository $job_repository
*/
public function __construct( WPML_TM_ATE_Jobs $ate_jobs, WPML_TM_ATE_Job_Repository $job_repository ) {
parent::__construct();
$this->ate_jobs = $ate_jobs;
$this->job_repository = $job_repository;
}
function add_hooks() {
$this->register_routes();
}
function register_routes() {
parent::register_route(
WPML_TM_ATE_AMS_Endpoints::STORE_JOB,
array(
'methods' => 'POST',
'callback' => array( $this, 'store_ate_job' ),
'args' => array(
'wpml_job_id' => array(
'required' => true,
'type' => 'string',
'validate_callback' => array( 'WPML_REST_Arguments_Validation', 'integer' ),
'sanitize_callback' => array( 'WPML_REST_Arguments_Sanitation', 'integer' ),
),
'ate_job_data' => array(
'required' => true,
'type' => 'array',
),
),
)
);
}
/**
* @param WP_REST_Request $request
*
* @return bool
* @throws \InvalidArgumentException
*/
public function store_ate_job( WP_REST_Request $request ) {
$wpml_job_id = $request->get_param( 'wpml_job_id' );
$ate_job_data = $request->get_param( 'ate_job_data' );
$this->ate_jobs->store( $wpml_job_id, $ate_job_data );
return true;
}
function get_allowed_capabilities( WP_REST_Request $request ) {
return self::CAPABILITY;
}
}

View File

@@ -0,0 +1,15 @@
<?php
class WPML_TM_REST_ATE_Public_Factory extends WPML_REST_Factory_Loader {
public function create() {
$job_actions_factory = new WPML_TM_ATE_Jobs_Actions_Factory();
$jobs_actions = $job_actions_factory->create();
if ( $jobs_actions ) {
return new WPML_TM_REST_ATE_Public( $jobs_actions, wpml_load_core_tm() );
}
return null;
}
}

View File

@@ -0,0 +1,93 @@
<?php
/**
* @author OnTheGo Systems
*/
class WPML_TM_REST_ATE_Public extends WPML_TM_ATE_Required_Rest_Base {
const CODE_UNPROCESSABLE_ENTITY = 422;
const CODE_OK = 200;
const ENDPOINT_JOBS_RECEIVE = '/ate/jobs/receive/';
/**
* @var WPML_TM_ATE_Jobs_Actions
*/
private $jobs_actions;
/**
* @var TranslationManagement
*/
private $translation_management;
/**
* @param WPML_TM_ATE_Jobs_Actions $jobs_actions
* @param TranslationManagement $translation_management
*/
public function __construct(
WPML_TM_ATE_Jobs_Actions $jobs_actions,
TranslationManagement $translation_management
) {
parent::__construct();
$this->jobs_actions = $jobs_actions;
$this->translation_management = $translation_management;
}
function add_hooks() {
$this->register_routes();
}
function register_routes() {
parent::register_route(
self::ENDPOINT_JOBS_RECEIVE . '(?P<wpmlJobId>\d+)',
array(
'methods' => 'GET',
'callback' => array( $this, 'receive_ate_job' ),
'args' => array(
'wpmlJobId' => array(
'required' => true,
'type' => 'int',
'validate_callback' => array( 'WPML_REST_Arguments_Validation', 'integer' ),
'sanitize_callback' => array( 'WPML_REST_Arguments_Sanitation', 'integer' ),
),
),
'permission_callback' => '__return_true',
)
);
}
public function get_allowed_capabilities( WP_REST_Request $request ) {
return array();
}
/**
* @param WP_REST_Request $request
*
* @return WP_REST_Response|WP_Error
*/
public function receive_ate_job( WP_REST_Request $request ) {
$wpml_job_id = $request->get_param( 'wpmlJobId' );
$wpml_job = $this->translation_management->get_translation_job( $wpml_job_id );
if ( ! $wpml_job ) {
return new WP_Error( self::CODE_UNPROCESSABLE_ENTITY );
}
try {
$this->jobs_actions->update_jobs( false, array( $wpml_job ) );
} catch ( Exception $e ) {
return new WP_Error( self::CODE_UNPROCESSABLE_ENTITY );
}
return new WP_REST_Response( null, self::CODE_OK );
}
/**
* @param int $wpml_job_id
*
* @return string
*/
public static function get_receive_ate_job_url( $wpml_job_id ) {
return self::get_url( self::ENDPOINT_JOBS_RECEIVE . $wpml_job_id );
}
}

View File

@@ -0,0 +1,17 @@
<?php
class WPML_TM_REST_ATE_Sync_Jobs_Factory extends WPML_REST_Factory_Loader {
public function create() {
$jobs_action_factory = new WPML_TM_ATE_Jobs_Actions_Factory();
$jobs_action = $jobs_action_factory->create();
if ( $jobs_action ) {
return new WPML_TM_REST_ATE_Sync_Jobs(
wpml_load_core_tm(),
$jobs_action
);
}
return null;
}
}

View File

@@ -0,0 +1,76 @@
<?php
/**
* @todo: Remove this endpoint
*/
class WPML_TM_REST_ATE_Sync_Jobs extends WPML_TM_ATE_Required_Rest_Base {
/** @var array */
private $capabilities = array( 'manage_translations', 'translate' );
/** @var TranslationManagement */
private $tm_core;
/** @var WPML_TM_ATE_Jobs_Actions */
private $jobs_action;
/**
* @param TranslationManagement $tm_core
* @param WPML_TM_ATE_Jobs_Actions $jobs_action
*/
public function __construct( TranslationManagement $tm_core, WPML_TM_ATE_Jobs_Actions $jobs_action ) {
parent::__construct();
$this->tm_core = $tm_core;
$this->jobs_action = $jobs_action;
}
function add_hooks() {
$this->register_routes();
}
function register_routes() {
parent::register_route(
'/ate/jobs/old-sync',
array(
'methods' => 'POST',
'callback' => array( $this, 'sync' ),
'args' => array(
'jobIds' => array(
'required' => true,
'type' => 'array',
'validate_callback' => array( 'WPML_REST_Arguments_Validation', 'is_array' ),
'sanitize_callback' => array( 'WPML_REST_Arguments_Sanitation', 'array_of_integers' ),
),
),
)
);
}
public function sync( WP_REST_Request $request ) {
try {
$ate_jobs = array_map( array( $this->tm_core, 'get_translation_job' ), $request->get_param( 'jobIds' ) );
$updated_jobs = array();
if ( $ate_jobs ) {
$updated_jobs = $this->jobs_action->update_jobs( null, $ate_jobs, true );
}
return $updated_jobs;
} catch ( Exception $e ) {
return new WP_Error( 500, $e->getMessage() );
}
}
function get_allowed_capabilities( WP_REST_Request $request ) {
return $this->capabilities;
}
public function validate_permission( WP_REST_Request $request ) {
if ( current_user_can( 'administrator' ) ) {
return true;
}
return parent::validate_permission( $request );
}
}

View File

@@ -0,0 +1,8 @@
<?php
class WPML_TM_REST_XLIFF_Factory extends WPML_REST_Factory_Loader {
public function create() {
return new WPML_TM_REST_XLIFF();
}
}

View File

@@ -0,0 +1,54 @@
<?php
/**
* @author OnTheGo Systems
*/
class WPML_TM_REST_XLIFF extends WPML_TM_ATE_Required_Rest_Base {
const CAPABILITY = 'translate';
function add_hooks() {
$this->register_routes();
}
function register_routes() {
parent::register_route(
'/xliff/fetch/(?P<jobId>\d+)',
array(
'methods' => 'GET',
'callback' => array( $this, 'fetch_xliff' ),
)
);
}
/**
* @param WP_REST_Request $request
*
* @return array
* @throws \InvalidArgumentException
*/
public function fetch_xliff( WP_REST_Request $request ) {
$result = null;
$wpml_translation_job_factory = wpml_tm_load_job_factory();
$iclTranslationManagement = wpml_load_core_tm();
$job_id = $request->get_param( 'jobId' );
$writer = new WPML_TM_Xliff_Writer( $wpml_translation_job_factory );
$xliff = base64_encode( $writer->generate_job_xliff( $job_id ) );
$job = $iclTranslationManagement->get_translation_job( (int) $job_id, false, false, 1 );
$result = array(
'content' => $xliff,
'sourceLang' => $job->source_language_code,
'targetLang' => $job->language_code,
);
return $result;
}
function get_allowed_capabilities( WP_REST_Request $request ) {
return self::CAPABILITY;
}
}