PluginProbe
Redirection / 5.6.0
Redirection v5.6.0
5.10.0 5.9.0 5.8.1 5.8.0 3.7.2 3.7.3 4.0 4.0.1 4.1 4.1.1 4.2 4.2.1 4.2.2 4.2.3 4.3 4.3.1 4.3.2 4.3.3 4.4 4.4.1 4.4.2 4.5 4.5.1 4.6.2 4.7.1 All 130 releases
redirection / api / api-import.php

api-import.php in Redirection 5.6.0, at api/api-import.php

173 lines 5.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * @api {get} /redirection/v1/import/file/:group_id Import redirects
5 * @apiName Import
6 * @apiDescription Import redirects from CSV, JSON, or Apache .htaccess
7 * @apiGroup Import/Export
8 *
9 * @apiParam (URL) {Integer} :group_id The group ID to import into
10 * @apiParam (File) {File} file The multipart form upload containing the file to import
11 *
12 * @apiSuccess {Integer} imported Number of items imported
13 *
14 * @apiUse 401Error
15 * @apiUse 404Error
16 * @apiError (Error 400) redirect_import_invalid_group Invalid group
17 * @apiErrorExample {json} 404 Error Response:
18 * HTTP/1.1 400 Bad Request
19 * {
20 * "code": "redirect_import_invalid_group",
21 * "message": "Invalid group"
22 * }
23 * @apiError (Error 400) redirect_import_invalid_file Invalid file upload
24 * @apiErrorExample {json} 404 Error Response:
25 * HTTP/1.1 400 Bad Request
26 * {
27 * "code": "redirect_import_invalid_file",
28 * "message": "Invalid file upload"
29 * }
30 */
31 /**
32 * @phpstan-type ImportPluginPayload array{
33 * plugin?: string|list<string>
34 * }
35 * @phpstan-type ImportFileParams array{
36 * file?: array{
37 * tmp_name: string,
38 * name: string,
39 * size: int,
40 * type: string,
41 * error: int
42 * }
43 * }
44 */
45 class Redirection_Api_Import extends Redirection_Api_Route {
46 /**
47 * @param string $api_namespace REST namespace.
48 */
49 public function __construct( $api_namespace ) {
50 // POST /import/file/:group_id - Import from file upload
51 register_rest_route(
52 $api_namespace,
53 '/import/file/(?P<group_id>\d+)',
54 [
55 [
56 'methods' => WP_REST_Server::EDITABLE,
57 'callback' => [ $this, 'route_import_file' ],
58 'permission_callback' => [ $this, 'permission_callback_manage' ],
59 ],
60 ]
61 );
62
63 // GET/POST /import/plugin - List or import from plugins
64 register_rest_route(
65 $api_namespace,
66 '/import/plugin',
67 [
68 [
69 'methods' => WP_REST_Server::READABLE,
70 'callback' => [ $this, 'route_plugin_import_list' ],
71 'permission_callback' => [ $this, 'permission_callback_manage' ],
72 ],
73 [
74 'methods' => WP_REST_Server::EDITABLE,
75 'callback' => [ $this, 'route_plugin_import' ],
76 'permission_callback' => [ $this, 'permission_callback_manage' ],
77 ],
78 ]
79 );
80 }
81
82 /**
83 * Permission callback used for import routes.
84 *
85 * @param WP_REST_Request $_request Request (unused).
86 * @phpstan-param WP_REST_Request<array<string, mixed>> $_request
87 * @return bool
88 */
89 public function permission_callback_manage( WP_REST_Request $_request ) {
90 return Redirection_Capabilities::has_access( Redirection_Capabilities::CAP_IO_MANAGE );
91 }
92
93 /**
94 * List available plugin importers.
95 *
96 * @param WP_REST_Request $request Request.
97 * @phpstan-param WP_REST_Request<array<string, mixed>> $request
98 * @phpstan-return array{importers: array<int, mixed>}
99 * @return array{importers: array}
100 */
101 public function route_plugin_import_list( WP_REST_Request $request ) {
102 include_once dirname( __DIR__ ) . '/models/importer.php';
103
104 return array( 'importers' => Red_Plugin_Importer::get_plugins() );
105 }
106
107 /**
108 * Import redirects using selected plugin importers.
109 *
110 * @param WP_REST_Request $request Request.
111 * @phpstan-param WP_REST_Request<array<string, mixed>> $request
112 * @phpstan-return array{imported: int}
113 * @return array{imported: int}
114 */
115 public function route_plugin_import( WP_REST_Request $request ) {
116 include_once dirname( __DIR__ ) . '/models/importer.php';
117
118 $params = $request->get_params();
119 /** @var ImportPluginPayload $params */
120 $groups = Red_Group::get_all();
121 /** @var array<array{id: int, name: string, redirects: int, module_id: int, moduleName: string, enabled: bool, default?: bool}> $groups */
122 $plugin_param = $params['plugin'] ?? $request->get_param( 'plugin' );
123 if ( is_array( $plugin_param ) ) {
124 $plugins = array_map( 'strval', $plugin_param );
125 } elseif ( $plugin_param === null ) {
126 $plugins = [];
127 } else {
128 $plugins = [ (string) $plugin_param ];
129 }
130 /** @var list<string> $plugins */
131 $plugins = array_map( 'sanitize_text_field', $plugins );
132 $total = 0;
133
134 foreach ( $plugins as $plugin ) {
135 $total += Red_Plugin_Importer::import( $plugin, $groups[0]['id'] );
136 }
137
138 return [ 'imported' => $total ];
139 }
140
141 /**
142 * Import redirects from an uploaded file.
143 *
144 * @param WP_REST_Request $request Request.
145 * @phpstan-param WP_REST_Request<array<string, mixed>> $request
146 * @phpstan-return array{imported: int}|WP_Error
147 * @return array{imported: int}|WP_Error
148 */
149 public function route_import_file( WP_REST_Request $request ) {
150 $file_params = $request->get_file_params();
151 /** @var ImportFileParams $file_params */
152 $group_id = intval( $request['group_id'], 10 );
153
154 if ( isset( $file_params['file'] ) ) {
155 $upload = $file_params['file'];
156
157 if ( is_uploaded_file( $upload['tmp_name'] ) ) {
158 $count = Red_FileIO::import( $group_id, $upload );
159
160 if ( $count > 0 ) {
161 return array(
162 'imported' => $count,
163 );
164 }
165
166 return $this->add_error_details( new WP_Error( 'redirect_import_invalid_group', 'Invalid group' ), __LINE__ );
167 }
168 }
169
170 return $this->add_error_details( new WP_Error( 'redirect_import_invalid_file', 'Invalid file' ), __LINE__ );
171 }
172 }
173