PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 4.13.1
GiveWP – Donation Plugin and Fundraising Platform v4.13.1
4.16.2 4.16.1 4.16.0 4.15.5 4.15.4 4.15.3 4.15.2 4.15.1 4.15.0 2.3.0 2.3.1 2.3.2 2.30.0 2.31.0 2.31.1 2.32.0 2.33.0 2.33.1 2.33.2 2.33.3 2.33.4 2.33.5 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.4.7 2.5.0 2.5.1 2.5.10 2.5.11 2.5.12 2.5.13 2.5.2 2.5.3 2.5.4 2.5.5 2.5.6 2.5.7 2.5.8 2.5.9 2.6.0 2.6.1 2.6.2 2.6.3 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.9.0 2.9.1 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.1.0 3.1.1 3.1.2 3.10.0 3.11.0 3.12.0 3.12.1 3.12.2 3.12.3 3.13.0 3.14.0 3.14.1 3.14.2 3.15.0 3.15.1 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.17.0 3.17.1 3.17.2 3.18.0 3.19.0 3.19.1 3.19.2 3.19.3 3.19.4 3.2.0 3.2.1 3.2.2 3.20.0 3.21.0 3.21.1 3.22.0 3.22.1 3.22.2 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.5.1 3.6.0 3.6.1 3.6.2 3.7.0 3.8.0 3.9.0 4.0.0 4.1.0 4.1.1 4.10.0 4.10.1 4.11.0 4.12.0 4.13.0 4.13.1 4.13.2 4.14.0 4.14.1 4.14.2 4.14.3 4.14.4 4.14.5 4.14.6 4.2.0 4.2.1 4.3.0 4.3.1 4.3.2 4.4.0 4.5.0 4.6.1 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 trunk 1.9.0 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.2 2.11.3 2.12.0 2.12.1 2.12.2 2.12.3 2.13.0 2.13.1 2.13.2 2.13.3 2.13.4 2.14.0 2.15.0 2.16.0 2.16.1 2.17.0 2.17.1 2.17.3 2.18.0 2.18.1 2.19.1 2.19.2 2.19.3 2.19.4 2.19.5 2.19.6 2.19.7 2.19.8 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 2.20.0 2.20.1 2.20.2 2.21.0 2.21.1 2.21.2 2.21.3 2.21.4 2.22.0 2.22.1 2.22.2 2.22.3 2.23.0 2.23.1 2.23.2 2.24.0 2.24.1 2.24.2 2.25.0 2.25.1 2.25.2 2.25.3 2.26.0 2.27.0 2.27.1 2.27.2 2.27.3 2.28.0 2.29.0 2.29.1 2.29.2
give / src / API / Endpoints / Migrations / RunMigration.php
give / src / API / Endpoints / Migrations Last commit date
Endpoint.php 4 years ago GetMigrations.php 1 year ago RunMigration.php 1 year ago
RunMigration.php
317 lines
1 <?php
2
3 namespace Give\API\Endpoints\Migrations;
4
5 use Exception;
6 use Give\Framework\Database\DB;
7 use Give\Framework\Migrations\Contracts\BatchMigration;
8 use Give\Framework\Migrations\Contracts\Migration;
9 use Give\Framework\Migrations\Contracts\ReversibleMigration;
10 use Give\Framework\Migrations\Controllers\BatchMigrationRunner;
11 use Give\Framework\Migrations\MigrationsRegister;
12 use Give\MigrationLog\MigrationLogFactory;
13 use Give\MigrationLog\MigrationLogStatus;
14 use WP_REST_Request;
15 use WP_REST_Response;
16
17 /**
18 * Class RunMigration
19 * @package Give\API\Endpoints\Migrations
20 *
21 * @since 4.0.0 run batch migrations
22 * @since 2.10.0
23 */
24 class RunMigration extends Endpoint
25 {
26 /**
27 * @var MigrationsRegister
28 */
29 private $migrationRegister;
30
31 /**
32 * @var MigrationLogFactory
33 */
34 private $migrationLogFactory;
35
36 /**
37 * RunMigration constructor.
38 *
39 * @param MigrationsRegister $migrationsRegister
40 * @param MigrationLogFactory $migrationLogFactory
41 */
42 public function __construct(
43 MigrationsRegister $migrationsRegister,
44 MigrationLogFactory $migrationLogFactory
45 ) {
46 $this->migrationRegister = $migrationsRegister;
47 $this->migrationLogFactory = $migrationLogFactory;
48 }
49
50 /**
51 * @inheritDoc
52 */
53 public function registerRoute()
54 {
55 register_rest_route(
56 'give-api/v2',
57 'migrations/run-migration',
58 [
59 [
60 'methods' => 'POST',
61 'callback' => [$this, 'runMigration'],
62 'permission_callback' => [$this, 'permissionsCheck'],
63 'args' => [
64 'id' => [
65 'type' => 'string',
66 'required' => true,
67 ],
68 ],
69 ],
70 'schema' => [$this, 'getSchema'],
71 ]
72 );
73
74 register_rest_route(
75 'give-api/v2',
76 'migrations/run-batch-migration',
77 [
78 [
79 'methods' => 'POST',
80 'callback' => [$this, 'runBatchMigration'],
81 'permission_callback' => [$this, 'permissionsCheck'],
82 'args' => [
83 'id' => [
84 'type' => 'string',
85 'required' => true,
86 ],
87 ],
88 ],
89 ]
90 );
91
92 register_rest_route(
93 'give-api/v2',
94 'migrations/reschedule-failed-actions',
95 [
96 [
97 'methods' => 'POST',
98 'callback' => [$this, 'rescheduleFailedActions'],
99 'permission_callback' => [$this, 'permissionsCheck'],
100 'args' => [
101 'id' => [
102 'type' => 'string',
103 'required' => true,
104 ],
105 ],
106 ],
107 ]
108 );
109
110 /**
111 * @since 4.3.0
112 */
113 register_rest_route(
114 'give-api/v2',
115 'migrations/rollback-migration',
116 [
117 [
118 'methods' => 'POST',
119 'callback' => [$this, 'rollbackMigration'],
120 'permission_callback' => [$this, 'permissionsCheck'],
121 'args' => [
122 'id' => [
123 'type' => 'string',
124 'required' => true,
125 'validate_callback' => function ($param) {
126 $migrationClass = $this->migrationRegister->getMigration($param);
127
128 return is_subclass_of($migrationClass, ReversibleMigration::class);
129 },
130 ],
131 ],
132 ],
133 'schema' => [$this, 'getSchema'],
134 ]
135 );
136 }
137
138 /**
139 * @return array
140 */
141 public function getSchema()
142 {
143 return [
144 '$schema' => 'http://json-schema.org/draft-04/schema#',
145 'title' => 'logs',
146 'type' => 'object',
147 'properties' => [
148 'id' => [
149 'type' => 'string',
150 'description' => esc_html__('Migration ID', 'give'),
151 ],
152 ],
153 ];
154 }
155
156 /**
157 * @param WP_REST_Request $request
158 *
159 * @return WP_REST_Response
160 */
161 public function runMigration(WP_REST_Request $request): WP_REST_Response
162 {
163 $migrationId = $request->get_param('id');
164 $migrationLog = $this->migrationLogFactory->make($migrationId);
165
166 // Begin transaction
167 DB::beginTransaction();
168
169 try {
170 $migrationClass = $this->migrationRegister->getMigration($migrationId);
171 /**
172 * @var Migration $migration
173 */
174 $migration = give($migrationClass);
175 $migration->run();
176 // Save migration status
177 $migrationLog
178 ->setStatus(MigrationLogStatus::SUCCESS)
179 ->setError(null)
180 ->save();
181
182 DB::commit();
183
184 return new WP_REST_Response(['status' => true]);
185 } catch (Exception $exception) {
186 DB::rollback();
187
188 $migrationLog
189 ->setStatus(MigrationLogStatus::FAILED)
190 ->setError([
191 'status' => __('Migration failed', 'give'),
192 'error' => [
193 'message' => $exception->getMessage(),
194 'code' => $exception->getCode(),
195 'file' => $exception->getFile(),
196 'line' => $exception->getLine(),
197 ],
198 ])
199 ->save();
200 }
201
202 return new WP_REST_Response(
203 [
204 'status' => false,
205 'message' => $exception->getMessage(),
206 ]
207 );
208 }
209
210
211 /**
212 * Run batch migration
213 *
214 * @since 4.0.0
215 */
216 public function runBatchMigration(WP_REST_Request $request): WP_REST_Response
217 {
218 $migrationId = $request->get_param('id');
219 $migrationClass = $this->migrationRegister->getMigration($migrationId);
220
221 if ( ! is_subclass_of($migrationClass, BatchMigration::class)) {
222 return new WP_REST_Response([
223 'status' => false,
224 'message' => 'Migration is not an instance of ' . BatchMigration::class,
225 ]);
226 }
227
228 try {
229 // We are not running migration directly,
230 // we just have to set migration status to PENDING and Migration Runner will handle it
231 $migrationLog = $this->migrationLogFactory->make($migrationId);
232 $migrationLog->setStatus(MigrationLogStatus::PENDING);
233 $migrationLog->save();
234 } catch (Exception $e) {
235 return new WP_REST_Response([
236 'status' => false,
237 'message' => $e->getMessage(),
238 ]);
239 }
240
241 return new WP_REST_Response(['status' => true]);
242 }
243
244 /**
245 * Reschedule failed actions
246 *
247 * @since 4.0.0
248 */
249 public function rescheduleFailedActions(WP_REST_Request $request): WP_REST_Response
250 {
251 $migrationId = $request->get_param('id');
252 $migrationClass = $this->migrationRegister->getMigration($migrationId);
253 $migration = give($migrationClass);
254
255 if ( ! is_subclass_of($migration, BatchMigration::class)) {
256 return new WP_REST_Response([
257 'status' => false,
258 'message' => 'Migration is not an instance of ' . BatchMigration::class,
259 ]);
260 }
261
262 try {
263 (new BatchMigrationRunner($migration))->rescheduleFailedActions();
264 } catch (Exception $e) {
265 return new WP_REST_Response([
266 'status' => false,
267 'message' => $e->getMessage(),
268 ]);
269 }
270
271 return new WP_REST_Response(['status' => true]);
272 }
273
274
275 /**
276 * @since 4.3.0
277 */
278 public function rollbackMigration(WP_REST_Request $request): WP_REST_Response
279 {
280 $migrationId = $request->get_param('id');
281 $migrationClass = $this->migrationRegister->getMigration($migrationId);
282 $migration = give($migrationClass);
283 $migrationLog = $this->migrationLogFactory->make($migrationId);
284
285 if ($migration instanceof ReversibleMigration) {
286 try {
287 $migration->reverse();
288 $migrationLog->setStatus(MigrationLogStatus::REVERSED);
289 } catch (Exception $e) {
290 $migrationLog
291 ->setStatus(MigrationLogStatus::FAILED)
292 ->setError([
293 'status' => __('Rollback failed', 'give'),
294 'error' => [
295 'message' => $e->getMessage(),
296 'code' => $e->getCode(),
297 'file' => $e->getFile(),
298 'line' => $e->getLine(),
299 ],
300 ]);
301
302 return new WP_REST_Response([
303 'status' => false,
304 'message' => $e->getMessage(),
305 ]);
306 }
307
308 $migrationLog->save();
309
310 return new WP_REST_Response(['status' => true]);
311 }
312
313 return new WP_REST_Response(['status' => false]);
314 }
315
316 }
317