PluginProbe
FluentCart A New Era of eCommerce – Faster, Lighter, and Simpler / 1.7.1
FluentCart A New Era of eCommerce – Faster, Lighter, and Simpler v1.7.1
1.7.1 1.7.0 1.6.6 1.6.5 1.6.4 1.6.3 1.6.2 1.6.1 1.6.0 1.5.4 1.5.5 1.5.3 1.5.2 1.5.1 1.5.0 1.4.2 1.4.1 1.4.0 1.3.28 1.3.27 1.3.26 1.3.25 1.3.23 1.3.22 1.3.21 All 51 releases
fluent-cart / app / Http / Routes / api.php

api.php in FluentCart A New Era of eCommerce – Faster, Lighter, and Simpler 1.7.1, at app/Http/Routes/api.php

1,016 lines 43.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php if (!defined('ABSPATH')) exit; ?>
2 <?php
3
4 /**
5 * @var $router Router
6 */
7
8 use FluentCart\App\Http\Controllers\AddonsController;
9 use FluentCart\App\Http\Controllers\AddressInfoController;
10 use FluentCart\App\Http\Controllers\AttributesController;
11 use FluentCart\App\Http\Controllers\AppControllers\AppController;
12 use FluentCart\App\Http\Controllers\CheckoutFieldsController;
13 use FluentCart\App\Http\Controllers\CustomerController;
14 use FluentCart\App\Http\Controllers\DashboardController;
15 use FluentCart\App\Http\Controllers\DataBackfillController;
16 use FluentCart\App\Http\Controllers\EmailNotificationController;
17 use FluentCart\App\Http\Controllers\FileUploadController;
18 use FluentCart\App\Http\Controllers\IntegrationController;
19 use FluentCart\App\Http\Controllers\RenewalController;
20 use FluentCart\App\Http\Controllers\LabelController;
21 use FluentCart\App\Http\Controllers\McpSettingsController;
22 use FluentCart\App\Http\Controllers\ModuleSettingsController;
23 use FluentCart\App\Http\Controllers\NotesController;
24 use FluentCart\App\Http\Controllers\OnboardingController;
25 use FluentCart\App\Http\Controllers\OrderController;
26 use FluentCart\App\Http\Controllers\ProductController;
27 use FluentCart\App\Http\Controllers\ProductDownloadablesController;
28 use FluentCart\App\Http\Controllers\ProductIntegrationsController;
29 use FluentCart\App\Http\Controllers\ProductVariationController;
30 use FluentCart\App\Http\Controllers\StorageController;
31 use FluentCart\App\Http\Controllers\SettingsController;
32 use FluentCart\App\Http\Controllers\CouponsController;
33 use FluentCart\App\Http\Controllers\TaxConfigurationController;
34 use FluentCart\App\Http\Controllers\TaxRateController;
35 use FluentCart\App\Http\Controllers\TemplateController;
36 use FluentCart\App\Http\Controllers\VariantController;
37 use FluentCart\App\Http\Controllers\WidgetsController;
38 use FluentCart\App\Http\Controllers\ProductReviewController;
39 use FluentCart\App\Modules\PaymentMethods\PayPalGateway\ConnectConfig;
40 use FluentCart\Framework\Http\Router;
41 use \FluentCart\App\Http\Controllers\PaymentMethodController;
42 use \FluentCart\App\Http\Controllers\ActivityController;
43 use \FluentCart\App\Http\Controllers\TaxController;
44 use \FluentCart\App\Http\Controllers\TaxEUController;
45
46
47 $router->get('widgets', [WidgetsController::class, '__invoke'])->withPolicy('OrderPolicy')->meta([
48 'permissions' => ['customers/view', 'orders/view'],
49 'permissions_type' => 'any'
50 ]);
51
52 $router->prefix('dashboard')->withPolicy('AdminPolicy')->group(function (Router $router) {
53 $router->get('/', [DashboardController::class, 'getOnboardingData']);
54 });
55
56 $router->prefix('data-backfills')->withPolicy('AdminPolicy')->group(function (Router $router) {
57 $router->post('/run', [DataBackfillController::class, 'run']);
58 });
59
60 $router->prefix('dashboard')->withPolicy('DashboardPolicy')->group(function (Router $router) {
61 $router->get('/stats', [DashboardController::class, 'getDashboardStats'])->meta([
62 'permissions' => 'dashboard_stats/view'
63 ]);
64 });
65 $router->prefix('products')->withPolicy('ProductPolicy')->group(function (Router $router) {
66
67 $router->get('/variants', [ProductVariationController::class, 'index'])->meta([
68 'permissions' => [
69 'products/view',
70 'products/view'
71 ]
72 ]);
73
74 $router->get('/', [ProductController::class, 'index'])->meta([
75 'permissions' => 'products/view'
76 ]);
77
78 $router->get('/get-bundle-info/{productId}', [ProductController::class, 'getBundleInfo'])->meta([
79 'permissions' => 'products/view'
80 ]);
81
82 $router->post('/save-bundle-info/{variationId}', [ProductController::class, 'saveBundleInfo'])->meta([
83 'permissions' => 'products/edit'
84 ]);
85
86 $router->get('/fetch-term', [ProductController::class, 'getProductTermsList'])->meta([
87 'permissions' => 'products/view'
88 ]);
89 $router->get('/searchProductByName', [ProductController::class, 'searchProductByName'])->meta([
90 'permissions' => 'products/view'
91 ]);
92
93 $router->get('/suggest-sku', [ProductController::class, 'suggestSku'])->meta([
94 'permissions' => 'products/view'
95 ]);
96
97 $router->get('/searchVariantByName', [ProductController::class, 'searchVariantByName'])->meta([
98 'permissions' => 'products/view'
99 ]);
100
101 $router->get('/search-product-variant-options', [ProductController::class, 'searchProductVariantOptions'])->meta([
102 'permissions' => 'products/view'
103 ]);
104
105 $router->get('/findSubscriptionVariants', [ProductController::class, 'findSubscriptionVariants'])->meta([
106 'permissions' => 'products/view'
107 ]);
108
109 $router->get('/fetchProductsByIds', [ProductController::class, 'fetchProductsByIds'])->meta([
110 'permissions' => 'products/view'
111 ]);
112 $router->get('/fetchVariationsByIds', [ProductController::class, 'fetchVariationsByIds'])->meta([
113 'permissions' => 'products/view'
114 ]);
115 $router->post('/fetch-term-by-parent', [ProductController::class, 'getProductTermListByParent'])->meta([
116 'permissions' => 'products/view'
117 ]);
118 $router->post('/', [ProductController::class, 'create'])->meta([
119 'permissions' => 'products/create'
120 ]);
121 $router->post('/bulk-insert', [ProductController::class, 'bulkInsert'])->meta([
122 'permissions' => 'products/create'
123 ]);
124 $router->get('/bulk-edit-data', [ProductController::class, 'bulkEditFetch'])->meta([
125 'permissions' => 'products/edit'
126 ]);
127 $router->post('/bulk-update', [ProductController::class, 'bulkUpdate'])->meta([
128 'permissions' => 'products/edit'
129 ]);
130 $router->get('/get-max-excerpt-word-count', [ProductController::class, 'getMaxExcerptWordCount'])->meta([
131 'permissions' => 'products/view'
132 ]);
133 $router->get('/{product}', [ProductController::class, 'find'])->meta([
134 'permissions' => 'products/view'
135 ]);
136 $router->get('/{productId}/related-products', [ProductController::class, 'getRelatedProducts'])->meta([
137 'permissions' => 'products/view'
138 ]);
139 $router->get('/{productId}/pricing', [ProductController::class, 'get'])->meta([
140 'permissions' => 'products/view'
141 ]);
142 $router->post('/{productId}/duplicate', [ProductController::class, 'duplicate'])->meta([
143 'permissions' => 'products/create'
144 ]);
145
146 $router->get('/{id}/upgrade-paths', [ProductController::class, 'getUpgradeSettings'])->int('id')->meta([
147 'permissions' => 'products/view'
148 ]);
149 $router->post('/{id}/upgrade-path', [ProductController::class, 'saveUpgradeSetting'])->int('id')->meta([
150 'permissions' => 'products/edit'
151 ]);
152 $router->post('/upgrade-path/{id}/update', [ProductController::class, 'updateUpgradePath'])->int('id')->meta([
153 'permissions' => 'products/edit'
154 ]);
155 $router->delete('/upgrade-path/{id}/delete', [ProductController::class, 'deleteUpgradePath'])->int('id')->meta([
156 'permissions' => 'products/delete'
157 ]);
158
159 $router->get('/variation/{variantId}/upgrade-paths', [ProductController::class, 'getUpgradePaths'])->int('id')->meta([
160 'permissions' => 'products/view'
161 ]);
162
163 $router->post('/{postId}/pricing', [ProductController::class, 'update'])->meta([
164 'permissions' => 'products/edit'
165 ]);
166
167 $router->post('/{postId}/update-long-desc-editor-mode', [ProductController::class, 'updateLongDescEditorMode'])->meta([
168 'permissions' => 'products/edit'
169 ]);
170 $router->post('/{postId}/tax-class', [ProductController::class, 'updateTaxClass'])->meta([
171 'permissions' => 'products/edit'
172 ]);
173 $router->post('/{postId}/tax-class/remove', [ProductController::class, 'removeTaxClass'])->meta([
174 'permissions' => 'products/edit'
175 ]);
176 $router->post('/{postId}/tax-exempt', [ProductController::class, 'toggleTaxExempt'])->meta([
177 'permissions' => 'products/edit'
178 ]);
179
180 $router->post('/{postId}/shipping-class', [ProductController::class, 'updateShippingClass'])->meta([
181 'permissions' => 'products/edit'
182 ]);
183 $router->post('/{postId}/shipping-class/remove', [ProductController::class, 'removeShippingClass'])->meta([
184 'permissions' => 'products/edit'
185 ]);
186
187 // Stock Management
188 $router->put('/{postId}/update-inventory/{variantId}', [ProductController::class, 'updateInventory'])->meta([
189 'permissions' => 'products/edit'
190 ]);
191 $router->put('/{postId}/update-manage-stock', [ProductController::class, 'updateManageStock'])->meta([
192 'permissions' => 'products/edit'
193 ]);
194
195
196
197 $router->post('/{postId}/sync-downloadable-files', [ProductDownloadablesController::class, 'syncDownloadableFiles'])->meta([
198 'permissions' => 'products/edit'
199 ]);
200 $router->put('/{downloadableId}/update', [ProductDownloadablesController::class, 'update'])->meta([
201 'permissions' => 'products/edit'
202 ]);
203 $router->delete('/{downloadableId}/delete', [ProductDownloadablesController::class, 'delete'])->meta([
204 'permissions' => 'products/delete'
205 ]);
206 $router->get('getDownloadableUrl/{downloadableId}', [ProductDownloadablesController::class, 'getDownloadableUrl'])->meta([
207 'permissions' => 'products/view'
208 ]);
209
210 $router->get('/{productId}/pricing-widgets', [ProductController::class, 'getPricingWidgets'])->meta([
211 'permissions' => 'products/view'
212 ]);
213 $router->post('/{postId}/update-variant-option', [ProductController::class, 'updateVariantOption'])->int('id')->meta([
214 'permissions' => 'products/edit'
215 ]);
216 $router->post('/add-product-terms', [ProductController::class, 'addProductTerms'])->meta([
217 'permissions' => 'products/edit'
218 ]);
219 $router->delete('/{product}', [ProductController::class, 'delete'])->meta([
220 'permissions' => 'products/delete'
221 ]);
222
223 $router->post('/do-bulk-action', [ProductController::class, 'handleBulkActions'])->meta([
224 'permissions' => 'products/edit'
225 ]);
226
227 $router->post('/create-dummy', [ProductController::class, 'createDummyProducts'])->meta([
228 'permissions' => 'products/create'
229 ]);
230
231 $router->post('/sync-taxonomy-term/{postId}', [ProductController::class, 'syncTaxonomyTerms'])->meta([
232 'permissions' => 'products/edit'
233 ]);
234 $router->post('/delete-taxonomy-term/{postId}', [ProductController::class, 'deleteTaxonomyTerms'])->meta([
235 'permissions' => 'products/edit'
236 ]);
237
238 $router->post('/detail/{detailId}', [ProductController::class, 'updateProductDetail'])->meta([
239 'permissions' => 'products/edit'
240 ]);
241
242 $router->post('/variants', [ProductVariationController::class, 'create'])->meta([
243 'permissions' => 'products/create'
244 ]);
245
246 // Advanced Variation — bulk price/stock/status edit for variant combinations.
247 // Registered BEFORE the /variants/{variantId} routes so the first-match
248 // router doesn't capture 'bulk-update' as a {variantId}.
249 $router->post('/variants/bulk-update', [ProductVariationController::class, 'bulkUpdate'])->meta([
250 'permissions' => 'products/edit'
251 ]);
252
253 // Group bulk update — PATCH semantics: only non-null fields are written.
254 // Registered BEFORE /variants/{variantId} to avoid the param capturing 'group-bulk-update'.
255 $router->post('/variants/group-bulk-update', [ProductVariationController::class, 'groupBulkUpdate'])->meta([
256 'permissions' => 'products/edit'
257 ]);
258
259 $router->post('/variants/{variantId}', [ProductVariationController::class, 'update'])->meta([
260 'permissions' => 'products/edit'
261 ]);
262 $router->post('/variants/{variantId}/tax-exempt', [ProductVariationController::class, 'updateTaxSettings'])->meta([
263 'permissions' => 'products/edit'
264 ]);
265
266 $router->delete('/variants/{variantId}', [ProductVariationController::class, 'delete'])->meta([
267 'permissions' => 'products/delete'
268 ]);
269
270 $router->post('/variants/{variantId}/setMedia', [ProductVariationController::class, 'setMedia'])->meta([
271 'permissions' => 'products/edit'
272 ]);
273
274 $router->put('/variants/{variantId}/pricing-table', [ProductVariationController::class, 'updatePricingTable'])->meta([
275 'permissions' => 'products/edit'
276 ]);
277 });
278
279
280 $router->prefix('variants')->withPolicy('ProductPolicy')->group(function (Router $router) {
281 $router->get('/', [VariantController::class, 'index'])->meta([
282 'permissions' => 'products/view'
283 ]);
284 });
285
286 // Advanced Variation — attribute library (groups + terms)
287 $router->prefix('options')->withPolicy('ProductPolicy')->group(function (Router $router) {
288 // Library endpoint — single payload powering the Advanced Variation library
289 // picker (full group list with terms + the frequently-used IDs for chips).
290 // Registered BEFORE 'attr/groups' to ensure the more-specific path wins.
291 $router->get('attr/groups/library', [AttributesController::class, 'getLibrary'])->meta([
292 'permissions' => 'products/view'
293 ]);
294 $router->get('attr/groups', [AttributesController::class, 'getGroups'])->meta([
295 'permissions' => 'products/view'
296 ]);
297 // Plural 'attr/groups/reorder' doesn't collide with the singular
298 // 'attr/group/{group_id}' routes below; kept here next to its list sibling.
299 $router->post('attr/groups/reorder', [AttributesController::class, 'reorderGroups'])->meta([
300 'permissions' => 'products/edit'
301 ]);
302 $router->post('attr/group/', [AttributesController::class, 'createGroup'])->meta([
303 'permissions' => 'products/create'
304 ]);
305 $router->get('attr/group/{group_id}', [AttributesController::class, 'getGroup'])->meta([
306 'permissions' => 'products/view'
307 ]);
308 $router->put('attr/group/{group_id}', [AttributesController::class, 'updateGroup'])->meta([
309 'permissions' => 'products/edit'
310 ]);
311 $router->delete('attr/group/{group_id}', [AttributesController::class, 'deleteGroup'])->meta([
312 'permissions' => 'products/delete'
313 ]);
314 $router->get('attr/group/{group_id}/terms', [AttributesController::class, 'getTerms'])->meta([
315 'permissions' => 'products/view'
316 ]);
317 $router->post('attr/group/{group_id}/terms', [AttributesController::class, 'createTerms'])->meta([
318 'permissions' => 'products/create'
319 ]);
320 $router->post('attr/group/{group_id}/term/{term_id}', [AttributesController::class, 'updateTerm'])->meta([
321 'permissions' => 'products/edit'
322 ]);
323 $router->delete('attr/group/{group_id}/term/{term_id}', [AttributesController::class, 'deleteTerm'])->meta([
324 'permissions' => 'products/delete'
325 ]);
326 $router->post('attr/group/{group_id}/terms/reorder', [AttributesController::class, 'reorderTerms'])->meta([
327 'permissions' => 'products/edit'
328 ]);
329 });
330
331 //Integration route declaration
332 $router->prefix('integration')->withPolicy('IntegrationPolicy')->group(function (Router $router) {
333
334 $router->get('addons', [AddonsController::class, 'getAddons'])->meta([
335 'permissions' => 'integrations/view'
336 ]);
337
338 $router->get('global-settings', [IntegrationController::class, 'getGlobalSettings'])->meta([
339 'permissions' => 'integrations/view'
340 ]);
341
342 $router->post('global-settings', [IntegrationController::class, 'setGlobalSettings'])->meta([
343 'permissions' => 'integrations/manage'
344 ]);
345
346 $router->get('global-feeds', [IntegrationController::class, 'getFeeds'])->meta([
347 'permissions' => 'integrations/view'
348 ]);
349
350 $router->post('global-feeds/change-status/{integration_id}', [IntegrationController::class, 'changeStatus'])->int('integration_id')->meta([
351 'permissions' => 'integrations/manage'
352 ]);
353
354 $router->delete('global-feeds/{integration_id}', [IntegrationController::class, 'deleteSettings'])->int('integration_id')->meta([
355 'permissions' => 'integrations/delete'
356 ]);
357
358 // For product specific integration feed editor. New or existing integration
359 $router->get('global-feeds/settings', [IntegrationController::class, 'getSettings'])->meta([
360 'permissions' => 'integrations/view'
361 ]);
362
363 // For integration feed editor. For new or existing integration
364 $router->post('global-feeds/settings', [IntegrationController::class, 'saveSettings'])->meta([
365 'permissions' => 'integrations/manage'
366 ]);
367
368 $router->get('feed/lists', [IntegrationController::class, 'lists'])->meta([
369 'permissions' => 'integrations/view'
370 ]);
371
372
373 $router->get('feed/dynamic_options', [IntegrationController::class, 'getDynamicOptions'])->meta([
374 'permissions' => 'integrations/view'
375 ]);
376
377 $router->post('feed/chained', [IntegrationController::class, 'chained'])->meta([
378 'permissions' => 'integrations/manage'
379 ]);
380
381 $router->post('feed/install-plugin', [AddonsController::class, 'installAndActivate'])->meta([
382 'permissions' => 'integrations/manage'
383 ]);
384
385 });
386
387 //End integration route declaration
388
389 $router->post('settings/payment-methods/paypal/seller-auth-token', [ConnectConfig::class, 'getSellerAuthToken'])->withPolicy('AdminPolicy')->meta([
390 'permissions' => 'super_admin'
391 ]);
392
393 $router->post('settings/payment-methods/paypal/webhook/setup', [PaymentMethodController::class, 'setPayPalWebhook'])->withPolicy('AdminPolicy')->meta([
394 'permissions' => 'super_admin'
395 ]);
396 $router->get('settings/payment-methods/paypal/webhook/check', [PaymentMethodController::class, 'checkPayPalWebhook'])->withPolicy('AdminPolicy')->meta([
397 'permissions' => 'super_admin'
398 ]);
399
400
401 $router->prefix('settings/')
402 ->withPolicy('StoreSettingsPolicy')
403 ->group(function (Router $router) {
404
405 $router->get('payment-methods', [PaymentMethodController::class, 'getSettings'])->meta([
406 'permissions' => 'is_super_admin'
407 ]);
408 $router->post('payment-methods', [PaymentMethodController::class, 'store'])->meta([
409 'permissions' => 'is_super_admin'
410 ]);
411 $router->get('payment-methods/all', [PaymentMethodController::class, 'index'])->meta([
412 'permissions' => 'is_super_admin'
413 ]);
414
415 $router->post('payment-methods/reorder', [PaymentMethodController::class, 'reorder'])->meta([
416 'permissions' => 'is_super_admin'
417 ]);
418
419 $router->get('payment-methods/connect/info', [PaymentMethodController::class, 'connectInfo'])->meta([
420 'permissions' => 'is_super_admin'
421 ]);
422 $router->post('payment-methods/disconnect', [PaymentMethodController::class, 'disconnect'])->meta([
423 'permissions' => 'is_super_admin'
424 ]);
425
426 $router->post('payment-methods/design', [PaymentMethodController::class, 'saveDesign'])->meta([
427 'permissions' => 'is_super_admin'
428 ]);
429
430 $router->post('payment-methods/install-addon', [PaymentMethodController::class, 'installAddon'])->meta([
431 'permissions' => 'is_super_admin'
432 ]);
433
434 $router->post('payment-methods/activate-addon', [PaymentMethodController::class, 'activateAddon'])->meta([
435 'permissions' => 'is_super_admin'
436 ]);
437
438 // permissions get and store
439
440 $router->get('/permissions', [SettingsController::class, 'getPermissions'])
441 ->meta([
442 'permissions' => 'is_super_admin'
443 ]);
444
445 $router->post('/permissions', 'SettingsController@savePermissions')->meta([
446 'permissions' => 'is_super_admin'
447 ]);;
448
449
450 $router->get('/store', [SettingsController::class, 'getStore'])
451 ->meta([
452 'permissions' => 'store/settings'
453 ]);
454 $router->post('/store', [SettingsController::class, 'saveStore'])
455 ->meta([
456 'permissions' => 'store/settings'
457 ]);
458
459
460 // Plugin addon management routes (must be before generic modules/ routes)
461 // PDF Template routes are registered by FluentCart Pro plugin
462
463 $router->get('modules/plugin-addons', [ModuleSettingsController::class, 'getPluginAddons'])->meta([
464 'permissions' => 'is_super_admin'
465 ]);
466 $router->post('modules/plugin-addons/install', [ModuleSettingsController::class, 'installPluginAddon'])->meta([
467 'permissions' => 'is_super_admin'
468 ]);
469 $router->post('modules/plugin-addons/activate', [ModuleSettingsController::class, 'activatePluginAddon'])->meta([
470 'permissions' => 'is_super_admin'
471 ]);
472 $router->post('modules/turnstile/verify', [ModuleSettingsController::class, 'verifyTurnstileKeys'])->meta([
473 'permissions' => 'is_super_admin'
474 ]);
475 $router->get('modules', [ModuleSettingsController::class, 'getSettings'])->meta([
476 'permissions' => 'is_super_admin'
477 ]);
478 $router->post('modules', [ModuleSettingsController::class, 'saveSettings'])->meta([
479 'permissions' => 'is_super_admin'
480 ]);
481
482 // MCP (Features & addon → MCP card): status, on/off toggle, connection snippet.
483 $router->get('mcp', [McpSettingsController::class, 'status'])->meta([
484 'permissions' => 'is_super_admin'
485 ]);
486 $router->post('mcp/toggle', [McpSettingsController::class, 'toggle'])->meta([
487 'permissions' => 'is_super_admin'
488 ]);
489 $router->post('mcp/install-adapter', [McpSettingsController::class, 'installAdapter'])->meta([
490 'permissions' => 'is_super_admin'
491 ]);
492 $router->get('mcp/config-snippets', [McpSettingsController::class, 'getConfigSnippets'])->meta([
493 'permissions' => 'is_super_admin'
494 ]);
495
496
497 $router->post('confirmation', [SettingsController::class, 'saveConfirmation'])->meta([
498 'permissions' => 'is_super_admin'
499 ]);
500 //shortcode get
501 $router->get('confirmation/shortcode', [SettingsController::class, 'getShortcode'])->meta([
502 'permissions' => 'is_super_admin'
503 ]);
504
505
506 $router->get('storage-drivers', [StorageController::class, 'index'])->meta([
507 'permissions' => 'is_super_admin'
508 ]);
509 $router->post('storage-drivers', [StorageController::class, 'store'])->meta([
510 'permissions' => 'is_super_admin'
511 ]);
512 $router->get('storage-drivers/active-drivers', [StorageController::class, 'getActiveDrivers'])->meta([
513 'permissions' => 'is_super_admin'
514 ]);
515 $router->get('storage-drivers/{driver}', [StorageController::class, 'getSettings'])->meta([
516 'permissions' => 'is_super_admin'
517 ]);
518 $router->post('storage-drivers/verify-info', [StorageController::class, 'verifyConnectInfo'])->meta([
519 'permissions' => 'is_super_admin'
520 ]);
521 $router->post('storage-drivers/create-bucket', [StorageController::class, 'createBucket'])->meta([
522 'permissions' => 'is_super_admin'
523 ]);
524 $router->post('storage-drivers/bucket-list', [StorageController::class, 'listBuckets'])->meta([
525 'permissions' => 'is_super_admin'
526 ]);
527 $router->post('storage-drivers/reset', [StorageController::class, 'resetSettings'])->meta([
528 'permissions' => 'is_super_admin'
529 ]);
530 $router->post('storage-drivers/change-status', [StorageController::class, 'changeStatus'])->meta([
531 'permissions' => 'is_super_admin'
532 ]);
533
534
535 });
536
537 $router->prefix('orders')->withPolicy('OrderPolicy')->group(function (Router $router) {
538 $router->get('/', [OrderController::class, 'index'])->meta([
539 'permissions' => 'orders/view'
540 ]);
541
542 $router->post('/calculate-shipping', [OrderController::class, 'updateShipping'])->meta([
543 'permissions' => ['orders/create', 'orders/manage']
544 ]);
545
546 // Public utility: pure tax calculation, no DB writes. No longer called by the admin Vue
547 // (tax is now auto-applied server-side on save). Available for third-party integrations.
548 $router->post('/calculate-tax', [OrderController::class, 'calculateTax'])->meta([
549 'permissions' => ['orders/create', 'orders/manage'],
550 'permissions_type' => 'any',
551 ]);
552
553 $router->post('/', [OrderController::class, 'store'])->meta([
554 'permissions' => 'orders/create'
555 ]);
556
557 $router->post('/do-bulk-action', [OrderController::class, 'handleBulkActions'])->meta([
558 'permissions' => 'orders/delete' // every accepted action deletes orders — same gate as DELETE /{order_id}
559 ]);
560
561 $router->post('/{order}/mark-as-paid', [OrderController::class, 'markAsPaid'])->meta([
562 'permissions' => 'orders/manage'
563 ]);
564
565 $router->post('/{order}/generate-missing-licenses', [OrderController::class, 'generateMissingLicenses'])->meta([
566 'permissions' => 'orders/manage'
567 ]);
568
569 $router->get('/{order_id}', [OrderController::class, 'getDetails'])->int('order_id')->meta([
570 'permissions' => 'orders/view'
571 ]);
572
573 $router->post('/{order_id}', [OrderController::class, 'updateOrder'])
574 ->int('order_id')
575 ->meta([
576 'permissions' => 'orders/manage'
577 ]);
578
579 $router->post('/{order_id}/update-address-id', [OrderController::class, 'updateOrderAddressId'])
580 ->int('order_id')
581 ->meta([
582 'permissions' => 'orders/manage'
583 ]);
584
585 $router->post('/{order_id}/refund', [OrderController::class, 'refundOrder'])
586 ->int('order_id')
587 ->meta([
588 'permissions' => 'orders/can_refund'
589 ]);
590
591 $router->post('/{order_id}/change-customer', [OrderController::class, 'changeCustomer'])->int('order_id')->meta([
592 'permissions' => 'orders/manage'
593 ]);
594
595 $router->post('/{order_id}/create-and-change-customer', [OrderController::class, 'createAndChangeCustomer'])->meta([
596 'permissions' => 'orders/manage'
597 ])->int('order_id');
598
599 $router->delete('/{order_id}', [OrderController::class, 'deleteOrder'])->meta([
600 'permissions' => 'orders/delete'
601 ])->int('order_id');
602
603 $router->put('/{order}/statuses', [OrderController::class, 'updateStatuses'])->meta([
604 'permissions' => 'orders/manage_statuses'
605 ]);
606
607 $router->get('/{order}/transactions', [OrderController::class, 'getDetails'])->meta([
608 'permissions' => 'orders/view'
609 ]);
610
611 $router->post('/{order}/transactions/{transaction_id}/accept-dispute/', [OrderController::class, 'acceptDispute'])->meta([
612 'permissions' => 'orders/manage'
613 ]);
614
615 $router->get('/{id}/transactions/{transaction_id}', [OrderController::class, 'getTransactionDetails'])
616 ->int('id', 'transaction_id')
617 ->meta([
618 'permissions' => 'orders/view'
619 ]);
620
621 $router->put('/{order}/address/{id}', [OrderController::class, 'updateOrderAddress'])->meta([
622 'permissions' => 'orders/manage'
623 ]);
624
625 $router->put('/{order}/transactions/{transaction}/status', [OrderController::class, 'updateTransactionStatus'])->meta([
626 'permissions' => 'orders/manage'
627 ]);
628
629 $router->post('/{order}/transactions/{transaction}/sync', [OrderController::class, 'syncPendingTransaction'])->meta([
630 'permissions' => 'orders/manage'
631 ]);
632
633 $router->post('/{order}/create-custom', [OrderController::class, 'createCustom'])->int('id')->meta([
634 'permissions' => 'orders/create'
635 ]);
636
637 $router->get('/shipping_methods', [OrderController::class, 'getShippingMethods'])->meta([
638 'permissions' => 'orders/manage'
639 ]);
640
641 $router->put('/{order}/sync-statuses', [OrderController::class, 'syncOrderStatuses'])->meta([
642 'permissions' => 'orders/manage'
643 ]);
644
645 });
646
647 $router->prefix('renewals')->withPolicy('OrderPolicy')->group(function (Router $router) {
648 $router->get('/', [RenewalController::class, 'index'])->meta([
649 'permissions' => 'orders/view'
650 ]);
651
652 $router->get('/{id}', [RenewalController::class, 'show'])->int('id')->meta([
653 'permissions' => 'orders/view'
654 ]);
655
656 $router->post('/{order}/void', [RenewalController::class, 'void'])->meta([
657 'permissions' => 'orders/manage'
658 ]);
659
660 $router->post('/{order}/resend', [RenewalController::class, 'resend'])->meta([
661 'permissions' => 'orders/manage'
662 ]);
663 });
664
665 $router->prefix('labels')->withPolicy('LabelPolicy')->group(function (Router $router) {
666 $router->get('/', [LabelController::class, 'index'])->meta([
667 'permissions' => 'labels/view'
668 ]);
669 $router->post('/', [LabelController::class, 'create'])->meta([
670 'permissions' => 'labels/manage'
671 ]);
672 $router->post('/update-label-selections', [LabelController::class, 'updateSelections'])->meta([
673 'permissions' => 'labels/manage'
674 ]);
675 });
676
677 $router->prefix('customers')->withPolicy('CustomerPolicy')->group(function (Router $router) {
678 $router->get('/', [CustomerController::class, 'index'])->meta([
679 'permissions' => 'customers/view'
680 ]);
681
682 $router->post('/', [CustomerController::class, 'store'])->meta([
683 'permissions' => 'customers/manage'
684 ]);
685
686 $router->get('/get-stats/{customer}', [CustomerController::class, 'getStats'])->meta([
687 'permissions' => 'customers/view'
688 ]);
689
690 $router->get('/attachable-user', [CustomerController::class, 'getAttachableUser'])->meta([
691 'permissions' => 'customers/manage'
692 ]);
693
694 $router->post('/{customerId}/attachable-user', [CustomerController::class, 'setAttachableUser'])->meta([
695 'permissions' => 'customers/manage'
696 ]);
697
698 $router->post('/{customerId}/detach-user', [CustomerController::class, 'detachCustomer'])->meta([
699 'permissions' => 'customers/manage'
700 ]);
701
702 $router->get('/{customerId}', [CustomerController::class, 'find'])->int('customerId')->meta([
703 'permissions' => 'customers/view'
704 ]);
705
706 $router->get('/{customerId}/order', [CustomerController::class, 'findOrder'])->int('customerId')->meta([
707 'permissions' => 'customers/view'
708 ]);
709
710 $router->put('/{customerId}', [CustomerController::class, 'update'])->meta([
711 'permissions' => 'customers/manage'
712 ]);
713
714 $router->put('/{customerId}/additional-info', [CustomerController::class, 'updateAdditionalInfo'])->meta([
715 'permissions' => 'customers/manage'
716 ]);
717
718 $router->post('/do-bulk-action', [CustomerController::class, 'handleBulkActions'])->meta([
719 'permissions' => 'customers/manage'
720 ]);
721
722 $router->get('/{customerId}/orders', [CustomerController::class, 'getCustomerOrders'])->meta([
723 'permissions' => 'customers/view'
724 ]);
725
726 $router->get('/{customerId}/address', [CustomerController::class, 'getAddress'])->meta([
727 'permissions' => 'customers/view'
728 ]);
729
730 $router->put('/{customerId}/address', [CustomerController::class, 'updateAddress'])->meta([
731 'permissions' => 'customers/manage'
732 ]);
733
734 $router->post('/{customerId}/address', [CustomerController::class, 'createAddress'])->meta([
735 'permissions' => 'customers/manage'
736 ]);
737
738 $router->delete('/{customerId}/address', [CustomerController::class, 'removeAddress'])->meta([
739 'permissions' => 'customers/delete'
740 ]);
741
742 $router->post('/{customerId}/address/make-primary', [CustomerController::class, 'setAddressPrimary'])->meta([
743 'permissions' => 'customers/manage'
744 ]);
745
746 $router->post('/{customerId}/recalculate-ltv', [CustomerController::class, 'recalculateLtv'])->int('customerId')->meta([
747 'permissions' => 'customers/manage'
748 ]);
749
750 });
751
752
753
754 $router->prefix('onboarding')->withPolicy('AdminPolicy')->group(function (Router $router) {
755 $router->get('/', [OnboardingController::class, 'index']);
756 $router->post('/', [OnboardingController::class, 'saveSettings']);
757 $router->post('/create-pages', [OnboardingController::class, 'createPages']);
758 $router->post('/create-page', [OnboardingController::class, 'createPage']);
759 $router->post('/save-tax', [OnboardingController::class, 'saveTaxSettings']);
760 });
761 $router->prefix('email-notification')->withPolicy('StoreSensitivePolicy')->group(function (Router $router) {
762 $router->get('/', [EmailNotificationController::class, 'index']);
763 $router->get('/get-short-codes', [EmailNotificationController::class, 'getShortCodes']);
764 $router->get('/get-settings', [EmailNotificationController::class, 'getSettings']);
765 $router->post('/save-settings', [EmailNotificationController::class, 'saveSettings']);
766 $router->get('/reminders', [EmailNotificationController::class, 'getSchedulingSettings']);
767 $router->post('/reminders', [EmailNotificationController::class, 'saveSchedulingSettings']);
768 $router->get('/digest-settings', [EmailNotificationController::class, 'getDigestSettings']);
769 $router->post('/digest-settings', [EmailNotificationController::class, 'saveDigestSettings']);
770 $router->post('/digest-settings/send-test', [EmailNotificationController::class, 'sendDigestTest']);
771 $router->post('/enable-notification/{name}', [EmailNotificationController::class, 'enableNotification']);
772 $router->post('/send-manual-reminder', [EmailNotificationController::class, 'sendManualReminder']);
773 $router->post('/preview-default-template', [EmailNotificationController::class, 'previewDefaultTemplate']);
774 $router->get('/{notification}', [EmailNotificationController::class, 'find']);
775 $router->put('/{notification}', [EmailNotificationController::class, 'update']);
776
777 });
778
779 $router->prefix('templates')->withPolicy('AdminPolicy')->group(function (Router $router) {
780 $router->get('/print-templates', [TemplateController::class, 'getPrintTemplates']);
781 $router->put('/print-templates', [TemplateController::class, 'savePrintTemplates']);
782 });
783
784
785 $router->prefix('coupons')->withPolicy('CouponPolicy')->group(function ($router) {
786 $router->get('/listCoupons', [CouponsController::class, 'listCoupons'])->meta([
787 'permissions' => ['orders/create', 'orders/manage', 'coupons/view']
788 ]);
789
790 $router->get('/', [CouponsController::class, 'index'])->meta([
791 'permissions' => 'coupons/view'
792 ]);
793 $router->get('/getSettings', [CouponsController::class, 'getSettings'])->meta([
794 'permissions' => 'coupons/view'
795 ]);
796 $router->get('/{id}', [CouponsController::class, 'viewDetails'])->meta([
797 'permissions' => 'coupons/view'
798 ]);
799 $router->post('/', [CouponsController::class, 'create'])->meta([
800 'permissions' => 'coupons/manage'
801 ]);
802 $router->put('/{id}', [CouponsController::class, 'update'])->meta([
803 'permissions' => 'coupons/manage'
804 ]);
805 $router->delete('/{id}', [CouponsController::class, 'delete'])->meta([
806 'permissions' => 'coupons/delete'
807 ]);
808 $router->post('/apply', [CouponsController::class, 'applyCoupon'])->meta([
809 'permissions' => ['orders/create', 'orders/manage'],
810 ]);
811 // $router->post('/apply', [CouponsController::class, 'calculateFinalAmount']);
812 $router->post('/cancel', [CouponsController::class, 'cancelCoupon'])->meta([
813 'permissions' => ['orders/create', 'orders/manage'],
814 ]);
815
816 $router->post('/re-apply', [CouponsController::class, 'reapplyCoupon'])->meta([
817 'permissions' => ['orders/create', 'orders/manage'],
818 ]);
819
820 $router->post('/checkProductEligibility', [CouponsController::class, 'isProductEligible'])->meta([
821 'permissions' => ['orders/create', 'orders/manage'],
822 ]);
823
824 $router->post('/storeCouponSettings', [CouponsController::class, 'storeCouponSettings'])->meta([
825 'permissions' => 'coupons/manage'
826 ]);
827 });
828
829 $router->prefix('files')->withPolicy('StoreSensitivePolicy')->group(function (Router $router) {
830 $router->get('/', [FileUploadController::class, 'index']);
831 $router->post('/upload', [FileUploadController::class, 'upload']);
832 $router->get('/bucket-list', [FileUploadController::class, 'getBucketList']);
833 $router->delete('/delete', [FileUploadController::class, 'deleteFile']);
834 });
835
836 $router->post('/upload-editor-file', [FileUploadController::class, 'uploadEditorFile'])->withPolicy('AdminPolicy');
837
838 $router->prefix('notes')->withPolicy('OrderPolicy')->group(function (Router $router) {
839 $router->post('/attach', [NotesController::class, 'attach'])->meta(['permissions' => 'orders/manage']);
840 });
841
842 $router->prefix('app')->withPolicy('AdminPolicy')->group(function (Router $router) {
843 $router->get('init', [AppController::class, 'init']);
844 $router->get('attachments', [AppController::class, 'attachments']);
845 $router->post('upload-attachments', [AppController::class, 'uploadAttachments']);
846 });
847
848 $router->prefix('activity')->withPolicy('AdminPolicy')->group(function (Router $router) {
849 $router->get('/', [ActivityController::class, 'index']);
850 $router->delete('/{id}', [ActivityController::class, 'delete']);
851 $router->put('/{id}/mark-read', [ActivityController::class, 'markReadUnread']);
852 });
853
854 $router->prefix('taxes')->withPolicy('AdminPolicy')->group(function (Router $router) {
855 $router->get('/', [TaxController::class, 'index']);
856 $router->post('/', [TaxController::class, 'markAsFiled']);
857 });
858
859 $router->prefix('address-info')->withPolicy('UserPolicy')->group(function ($router) {
860 $router->get('/countries', [AddressInfoController::class, 'countriesOption']);
861 $router->get('/get-country-info', [AddressInfoController::class, 'getCountryInfo']);
862 });
863
864 // Add these new routes for product-specific integration settings
865 $router->prefix('products')->withPolicy('ProductPolicy')->group(function (Router $router) {
866 // New routes for product integrations
867 $router->get('/{product_id}/integrations/{integration_name}/settings', [ProductIntegrationsController::class, 'getProductIntegrationSettings'])->meta([
868 'permissions' => 'products/view'
869 ]);
870
871 $router->post('/{product_id}/integrations', [ProductIntegrationsController::class, 'saveProductIntegration'])->meta([
872 'permissions' => 'products/edit'
873 ]);
874
875 $router->delete('/{product_id}/integrations/{integration_id}', [ProductIntegrationsController::class, 'deleteProductIntegration'])->meta([
876 'permissions' => 'products/delete'
877 ]);
878
879 $router->post('/{product_id}/integrations/feed/change-status', [ProductIntegrationsController::class, 'changeStatus'])->meta([
880 'permissions' => 'products/edit'
881 ]);
882
883 $router->get('/{productId}/integrations', [ProductIntegrationsController::class, 'getFeeds'])->meta([
884 'permissions' => 'products/view'
885 ]);
886
887 });
888
889
890 // Tax Routes
891 $router->prefix('tax')->withPolicy('StoreSettingsPolicy')->group(function (Router $router) {
892 // TaxClass routes
893 $router->get('classes', [TaxRateController::class, 'getClasses'])->meta([
894 'permissions' => 'store/settings'
895 ]);
896 $router->post('classes', [TaxRateController::class, 'createClass'])->meta([
897 'permissions' => 'store/sensitive'
898 ]);
899 $router->delete('classes/{id}', [TaxRateController::class, 'deleteClass'])->int('id')->meta([
900 'permissions' => 'store/sensitive'
901 ]);
902
903 // TaxRates routes
904 $router->get('rates', [TaxRateController::class, 'index'])->meta([
905 'permissions' => 'store/settings'
906 ]);
907 $router->get('rates/country/rates/{country_code}', [TaxRateController::class, 'show'])->meta([
908 'permissions' => 'store/settings'
909 ]);
910 $router->post('rates/country/override', [TaxRateController::class, 'saveShippingOverride'])->meta([
911 'permissions' => 'store/sensitive'
912 ]);
913 $router->delete('rates/country/override/{id}', [TaxRateController::class, 'deleteShippingOverride'])->int('id')->meta([
914 'permissions' => 'store/sensitive'
915 ]);
916 $router->put('country/rate/{id}', [TaxRateController::class, 'update'])->int('id')->meta([
917 'permissions' => 'store/sensitive'
918 ]);
919 $router->post('country/rate', [TaxRateController::class, 'store'])->meta([
920 'permissions' => 'store/sensitive'
921 ]);
922 $router->delete('country/rate/{id}', [TaxRateController::class, 'delete'])->int('id')->meta([
923 'permissions' => 'store/sensitive'
924 ]);
925 $router->post('country-status/{country_code}', [TaxRateController::class, 'updateCountryStatus'])->meta([
926 'permissions' => 'store/sensitive'
927 ]);
928 $router->get('country-tax-id/{country_code}', [TaxRateController::class, 'getCountryTaxId'])->meta([
929 'permissions' => 'store/settings'
930 ]);
931 $router->post('country-tax-id/{country_code}', [TaxRateController::class, 'saveCountryTaxId'])->meta([
932 'permissions' => 'store/sensitive'
933 ]);
934
935 // Product category tax overrides
936 $router->get('product-overrides/{country_code}', [TaxRateController::class, 'getProductOverrides'])->meta([
937 'permissions' => 'store/settings'
938 ]);
939 $router->post('product-overrides', [TaxRateController::class, 'saveProductOverride'])->meta([
940 'permissions' => 'store/sensitive'
941 ]);
942 $router->delete('product-overrides/{id}', [TaxRateController::class, 'deleteProductOverride'])->int('id')->meta([
943 'permissions' => 'store/sensitive'
944 ]);
945
946 // $router->post('rates/country', [TaxRateController::class, 'addCountry']);
947
948 // TaxConfiguration routes
949 $router->get('configuration/rates', [TaxConfigurationController::class, 'getTaxRates'])->meta([
950 'permissions' => 'store/settings'
951 ]);
952 $router->post('configuration/countries', [TaxConfigurationController::class, 'saveConfiguredCountries'])->meta([
953 'permissions' => 'store/sensitive'
954 ]);
955 $router->get('configuration/settings', [TaxConfigurationController::class, 'getSettings'])->meta([
956 'permissions' => 'store/settings'
957 ]);
958 $router->post('configuration/settings', [TaxConfigurationController::class, 'saveSettings'])->meta([
959 'permissions' => 'store/sensitive'
960 ]);
961 $router->post('configuration/settings/eu-vat', [TaxEUController::class, 'saveEuVatSettings'])->meta([
962 'permissions' => 'store/sensitive'
963 ]);
964 $router->post('configuration/settings/eu-vat/reset-rates', [TaxEUController::class, 'resetEuRatesToDefaults'])->meta([
965 'permissions' => 'store/sensitive'
966 ]);
967 $router->get('configuration/settings/eu-vat/product-overrides', [TaxEUController::class, 'getEuProductOverrides'])->meta([
968 'permissions' => 'store/settings'
969 ]);
970 $router->get('configuration/settings/eu-vat/oss-rates', [TaxEUController::class, 'getOssCountryRates'])->meta([
971 'permissions' => 'store/settings'
972 ]);
973 $router->post('configuration/settings/eu-vat/oss-rates', [TaxEUController::class, 'saveOssCountryRates'])->meta([
974 'permissions' => 'store/sensitive'
975 ]);
976 });
977
978 $router->prefix('checkout-fields')->withPolicy('StoreSensitivePolicy')->group(function (Router $router) {
979 $router->get('get-fields', [CheckoutFieldsController::class, 'getFields']);
980 $router->post('save-fields', [CheckoutFieldsController::class, 'saveFields']);
981 });
982
983 // Product Reviews routes
984 $router->prefix('reviews')->withPolicy('ReviewPolicy')->group(function (Router $router) {
985 $router->get('/', [ProductReviewController::class, 'index'])->meta([
986 'permissions' => 'reviews/manage'
987 ]);
988 $router->get('/stats', [ProductReviewController::class, 'stats'])->meta([
989 'permissions' => 'reviews/manage'
990 ]);
991 $router->get('/{id}', [ProductReviewController::class, 'find'])->int('id')->meta([
992 'permissions' => 'reviews/manage'
993 ]);
994 $router->put('/{id}', [ProductReviewController::class, 'update'])->int('id')->meta([
995 'permissions' => 'reviews/manage'
996 ]);
997 $router->delete('/{id}', [ProductReviewController::class, 'delete'])->int('id')->meta([
998 'permissions' => 'reviews/manage'
999 ]);
1000 $router->post('/bulk-action', [ProductReviewController::class, 'bulkAction'])->meta([
1001 'permissions' => 'reviews/manage'
1002 ]);
1003 $router->post('/{id}/reply', [ProductReviewController::class, 'reply'])->int('id')->meta([
1004 'permissions' => 'reviews/manage'
1005 ]);
1006 $router->delete('/{reviewId}/replies/{replyId}', [ProductReviewController::class, 'deleteReply'])->int('reviewId')->int('replyId')->meta([
1007 'permissions' => 'reviews/manage'
1008 ]);
1009 $router->post('/bulk-reply', [ProductReviewController::class, 'bulkReply'])->meta([
1010 'permissions' => 'reviews/manage'
1011 ]);
1012 $router->post('/', [ProductReviewController::class, 'create'])->meta([
1013 'permissions' => 'reviews/manage'
1014 ]);
1015 });
1016