<?php namespace Elementor\App\Modules\ImportExportCustomization\Data\Routes; use Elementor\Plugin; if ( ! defined( 'ABSPATH' ) ) { exit; // Exit if accessed directly. } class Upload extends Base_Route { protected function get_route(): string { return 'upload'; } protected function get_method(): string { return \WP_REST_Server::CREATABLE; } protected function callback( $request ): \WP_REST_Response { try { $file_url = $request->get_param( 'file_url' ); $kit_id = $request->get_param( 'kit_id' ); $source = $request->get_param( 'source' ); $module = Plugin::$instance->app->get_component( 'import-export-customization' ); $is_import_from_library = ! empty( $file_url ); if ( $is_import_from_library ) { if ( ! filter_var( $file_url, FILTER_VALIDATE_URL ) || 0 !== strpos( $file_url, 'http' ) ) { return Response::error( 'Invalid kit library URL.', 'invalid_kit_library_url' ); } $import_result = apply_filters( 'elementor/import/kit/result', [ 'file_url' => $file_url ] ); } elseif ( ! empty( $source ) ) { $import_result = apply_filters( 'elementor/import/kit/result/' . $source, [ 'kit_id' => $kit_id, 'source' => $source, ] ); } else { $files = $request->get_file_params(); $file = $files['e_import_file'] ?? null; if ( empty( $file ) || empty( $file['tmp_name'] ) ) { return Response::error( 'No file uploaded or upload error occurred.', 'no_file_uploaded' ); } $import_result = [ 'file_name' => $file['tmp_name'], 'referrer' => $module::REFERRER_LOCAL, ]; } Plugin::$instance->logger->get_logger()->info( 'Uploading Kit via REST API: ', [ 'meta' => [ 'kit_id' => $kit_id, 'referrer' => $import_result['referrer'] ?? 'unknown', ], ] ); if ( is_wp_error( $import_result ) ) { return Response::error( $import_result->get_error_message(), 'upload_error' ); } $uploaded_kit = $module->upload_kit( $import_result['file_name'], $import_result['referrer'], $kit_id ); $result = [ 'session' => $uploaded_kit['session'], 'manifest' => $uploaded_kit['manifest'], ]; if ( ! empty( $import_result['file_url'] ) ) { $result['file_url'] = $import_result['file_url']; } if ( ! empty( $import_result['kit'] ) ) { $result['uploaded_kit'] = $import_result['kit']; } if ( ! empty( $uploaded_kit['conflicts'] ) ) { $result['conflicts'] = $uploaded_kit['conflicts']; } // Clean up temporary files if ( $is_import_from_library || ! empty( $source ) ) { Plugin::$instance->uploads_manager->remove_file_or_dir( dirname( $import_result['file_name'] ) ); } return Response::success( $result ); } catch ( \Error $e ) { Plugin::$instance->logger->get_logger()->error( $e->getMessage(), [ 'meta' => [ 'trace' => $e->getTraceAsString(), ], ] ); return Response::error( $e->getMessage(), 'upload_error' ); } } protected function get_args(): array { return [ 'file_url' => [ 'type' => 'string', 'description' => 'File URL for upload action', 'required' => false, 'validate_callback' => function ( $value ) { if ( empty( $value ) ) { return true; } return filter_var( $value, FILTER_VALIDATE_URL ); }, ], 'kit_id' => [ 'type' => 'string', 'description' => 'Kit ID for upload action', 'required' => false, ], 'source' => [ 'type' => 'string', 'description' => 'Source for upload action', 'required' => false, ], ]; } }