PluginProbe
FluentCart A New Era of eCommerce – Faster, Lighter, and Simpler / 1.6.4
FluentCart A New Era of eCommerce – Faster, Lighter, and Simpler v1.6.4
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 1.3.20 1.3.19 trunk 1.2.0 All 47 releases
fluent-cart / app / Http / Routes / api.php

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

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