WP_REST_Server::CREATABLE, 'callback' => [ $this, 'handle_translate_post' ], 'permission_callback' => [ $this, 'check_permission' ], 'args' => [ 'postId' => [ 'required' => true, 'type' => 'integer', 'sanitize_callback' => 'absint', 'validate_callback' => function ( $value ) { return is_numeric( $value ) && (int) $value > 0; }, ], 'targetLang' => [ 'required' => true, 'type' => 'string', 'sanitize_callback' => 'sanitize_text_field', 'validate_callback' => [ $this, 'validate_lang_required' ], ], 'sourceLang' => [ 'required' => false, 'type' => 'string', 'sanitize_callback' => 'sanitize_text_field', 'validate_callback' => [ $this, 'validate_lang_optional' ], ], ], ] ); } public function validate_lang_required( $value, $request, $param ) { if ( ! is_string( $value ) || ! Adara_Translate_Languages::is_supported( $value ) ) { return new WP_Error( 'rest_invalid_param', /* translators: %s: name of the REST parameter (targetLang or sourceLang) */ sprintf( __( '%s must be a supported language code.', 'adara-translate' ), $param ), [ 'status' => 400 ] ); } return true; } public function validate_lang_optional( $value, $request, $param ) { if ( null === $value || '' === $value ) { return true; } return $this->validate_lang_required( $value, $request, $param ); } public function check_permission( WP_REST_Request $request ) { $post_id = (int) $request->get_param( 'postId' ); if ( ! $post_id || ! current_user_can( 'edit_post', $post_id ) ) { return new WP_Error( 'rest_forbidden', __( 'You do not have permission to translate this post.', 'adara-translate' ), [ 'status' => 403 ] ); } return true; } public function handle_translate_post( WP_REST_Request $request ) { $post_id = (int) $request->get_param( 'postId' ); $target_lang = (string) $request->get_param( 'targetLang' ); $source_lang = $request->get_param( 'sourceLang' ); $result = Adara_Translate_Translator::translate_post( $post_id, $target_lang, ( is_string( $source_lang ) && '' !== $source_lang ) ? $source_lang : null ); if ( is_wp_error( $result ) ) { $data = $result->get_error_data(); $status = is_array( $data ) && isset( $data['status'] ) ? (int) $data['status'] : 500; return new WP_REST_Response( [ 'code' => $result->get_error_code(), 'message' => $result->get_error_message(), 'data' => is_array( $data ) ? $data : null, ], $status ); } return new WP_REST_Response( $result, 201 ); } }