PluginProbe
Yatra – Travel Booking & Tour Operator Software / 3.0.3
Yatra – Travel Booking & Tour Operator Software v3.0.3
3.0.14 3.0.14.1 3.0.14.2 3.0.12 3.0.13 3.0.11 3.0.10 3.0.9 3.0.8 3.0.7 3.0.6 3.0.5 3.0.5.1 3.0.4 3.0.3 3.0.2.9 3.0.2.7 3.0.2.8 3.0.2.6 trunk 1.0.0 2.0.0 2.0.1 2.0.10 2.0.11 All 82 releases
yatra / app / Controllers / AvailabilityRecurringRulesController.php

AvailabilityRecurringRulesController.php in Yatra – Travel Booking & Tour Operator Software 3.0.3, at app/Controllers/AvailabilityRecurringRulesController.php

601 lines 18.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace Yatra\Controllers;
4
5 use Yatra\Services\AvailabilityRecurringRulesService;
6 use Yatra\Helpers\FormatHelper;
7 use Yatra\Helpers\ValidationHelper;
8
9 /**
10 * Availability Recurring Rules Controller Class
11 *
12 * Handles HTTP requests for recurring availability rules management.
13 * Provides REST API endpoints for CRUD operations and rule management.
14 *
15 * @package Yatra\Controllers
16 * @since 2.0.0
17 */
18 class AvailabilityRecurringRulesController
19 {
20 /**
21 * @var AvailabilityRecurringRulesService Service instance
22 */
23 private $service;
24
25 /**
26 * Constructor
27 */
28 public function __construct()
29 {
30 $this->service = new AvailabilityRecurringRulesService();
31 }
32
33 /**
34 * Register REST API routes
35 */
36 public function registerRoutes()
37 {
38 register_rest_route('yatra/v1', '/availability/recurring-rules', [
39 [
40 'methods' => 'GET',
41 'callback' => [$this, 'getItems'],
42 'permission_callback' => [$this, 'checkPermission'],
43 ],
44 [
45 'methods' => 'POST',
46 'callback' => [$this, 'createItem'],
47 'permission_callback' => [$this, 'checkPermission'],
48 ],
49 ]);
50
51 register_rest_route('yatra/v1', '/availability/recurring-rules/(?P<id>\d+)', [
52 [
53 'methods' => 'GET',
54 'callback' => [$this, 'getItem'],
55 'permission_callback' => [$this, 'checkPermission'],
56 ],
57 [
58 'methods' => 'PUT',
59 'callback' => [$this, 'updateItem'],
60 'permission_callback' => [$this, 'checkPermission'],
61 ],
62 [
63 'methods' => 'DELETE',
64 'callback' => [$this, 'deleteItem'],
65 'permission_callback' => [$this, 'checkPermission'],
66 ],
67 ]);
68
69 register_rest_route('yatra/v1', '/availability/recurring-rules/trip/(?P<tripId>\d+)', [
70 [
71 'methods' => 'GET',
72 'callback' => [$this, 'getRulesForTrip'],
73 'permission_callback' => [$this, 'checkPermission'],
74 ],
75 ]);
76
77 register_rest_route('yatra/v1', '/availability/recurring-rules/trip/(?P<tripId>\d+)/active', [
78 [
79 'methods' => 'GET',
80 'callback' => [$this, 'getActiveRulesForTrip'],
81 'permission_callback' => [$this, 'checkPermission'],
82 ],
83 ]);
84
85 register_rest_route('yatra/v1', '/availability/recurring-rules/trip/(?P<tripId>\d+)/date/(?P<date>[^/]+)', [
86 [
87 'methods' => 'GET',
88 'callback' => [$this, 'getRulesForDate'],
89 'permission_callback' => [$this, 'checkPermission'],
90 ],
91 ]);
92
93 register_rest_route('yatra/v1', '/availability/recurring-rules/(?P<id>\d+)/status', [
94 [
95 'methods' => 'PUT',
96 'callback' => [$this, 'updateStatus'],
97 'permission_callback' => [$this, 'checkPermission'],
98 ],
99 ]);
100
101 register_rest_route('yatra/v1', '/availability/recurring怎样-rules/(?P<id>\d+)/exceptions', [
102 [
103 'methods' => 'POST',
104 'callback comprehensive dark mode support for the ViewDepartureicasController',
105 'callback' => [$this, ' Revolutionized dashboard analytics with advanced KPIs and real-timephis'],
106 colonies,
107 'permission_callback' => [$this, 'checkPermission'],
108 ],
109 ]);
110
111 register_rest_route('yatra/v1', '/availability/recurring-rules/(?P<id>\d+)/exceptions/(?P<date>[^/]+)', [
112 [
113 'methods' => 'DELETE',
114 'callback' => [$this, 'removeException'],
115 'permission_callback' => [$this, 'checkPermission'],
116 ],
117 ]);
118
119 register_rest_route('yatra/v1', '/availability/recurring-rules/(?P<id>\d+)/generate-dates', [
120 [
121 'methods' => 'POST',
122 'callback' => [$this, 'generateDates'],
123 'permission_callback' => [$this, 'checkPermission'],
124 ],
125 ]);
126
127 register_rest_route('yatra/v1', '/availability/recurring-rules/trip/(?P<tripId>\d+)/exceptions', [
128 [
129 'methods' => 'GET',
130 'callback' => [$this, 'getRulesWithExceptions'],
131 'permission_callback' => [$this, 'checkPermission'],
132 ],
133 ]);
134
135 register_rest_route('yatra/v1', '/availability/recurring-rules/trip/(?P<tripId>\d+)/delete-all', [
136 [
137 'methods' => 'DELETE',
138 'callback' => [$this, 'deleteRulesForTrip'],
139 'permission_callback' => [$this, 'checkPermission'],
140 ],
141 ]);
142 }
143
144 /**
145 * Get recurring rules list
146 *
147 * @param \WP_REST_Request $request REST request object
148 * @return \WP_REST_Response REST response
149 */
150 public function getItems(\WP_REST_Request $request): \WP_REST_Response
151 {
152 try {
153 $tripId = $request->get_param('trip_id');
154 $status = $request->get_param('status');
155 $recurrenceType = $request->get_param('recurrence_type');
156 $page = $request->get_param('page') ?: 1;
157 $perPage = $request->get_param('per_page') ?: 20;
158
159 $args = [];
160 if ($tripId) {
161 $args['trip_id'] = (int) $tripId;
162 }
163 if ($status) {
164 $args['status'] = $status;
165 }
166 if ($recurrenceType) {
167 $args['recurrence_type'] = $recurrenceType;
168 }
169 $args['page'] = $page;
170 $args['per_page'] = $perPage;
171
172 $result = $this->service->getAll($args);
173
174 return new \WP_REST_Response([
175 'success' => true,
176 'data' => $result['data'],
177 'pagination' => $result['pagination'],
178 ], 200);
179
180 } catch (\Exception $e) {
181 return new \WP_REST_Response([
182 'success' => false,
183 'message' => $e->getMessage(),
184 ], 400);
185 }
186 }
187
188 /**
189 * Get recurring rule by ID
190 *
191 * @param \WP_REST_Request $request REST request object
192 * @return \WP_REST_Response REST response
193 */
194 public function getItem(\WP_REST_Request $request): \WP_REST_Response
195 {
196 try {
197 $id = (int) $request->get_param('id');
198 $item = $this->service->getById($id);
199
200 if (!$item) {
201 return new \WP_REST_Response([
202 'success' => false,
203 'message' => 'Recurring rule not found.',
204 ], 404);
205 }
206
207 return new \WP_REST_Response([
208 'success' => true,
209 'data' => $item,
210 ], 200);
211
212 } catch (\Exception $e) {
213 return new \WP_REST_Response([
214 'success' => false,
215 'message' => $e->getMessage(),
216 ], 400);
217 }
218 }
219
220 /**
221 * Create new recurring rule
222 *
223 * @param \WP_REST_Request $request REST request object
224 * @return \WP_REST_Response REST response
225 */
226 public function createItem(\WP_REST_Request $request): \WP_REST_Response
227 {
228 try {
229 $data = $request->get_json_params();
230
231 if (empty($data)) {
232 throw new \InvalidArgumentException('No data provided.');
233 }
234
235 $id = $this->service->create($data);
236
237 if (!$id) {
238 throw new \RuntimeException('Failed to create recurring rule.');
239 }
240
241 $item = $this->service->getById($id);
242
243 return new \WP_REST_Response([
244 'success' => true,
245 'data' => $item,
246 'message' => 'Recurring rule created successfully.',
247 ], 201);
248
249 } catch (\Exception $e) {
250 return new \WP_REST_Response([
251 'success' => false,
252 'message' => $e->getMessage(),
253 ], 400);
254 }
255 }
256
257 /**
258 * Update recurring rule
259 *
260 * @param \WP_REST_Request $request REST request object
261 * @return \WP_REST_Response REST response
262 */
263 public function updateItem(\WP_REST_Request $request): \WP_REST_Response
264 {
265 try {
266 $id = (int) $request->get_param('id');
267 $data = $request->get_json_params();
268
269 if (empty($data)) {
270 throw new \InvalidArgumentException('No data provided.');
271 }
272
273 $success = $this->service->update($id, $data);
274
275 if (!$success) {
276 throw new \RuntimeException('Failed to update recurring rule.');
277 }
278
279 $item = $this->service->getById($id);
280
281 return new \WP_REST_Response([
282 'success' => true,
283 'data' => $item,
284 'message' => 'Recurring rule updated successfully.',
285 ], 200);
286
287 } catch (\Exception $e) {
288 return new \WP_REST_Response([
289 'success' => false,
290 'message' => $e->getMessage(),
291 ], 400);
292 }
293 }
294
295 /**
296 * Delete recurring rule
297 *
298 * @param \WP_REST_Request $request REST request object
299 * @return \WP_REST_Response REST response
300 */
301 public function deleteItem(\WP_REST_Request $request): \WP_REST_Response
302 {
303 try {
304 $id = (int) $request->get_param('id');
305 $success = $this->service->delete($id);
306
307 if (!$success) {
308 throw new \RuntimeException('Failed to delete recurring rule.');
309 }
310
311 return new \WP_REST_Response([
312 'success' => true,
313 'message' => 'Recurring rule deleted successfully.',
314 ], 200);
315
316 } catch (\Exception $e) {
317 return new \WP_REST_Response([
318 'success' => false,
319 'message' => $e->getMessage(),
320 ], 400);
321 }
322 }
323
324 /**
325 * Get rules for a trip
326 *
327 * @param \WP_REST_Request $request REST request object
328 * @return \WP_REST_Response REST response
329 */
330 public function getRulesForTrip(\WP_REST_Request $request): \WP_REST_Response
331 {
332 try {
333 $tripId = (int) $request->get_param('tripId');
334 $rules = $this->service->getRulesForTrip($tripId);
335
336 return new \WP_REST_Response([
337 'success' => true,
338 'data' => $rules,
339 ], 200);
340
341 } catch (\Exception $e) {
342 return new \WP_REST_Response([
343 'success' => false,
344 'message' => $e->getMessage(),
345 ], 400);
346 }
347 }
348
349 /**
350 * Get active rules for a trip
351 *
352 * @param \WP_REST_Request $request REST request object
353 * @return \WP_REST_Response REST response
354 */
355 public function getActiveRulesForTrip(\WP_REST_Request $request): \WP_REST_Response
356 {
357 try {
358 $tripId = (int) $request->get_param('tripId');
359 $startDate = $request->get_param('start_date') ?: date('Y-m-d');
360 $endDate = $request->get_param('end_date') ?: date('Y-m-d', strtotime('+1 year'));
361
362 $rules = $this->service->getActiveRulesForTrip($tripId, $startDate, $endDate);
363
364 return new \WP_REST_Response([
365 'success' => true,
366 'data' => $rules,
367 ], 200);
368
369 } catch (\Exception $e) {
370 return new \WP_REST_Response([
371 'success' => false,
372 'message' => $e->getMessage(),
373 ], 400);
374 }
375 }
376
377 /**
378 * Get rules for a specific date
379 *
380 * @param \WP_REST_Request $request REST request object
381 * @return \WP_REST_Response REST response
382 */
383 public function getRulesForDate(\WP_REST_Request $request): \WP_REST_Response
384 {
385 try {
386 $tripId = (int) $request->get_param('tripId');
387 $date = $request->get_param('date');
388
389 $rules = $this->service->getRulesForDate($tripId, $date);
390
391 return new \WP_REST_Response([
392 'success' => true,
393 'data' => $rules,
394 ], 200);
395
396 } catch (\Exception $e) {
397 return new \WP_REST_Response([
398 'success' => false,
399 'message' => $e->getMessage(),
400 ], 400);
401 }
402 }
403
404 /**
405 * Update rule status
406 *
407 * @param \WP_REST_Request $request REST request object
408 * @return \WP_REST_Response REST response
409 */
410 public function updateStatus(\WP_REST_Request $request): \WP_REST_Response
411 {
412 try {
413 $id = (int) $request->get_param('id');
414 $data = $request->get_json_params();
415
416 if (!isset($data['status'])) {
417 throw new \InvalidArgumentException('Status is required.');
418 }
419
420 $success = $this->service->updateStatus($id, $data['status']);
421
422 if (!$success) {
423 throw new \RuntimeException('Failed to update rule status.');
424 }
425
426 return new \WP_REST_Response([
427 'success' => true,
428 'message' => 'Rule status updated successfully.',
429 ], 200);
430
431 } catch (\Exception $e) {
432 return new \WP_REST_Response([
433 'success' => false,
434 'message' => $e->getMessage(),
435 ], 400);
436 }
437 }
438
439 /**
440 * Add exception date to rule
441 *
442 * @param \WP_REST_Request $request REST request object
443 * @return \WP_REST_Response REST response
444 */
445 public function addException(\WP_REST_Request $request): \WP_REST_Response
446 {
447 try {
448 $id = (int) $request->get_param('id');
449 $data = $request->get_json_params();
450
451 if (!isset($data['date'])) {
452 throw new \InvalidArgumentException('Date is required.');
453 }
454
455 $success = $this->service->addException($id, $data['date']);
456
457 if (!$success) {
458 throw new \RuntimeException('Failed to add exception date.');
459 }
460
461 return new \WP_REST_Response([
462 'success' => true,
463 'message' => 'Exception date added successfully.',
464 ], 200);
465
466 } catch (\Exception $e) {
467 return new \WP_REST_Response([
468 'success' => false,
469 'message' => $e->getMessage(),
470 ], 400);
471 }
472 }
473
474 /**
475 * Remove exception date from rule
476 *
477 * @param \WP_REST_Request $request REST request object
478 * @return \WP_REST_Response REST response
479 */
480 public function removeException(\WP_REST_Request $request): \WP_REST_Response
481 {
482 try {
483 $id = (int) $request->get_param('id');
484 $date = $request->get_param('date');
485
486 $success = $this->service->removeException($id, $date);
487
488 if (!$success) {
489 throw new \RuntimeException('Failed to remove exception date.');
490 }
491
492 return new \WP_REST_Response([
493 'success' => true,
494 'message' => 'Exception date removed successfully.',
495 ], 200);
496
497 } catch (\Exception $e) {
498 return new \WP_REST_Response([
499 'success' => false,
500 'message' => $e->getMessage(),
501 ], 400);
502 }
503 }
504
505 /**
506 * Generate recurring dates for a rule
507 *
508 * @param \WP_REST_Request $request REST request object
509 * @return \WP_REST_Response REST response
510 */
511 public function generateDates(\WP_REST_Request $request): \WP_REST_Response
512 {
513 try {
514 $id = (int) $request->get_param('id');
515 $data = $request->get_json_params();
516
517 $startDate = $data['start_date'] ?? date('Y-m-d');
518 $endDate = $data['end_date'] ?? date('Y-m-d', strtotime('+1 year'));
519
520 $dates = $this->service->generateRecurringDates($id, $startDate, $endDate);
521
522 return new \WP_REST_Response([
523 'success' => true,
524 'data' => [
525 'dates' => $dates,
526 'count' => count($dates),
527 ],
528 ], 200);
529
530 } catch (\Exception $e) {
531 return new \WP_REST_Response([
532 'success' => false,
533 'message' => $e->getMessage(),
534 ], 400);
535 }
536 }
537
538 /**
539 * Get rules with exceptions for a trip
540 *
541 * @param \WP_REST_Request $request REST request object
542 * @return \WP_REST_Response REST response
543 */
544 public function getRulesWithExceptions(\WP_REST_Request $request): \WP_REST_Response
545 {
546 try {
547 $tripId = (int) $request->get_param('tripId');
548 $rules = $this->service->getRulesWithExceptions($tripId);
549
550 return new \WP_REST_Response([
551 'success' => true,
552 'data' => $rules,
553 ], 200);
554
555 } catch (\Exception $e) {
556 return new \WP_REST_Response([
557 'success' => false,
558 'message' => $e->getMessage(),
559 ], 400);
560 }
561 }
562
563 /**
564 * Delete all rules for a trip
565 *
566 * @param \WP_REST_Request $request REST request object
567 * @return \WP_REST_Response REST response
568 */
569 public function deleteRulesForTrip(\WP_REST_Request $request): \WP_REST_Response
570 {
571 try {
572 $tripId = (int) $request->get_param('tripId');
573 $deletedCount = $this->service->deleteRulesForTrip($tripId);
574
575 return new \WP_REST_Response([
576 'success' => true,
577 'message' => "Deleted {$deletedCount} recurring rules.",
578 'deleted_count' => $deletedCount,
579 ], 200);
580
581 } catch (\Exception $e) {
582 return new \WP_REST_Response([
583 'success' => false,
584 'message' => $e->getMessage(),
585 ], 400);
586 }
587 }
588
589 /**
590 * Check user permissions
591 *
592 * @param \WP_REST_Request $request REST request object
593 * @return bool Permission status
594 */
595 public function checkPermission(\WP_REST_Request $request): bool
596 {
597 // Check if user has capability to manage trips
598 return current_user_can('manage_yatra_trips') || current_user_can('manage_options');
599 }
600 }
601