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 / EnquiryController.php

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

307 lines 8.7 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 WP_Error;
10 use Yatra\Services\EnquiryService;
11
12 /**
13 * Enquiry REST API Controller
14 *
15 * Handles HTTP requests only - delegates business logic to EnquiryService.
16 *
17 * NO DATABASE QUERIES OR BUSINESS LOGIC IN THIS FILE.
18 *
19 * @package Yatra\Controllers
20 */
21 class EnquiryController extends BaseController
22 {
23 /**
24 * Enquiry service instance
25 */
26 private EnquiryService $enquiryService;
27
28 /**
29 * Constructor
30 */
31 public function __construct()
32 {
33 $this->enquiryService = new EnquiryService();
34 }
35
36 /**
37 * Register routes
38 */
39 public function register_routes(): void
40 {
41 $namespace = 'yatra/v1';
42 $base = 'enquiries';
43
44 // List & Create
45 register_rest_route($namespace, '/' . $base, [
46 [
47 'methods' => \WP_REST_Server::READABLE,
48 'callback' => [$this, 'getEnquiries'],
49 'permission_callback' => [$this, 'checkAdminPermission'],
50 ],
51 [
52 'methods' => \WP_REST_Server::CREATABLE,
53 'callback' => [$this, 'createEnquiry'],
54 'permission_callback' => '__return_true', // Public endpoint
55 ],
56 ]);
57
58 // Single enquiry operations
59 register_rest_route($namespace, '/' . $base . '/(?P<id>[\d]+)', [
60 [
61 'methods' => \WP_REST_Server::READABLE,
62 'callback' => [$this, 'getEnquiry'],
63 'permission_callback' => [$this, 'checkAdminPermission'],
64 ],
65 [
66 'methods' => \WP_REST_Server::EDITABLE,
67 'callback' => [$this, 'updateEnquiry'],
68 'permission_callback' => [$this, 'checkAdminPermission'],
69 ],
70 [
71 'methods' => \WP_REST_Server::DELETABLE,
72 'callback' => [$this, 'deleteEnquiry'],
73 'permission_callback' => [$this, 'checkAdminPermission'],
74 ],
75 ]);
76
77 // Bulk actions
78 register_rest_route($namespace, '/' . $base . '/bulk', [
79 [
80 'methods' => \WP_REST_Server::EDITABLE,
81 'callback' => [$this, 'bulkAction'],
82 'permission_callback' => [$this, 'checkAdminPermission'],
83 ],
84 ]);
85
86 // Stats endpoint
87 register_rest_route($namespace, '/' . $base . '/stats', [
88 [
89 'methods' => \WP_REST_Server::READABLE,
90 'callback' => [$this, 'getStats'],
91 'permission_callback' => [$this, 'checkAdminPermission'],
92 ],
93 ]);
94
95 // Respond to enquiry
96 register_rest_route($namespace, '/' . $base . '/(?P<id>[\d]+)/respond', [
97 [
98 'methods' => \WP_REST_Server::CREATABLE,
99 'callback' => [$this, 'respondToEnquiry'],
100 'permission_callback' => [$this, 'checkAdminPermission'],
101 ],
102 ]);
103 }
104
105 /**
106 * Check admin permission
107 */
108 public function checkAdminPermission(): bool
109 {
110 return current_user_can('manage_options');
111 }
112
113 /**
114 * GET /enquiries - List all enquiries
115 */
116 public function getEnquiries(WP_REST_Request $request): WP_REST_Response
117 {
118 $filters = [
119 'page' => (int) ($request->get_param('page') ?: 1),
120 'per_page' => (int) ($request->get_param('per_page') ?: 20),
121 'status' => $request->get_param('status') ?: '',
122 'trip_id' => (int) $request->get_param('trip_id'),
123 'search' => $request->get_param('search') ?: '',
124 'date_from' => $request->get_param('date_from') ?: '',
125 'date_to' => $request->get_param('date_to') ?: '',
126 ];
127
128 $result = $this->enquiryService->getEnquiries($filters);
129
130 return new WP_REST_Response([
131 'success' => true,
132 'data' => $result['data'],
133 'meta' => [
134 'total' => $result['total'],
135 'page' => $result['page'],
136 'per_page' => $result['per_page'],
137 'total_pages' => $result['total_pages'],
138 ],
139 ]);
140 }
141
142 /**
143 * GET /enquiries/{id} - Get single enquiry
144 */
145 public function getEnquiry(WP_REST_Request $request): WP_REST_Response
146 {
147 $id = (int) $request->get_param('id');
148
149 $enquiry = $this->enquiryService->getEnquiry($id);
150
151 if (!$enquiry) {
152 return new WP_REST_Response([
153 'success' => false,
154 'message' => __('Enquiry not found.', 'yatra'),
155 ], 404);
156 }
157
158 return new WP_REST_Response([
159 'success' => true,
160 'data' => $enquiry,
161 ]);
162 }
163
164 /**
165 * POST /enquiries - Create enquiry (public endpoint)
166 */
167 public function createEnquiry(WP_REST_Request $request): WP_REST_Response
168 {
169 $data = $request->get_json_params();
170
171 // Handle both JSON and form data
172 if (empty($data)) {
173 $data = $request->get_params();
174 }
175
176 $result = $this->enquiryService->createEnquiry($data);
177
178 if (!$result['success']) {
179 return new WP_REST_Response($result, 400);
180 }
181
182 return new WP_REST_Response($result, 201);
183 }
184
185 /**
186 * PUT /enquiries/{id} - Update enquiry
187 */
188 public function updateEnquiry(WP_REST_Request $request): WP_REST_Response
189 {
190 $id = (int) $request->get_param('id');
191 $data = $request->get_json_params();
192
193 $result = $this->enquiryService->updateEnquiry($id, $data);
194
195 if (!$result['success']) {
196 return new WP_REST_Response($result, 400);
197 }
198
199 return new WP_REST_Response($result);
200 }
201
202 /**
203 * DELETE /enquiries/{id} - Delete enquiry
204 */
205 public function deleteEnquiry(WP_REST_Request $request): WP_REST_Response
206 {
207 $id = (int) $request->get_param('id');
208
209 $result = $this->enquiryService->deleteEnquiry($id);
210
211 if (!$result['success']) {
212 return new WP_REST_Response($result, 400);
213 }
214
215 return new WP_REST_Response($result);
216 }
217
218 /**
219 * PUT /enquiries/bulk - Bulk actions
220 */
221 public function bulkAction(WP_REST_Request $request): WP_REST_Response
222 {
223 $data = $request->get_json_params();
224 $action = $data['action'] ?? '';
225 $ids = $data['ids'] ?? [];
226
227 if (empty($ids) || !is_array($ids)) {
228 return new WP_REST_Response([
229 'success' => false,
230 'message' => __('No items selected.', 'yatra'),
231 ], 400);
232 }
233
234 switch ($action) {
235 case 'delete':
236 $result = $this->enquiryService->bulkDelete($ids);
237 break;
238
239 case 'mark_read':
240 $result = $this->enquiryService->bulkUpdateStatus($ids, 'read');
241 break;
242
243 case 'mark_pending':
244 $result = $this->enquiryService->bulkUpdateStatus($ids, 'pending');
245 break;
246
247 case 'mark_spam':
248 $result = $this->enquiryService->bulkUpdateStatus($ids, 'spam');
249 break;
250
251 case 'mark_trash':
252 $result = $this->enquiryService->bulkUpdateStatus($ids, 'trash');
253 break;
254
255 case 'archive':
256 $result = $this->enquiryService->bulkUpdateStatus($ids, 'archived');
257 break;
258
259 default:
260 return new WP_REST_Response([
261 'success' => false,
262 'message' => __('Invalid action.', 'yatra'),
263 ], 400);
264 }
265
266 return new WP_REST_Response($result);
267 }
268
269 /**
270 * GET /enquiries/stats - Get statistics
271 */
272 public function getStats(WP_REST_Request $request): WP_REST_Response
273 {
274 $stats = $this->enquiryService->getStats();
275
276 return new WP_REST_Response([
277 'success' => true,
278 'data' => $stats,
279 ]);
280 }
281
282 /**
283 * POST /enquiries/{id}/respond - Respond to enquiry
284 */
285 public function respondToEnquiry(WP_REST_Request $request): WP_REST_Response
286 {
287 $id = (int) $request->get_param('id');
288 $data = $request->get_json_params();
289 $response = $data['response'] ?? '';
290
291 if (empty(trim($response))) {
292 return new WP_REST_Response([
293 'success' => false,
294 'message' => __('Response message is required.', 'yatra'),
295 ], 400);
296 }
297
298 $result = $this->enquiryService->respondToEnquiry($id, $response);
299
300 if (!$result['success']) {
301 return new WP_REST_Response($result, 400);
302 }
303
304 return new WP_REST_Response($result);
305 }
306 }
307