PluginProbe
Yatra – Travel Booking & Tour Operator Software / 3.0.10
Yatra – Travel Booking & Tour Operator Software v3.0.10
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 / SavedTripController.php

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

220 lines 6.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 declare(strict_types=1);
4
5 namespace Yatra\Controllers;
6
7 use WP_REST_Request;
8 use WP_REST_Response;
9 use Yatra\Services\SavedTripService;
10 use Yatra\Services\SettingsService;
11
12 /**
13 * Saved Trip REST API Controller
14 *
15 * Handles HTTP requests for saved trips/wishlist functionality.
16 *
17 * @package Yatra\Controllers
18 */
19 class SavedTripController extends BaseController
20 {
21 private SavedTripService $savedTripService;
22
23 public function __construct()
24 {
25 $this->savedTripService = new SavedTripService();
26 }
27
28 /**
29 * Register routes
30 */
31 public function register_routes(): void
32 {
33 if (!SettingsService::wishlistEnabled()) {
34 return;
35 }
36
37 $namespace = 'yatra/v1';
38 $base = 'saved-trips';
39
40 // Check if trip is saved
41 register_rest_route($namespace, '/' . $base . '/check/(?P<trip_id>\d+)', [
42 [
43 'methods' => \WP_REST_Server::READABLE,
44 'callback' => [$this, 'checkSaved'],
45 'permission_callback' => [$this, 'checkUserPermission'],
46 ],
47 ]);
48
49 // Save trip
50 register_rest_route($namespace, '/' . $base, [
51 [
52 'methods' => \WP_REST_Server::CREATABLE,
53 'callback' => [$this, 'saveTrip'],
54 'permission_callback' => [$this, 'checkUserPermission'],
55 ],
56 ]);
57
58 // Remove saved trip
59 register_rest_route($namespace, '/' . $base . '/(?P<trip_id>\d+)', [
60 [
61 'methods' => \WP_REST_Server::DELETABLE,
62 'callback' => [$this, 'removeTrip'],
63 'permission_callback' => [$this, 'checkUserPermission'],
64 ],
65 ]);
66
67 // Get user's saved trips
68 register_rest_route($namespace, '/' . $base, [
69 [
70 'methods' => \WP_REST_Server::READABLE,
71 'callback' => [$this, 'getSavedTrips'],
72 'permission_callback' => [$this, 'checkUserPermission'],
73 ],
74 ]);
75 }
76
77 /**
78 * Check user permission (must be logged in)
79 */
80 public function checkUserPermission(): bool
81 {
82 return SettingsService::wishlistEnabled() && is_user_logged_in();
83 }
84
85 /**
86 * Resolve trip ID from route params, merged params, and raw JSON body (some stacks omit JSON on get_param).
87 */
88 private function parseTripIdFromRequest(WP_REST_Request $request): int
89 {
90 foreach (['trip_id', 'tripId', 'id'] as $key) {
91 $v = $request->get_param($key);
92 if ($v !== null && $v !== '' && absint($v) > 0) {
93 return absint($v);
94 }
95 }
96
97 $bodyParams = $request->get_body_params();
98 if (is_array($bodyParams)) {
99 foreach (['trip_id', 'tripId', 'id'] as $key) {
100 if (isset($bodyParams[$key]) && $bodyParams[$key] !== '' && absint($bodyParams[$key]) > 0) {
101 return absint($bodyParams[$key]);
102 }
103 }
104 }
105
106 $data = $request->get_json_params();
107 if (is_array($data)) {
108 foreach (['trip_id', 'tripId', 'id'] as $key) {
109 if (isset($data[$key]) && $data[$key] !== '' && absint($data[$key]) > 0) {
110 return absint($data[$key]);
111 }
112 }
113 }
114
115 $raw = $request->get_body();
116 if (is_string($raw) && $raw !== '') {
117 $decoded = json_decode($raw, true);
118 if (is_array($decoded)) {
119 foreach (['trip_id', 'tripId', 'id'] as $key) {
120 if (isset($decoded[$key]) && $decoded[$key] !== '' && absint($decoded[$key]) > 0) {
121 return absint($decoded[$key]);
122 }
123 }
124 }
125 }
126
127 return 0;
128 }
129
130 /**
131 * GET /saved-trips/check/{trip_id} - Check if trip is saved
132 */
133 public function checkSaved(WP_REST_Request $request): WP_REST_Response
134 {
135 $userId = get_current_user_id();
136 $tripId = (int) $request->get_param('trip_id');
137
138 $isSaved = $this->savedTripService->isSaved($userId, $tripId);
139
140 return new WP_REST_Response([
141 'success' => true,
142 'data' => [
143 'is_saved' => $isSaved,
144 ],
145 ]);
146 }
147
148 /**
149 * POST /saved-trips - Save trip
150 */
151 public function saveTrip(WP_REST_Request $request): WP_REST_Response
152 {
153 $userId = get_current_user_id();
154
155 $tripId = $this->parseTripIdFromRequest($request);
156
157 if ($tripId <= 0) {
158 return new WP_REST_Response([
159 'success' => false,
160 'message' => __('Trip ID is required.', 'yatra'),
161 ], 400);
162 }
163
164 // Verify trip ID is valid (must be > 0)
165 // Note: User ID and Trip ID can be the same number (e.g., both 1), so we don't block that
166 // Instead, we verify the trip exists in the database
167
168 $result = $this->savedTripService->saveTrip($userId, $tripId);
169
170 if (!$result['success']) {
171 return new WP_REST_Response($result, 400);
172 }
173
174 return new WP_REST_Response($result);
175 }
176
177 /**
178 * DELETE /saved-trips/{trip_id} - Remove saved trip
179 */
180 public function removeTrip(WP_REST_Request $request): WP_REST_Response
181 {
182 $userId = get_current_user_id();
183 $tripId = absint($request->get_param('trip_id'));
184 if ($tripId <= 0) {
185 $tripId = $this->parseTripIdFromRequest($request);
186 }
187
188 if ($tripId <= 0) {
189 return new WP_REST_Response([
190 'success' => false,
191 'message' => __('Trip ID is required.', 'yatra'),
192 ], 400);
193 }
194
195 $result = $this->savedTripService->removeTrip($userId, $tripId);
196
197 if (!$result['success']) {
198 return new WP_REST_Response($result, 400);
199 }
200
201 return new WP_REST_Response($result);
202 }
203
204 /**
205 * GET /saved-trips - Get user's saved trips
206 */
207 public function getSavedTrips(WP_REST_Request $request): WP_REST_Response
208 {
209 $userId = get_current_user_id();
210
211 $trips = $this->savedTripService->getUserSavedTrips($userId);
212
213 return new WP_REST_Response([
214 'success' => true,
215 'data' => $trips,
216 ]);
217 }
218 }
219
220