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

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

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