PluginProbe
FluentCart A New Era of eCommerce – Faster, Lighter, and Simpler / 1.7.0
FluentCart A New Era of eCommerce – Faster, Lighter, and Simpler v1.7.0
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 1.3.20 All 50 releases
← All changes | app/Http/Routes/api.php +253 -76 1.3.20 → 1.7.0 View file →
@@ -6,17 +6,20 @@
6 6 */
7 7
8 8 use FluentCart\App\Http\Controllers\AddonsController;
9 9 use FluentCart\App\Http\Controllers\AddressInfoController;
10 +use FluentCart\App\Http\Controllers\AttributesController;
10 11 use FluentCart\App\Http\Controllers\AppControllers\AppController;
11 -use FluentCart\App\Http\Controllers\AttributesController;
12 12 use FluentCart\App\Http\Controllers\CheckoutFieldsController;
13 13 use FluentCart\App\Http\Controllers\CustomerController;
14 14 use FluentCart\App\Http\Controllers\DashboardController;
15 +use FluentCart\App\Http\Controllers\DataBackfillController;
15 16 use FluentCart\App\Http\Controllers\EmailNotificationController;
16 17 use FluentCart\App\Http\Controllers\FileUploadController;
17 18 use FluentCart\App\Http\Controllers\IntegrationController;
19 +use FluentCart\App\Http\Controllers\RenewalController;
18 20 use FluentCart\App\Http\Controllers\LabelController;
21 +use FluentCart\App\Http\Controllers\McpSettingsController;
19 22 use FluentCart\App\Http\Controllers\ModuleSettingsController;
20 23 use FluentCart\App\Http\Controllers\NotesController;
21 24 use FluentCart\App\Http\Controllers\OnboardingController;
22 25 use FluentCart\App\Http\Controllers\OrderController;
@@ -26,14 +29,14 @@
26 29 use FluentCart\App\Http\Controllers\ProductVariationController;
27 30 use FluentCart\App\Http\Controllers\StorageController;
28 31 use FluentCart\App\Http\Controllers\SettingsController;
29 32 use FluentCart\App\Http\Controllers\CouponsController;
30 -use FluentCart\App\Http\Controllers\TaxClassController;
31 33 use FluentCart\App\Http\Controllers\TaxConfigurationController;
32 34 use FluentCart\App\Http\Controllers\TaxRateController;
33 35 use FluentCart\App\Http\Controllers\TemplateController;
34 36 use FluentCart\App\Http\Controllers\VariantController;
35 37 use FluentCart\App\Http\Controllers\WidgetsController;
38 +use FluentCart\App\Http\Controllers\ProductReviewController;
36 39 use FluentCart\App\Modules\PaymentMethods\PayPalGateway\ConnectConfig;
37 40 use FluentCart\Framework\Http\Router;
38 41 use \FluentCart\App\Http\Controllers\PaymentMethodController;
39 42 use \FluentCart\App\Http\Controllers\ActivityController;
@@ -49,8 +52,12 @@
49 52 $router->prefix('dashboard')->withPolicy('AdminPolicy')->group(function (Router $router) {
50 53 $router->get('/', [DashboardController::class, 'getOnboardingData']);
51 54 });
52 55
56 +$router->prefix('data-backfills')->withPolicy('AdminPolicy')->group(function (Router $router) {
57 + $router->post('/run', [DataBackfillController::class, 'run']);
58 +});
59 +
53 60 $router->prefix('dashboard')->withPolicy('DashboardPolicy')->group(function (Router $router) {
54 61 $router->get('/stats', [DashboardController::class, 'getDashboardStats'])->meta([
55 62 'permissions' => 'dashboard_stats/view'
56 63 ]);
@@ -165,8 +172,11 @@
165 172 ]);
166 173 $router->post('/{postId}/tax-class/remove', [ProductController::class, 'removeTaxClass'])->meta([
167 174 'permissions' => 'products/edit'
168 175 ]);
176 + $router->post('/{postId}/tax-exempt', [ProductController::class, 'toggleTaxExempt'])->meta([
177 + 'permissions' => 'products/edit'
178 + ]);
169 179
170 180 $router->post('/{postId}/shipping-class', [ProductController::class, 'updateShippingClass'])->meta([
171 181 'permissions' => 'products/edit'
172 182 ]);
@@ -232,11 +242,27 @@
232 242 $router->post('/variants', [ProductVariationController::class, 'create'])->meta([
233 243 'permissions' => 'products/create'
234 244 ]);
235 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 +
236 259 $router->post('/variants/{variantId}', [ProductVariationController::class, 'update'])->meta([
237 260 'permissions' => 'products/edit'
238 261 ]);
262 + $router->post('/variants/{variantId}/tax-exempt', [ProductVariationController::class, 'updateTaxSettings'])->meta([
263 + 'permissions' => 'products/edit'
264 + ]);
239 265
240 266 $router->delete('/variants/{variantId}', [ProductVariationController::class, 'delete'])->meta([
241 267 'permissions' => 'products/delete'
242 268 ]);
@@ -255,8 +281,54 @@
255 281 $router->get('/', [VariantController::class, 'index'])->meta([
256 282 'permissions' => 'products/view'
257 283 ]);
258 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 +
259 331 //Integration route declaration
260 332 $router->prefix('integration')->withPolicy('IntegrationPolicy')->group(function (Router $router) {
261 333
262 334 $router->get('addons', [AddonsController::class, 'getAddons'])->meta([
@@ -406,9 +478,23 @@
406 478 $router->post('modules', [ModuleSettingsController::class, 'saveSettings'])->meta([
407 479 'permissions' => 'is_super_admin'
408 480 ]);
409 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 + ]);
410 495
496 +
411 497 $router->post('confirmation', [SettingsController::class, 'saveConfirmation'])->meta([
412 498 'permissions' => 'is_super_admin'
413 499 ]);
414 500 //shortcode get
@@ -431,8 +517,20 @@
431 517 ]);
432 518 $router->post('storage-drivers/verify-info', [StorageController::class, 'verifyConnectInfo'])->meta([
433 519 'permissions' => 'is_super_admin'
434 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 + ]);
435 533
436 534
437 535 });
438 536
@@ -444,14 +542,21 @@
444 542 $router->post('/calculate-shipping', [OrderController::class, 'updateShipping'])->meta([
445 543 'permissions' => ['orders/create', 'orders/manage']
446 544 ]);
447 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 +
448 553 $router->post('/', [OrderController::class, 'store'])->meta([
449 554 'permissions' => 'orders/create'
450 555 ]);
451 556
452 557 $router->post('/do-bulk-action', [OrderController::class, 'handleBulkActions'])->meta([
453 - 'permissions' => 'orders/manage'
558 + 'permissions' => 'orders/delete' // every accepted action deletes orders — same gate as DELETE /{order_id}
454 559 ]);
455 560
456 561 $router->post('/{order}/mark-as-paid', [OrderController::class, 'markAsPaid'])->meta([
457 562 'permissions' => 'orders/manage'
@@ -506,11 +611,13 @@
506 611 $router->post('/{order}/transactions/{transaction_id}/accept-dispute/', [OrderController::class, 'acceptDispute'])->meta([
507 612 'permissions' => 'orders/manage'
508 613 ]);
509 614
510 - $router->get('/{id}/transactions/{transaction_id}', [OrderController::class, 'getDetails'])->meta([
511 - 'permissions' => 'orders/view'
512 - ]);
615 + $router->get('/{id}/transactions/{transaction_id}', [OrderController::class, 'getTransactionDetails'])
616 + ->int('id', 'transaction_id')
617 + ->meta([
618 + 'permissions' => 'orders/view'
619 + ]);
513 620
514 621 $router->put('/{order}/address/{id}', [OrderController::class, 'updateOrderAddress'])->meta([
515 622 'permissions' => 'orders/manage'
516 623 ]);
@@ -518,8 +625,12 @@
518 625 $router->put('/{order}/transactions/{transaction}/status', [OrderController::class, 'updateTransactionStatus'])->meta([
519 626 'permissions' => 'orders/manage'
520 627 ]);
521 628
629 + $router->post('/{order}/transactions/{transaction}/sync', [OrderController::class, 'syncPendingTransaction'])->meta([
630 + 'permissions' => 'orders/manage'
631 + ]);
632 +
522 633 $router->post('/{order}/create-custom', [OrderController::class, 'createCustom'])->int('id')->meta([
523 634 'permissions' => 'orders/create'
524 635 ]);
525 636
@@ -532,9 +643,26 @@
532 643 ]);
533 644
534 645 });
535 646
647 +$router->prefix('renewals')->withPolicy('OrderPolicy')->group(function (Router $router) {
648 + $router->get('/', [RenewalController::class, 'index'])->meta([
649 + 'permissions' => 'orders/view'
650 + ]);
536 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 +
537 665 $router->prefix('labels')->withPolicy('LabelPolicy')->group(function (Router $router) {
538 666 $router->get('/', [LabelController::class, 'index'])->meta([
539 667 'permissions' => 'labels/view'
540 668 ]);
@@ -621,56 +749,15 @@
621 749
622 750 });
623 751
624 752
625 -$router->prefix('options')->withPolicy('ProductPolicy')->group(function (Router $router) {
626 - $router->get('attr/groups', [AttributesController::class, 'getGroups'])->meta([
627 - 'permissions' => 'products/view'
628 - ]);
629 753
630 - $router->post('attr/group/', [AttributesController::class, 'createGroup'])->meta([
631 - 'permissions' => 'products/create'
632 - ]);
633 -
634 - $router->get('attr/group/{group_id}', [AttributesController::class, 'getGroup'])->meta([
635 - 'permissions' => 'products/view'
636 - ]);
637 -
638 - $router->put('attr/group/{group_id}', [AttributesController::class, 'updateGroup'])->meta([
639 - 'permissions' => 'products/edit'
640 - ]);
641 -
642 - $router->delete('attr/group/{group_id}', [AttributesController::class, 'deleteGroup'])->meta([
643 - 'permissions' => 'products/delete'
644 - ]);
645 -
646 - $router->get('attr/group/{group_id}/terms', [AttributesController::class, 'getTerms'])->meta([
647 - 'permissions' => 'products/view'
648 - ]);
649 -
650 - $router->post('attr/group/{group_id}/term', [AttributesController::class, 'createTerm'])->meta([
651 - 'permissions' => 'products/create'
652 - ]);
653 -
654 - $router->post('attr/group/{group_id}/term/{term_id}', [AttributesController::class, 'updateTerm'])->meta([
655 - 'permissions' => 'products/edit'
656 - ]);
657 -
658 - $router->delete('attr/group/{group_id}/term/{term_id}', [AttributesController::class, 'deleteTerm'])->meta([
659 - 'permissions' => 'products/delete'
660 - ]);
661 -
662 - $router->post('attr/group/{group_id}/term/{term_id}/serial', [AttributesController::class, 'changeTermSerial'])->meta([
663 - 'permissions' => 'products/edit'
664 - ]);
665 -});
666 -
667 -
668 754 $router->prefix('onboarding')->withPolicy('AdminPolicy')->group(function (Router $router) {
669 755 $router->get('/', [OnboardingController::class, 'index']);
670 756 $router->post('/', [OnboardingController::class, 'saveSettings']);
671 757 $router->post('/create-pages', [OnboardingController::class, 'createPages']);
672 758 $router->post('/create-page', [OnboardingController::class, 'createPage']);
759 + $router->post('/save-tax', [OnboardingController::class, 'saveTaxSettings']);
673 760 });
674 761 $router->prefix('email-notification')->withPolicy('StoreSensitivePolicy')->group(function (Router $router) {
675 762 $router->get('/', [EmailNotificationController::class, 'index']);
676 763 $router->get('/get-short-codes', [EmailNotificationController::class, 'getShortCodes']);
@@ -677,8 +764,11 @@
677 764 $router->get('/get-settings', [EmailNotificationController::class, 'getSettings']);
678 765 $router->post('/save-settings', [EmailNotificationController::class, 'saveSettings']);
679 766 $router->get('/reminders', [EmailNotificationController::class, 'getSchedulingSettings']);
680 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']);
681 771 $router->post('/enable-notification/{name}', [EmailNotificationController::class, 'enableNotification']);
682 772 $router->post('/send-manual-reminder', [EmailNotificationController::class, 'sendManualReminder']);
683 773 $router->post('/preview-default-template', [EmailNotificationController::class, 'previewDefaultTemplate']);
684 774 $router->get('/{notification}', [EmailNotificationController::class, 'find']);
@@ -744,10 +834,10 @@
744 834 });
745 835
746 836 $router->post('/upload-editor-file', [FileUploadController::class, 'uploadEditorFile'])->withPolicy('AdminPolicy');
747 837
748 -$router->prefix('notes')->withPolicy('AdminPolicy')->group(function (Router $router) {
749 - $router->post('/attach', [NotesController::class, 'attach']);
838 +$router->prefix('notes')->withPolicy('OrderPolicy')->group(function (Router $router) {
839 + $router->post('/attach', [NotesController::class, 'attach'])->meta(['permissions' => 'orders/manage']);
750 840 });
751 841
752 842 $router->prefix('app')->withPolicy('AdminPolicy')->group(function (Router $router) {
753 843 $router->get('init', [AppController::class, 'init']);
@@ -797,42 +887,129 @@
797 887 });
798 888
799 889
800 890 // Tax Routes
801 -$router->prefix('tax')->withPolicy('StoreSensitivePolicy')->group(function (Router $router) {
802 - // TaxClasses routes
803 - $router->get('classes', [TaxClassController::class, 'index']);
804 - $router->post('classes', [TaxClassController::class, 'store']);
805 - $router->put('classes/{id}', [TaxClassController::class, 'update'])->int('id');
806 - $router->delete('classes/{id}', [TaxClassController::class, 'delete'])->int('id');
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 + ]);
807 902
808 903 // TaxRates routes
809 - $router->get('rates', [TaxRateController::class, 'index']);
810 - $router->get('rates/country/rates/{country_code}', [TaxRateController::class, 'show']);
811 - $router->post('rates/country/override', [TaxRateController::class, 'saveShippingOverride']);
812 - $router->delete('rates/country/override/{id}', [TaxRateController::class, 'deleteShippingOverride'])->int('id');
813 - $router->put('country/rate/{id}', [TaxRateController::class, 'update'])->int('id');
814 - $router->post('country/rate', [TaxRateController::class, 'store']);
815 - $router->delete('country/rate/{id}', [TaxRateController::class, 'delete'])->int('id');
816 - $router->delete('country/{country_code}', [TaxRateController::class, 'deleteCountry']);
817 - $router->get('country-tax-id/{country_code}', [TaxRateController::class, 'getCountryTaxId']);
818 - $router->post('country-tax-id/{country_code}', [TaxRateController::class, 'saveCountryTaxId']);
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 + ]);
819 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 +
820 946 // $router->post('rates/country', [TaxRateController::class, 'addCountry']);
821 947
822 948 // TaxConfiguration routes
823 - $router->get('configuration/rates', [TaxConfigurationController::class, 'getTaxRates']);
824 - $router->post('configuration/countries', [TaxConfigurationController::class, 'saveConfiguredCountries']);
825 - $router->get('configuration/settings', [TaxConfigurationController::class, 'getSettings']);
826 - $router->post('configuration/settings', [TaxConfigurationController::class, 'saveSettings']);
827 - $router->post('configuration/settings/eu-vat', [TaxEUController::class, 'saveEuVatSettings']);
828 - $router->get('configuration/settings/eu-vat/rates', [TaxEUController::class, 'getEuTaxRates']);
829 - $router->post('configuration/settings/eu-vat/oss/override', [TaxEUController::class, 'saveOssTaxOverride']);
830 - $router->post('configuration/settings/eu-vat/oss/shipping-override', [TaxEUController::class, 'saveOssShippingOverride']);
831 - $router->delete('configuration/settings/eu-vat/oss/override', [TaxEUController::class, 'deleteOssTaxOverride'])->int('id');
832 - $router->delete('configuration/settings/eu-vat/oss/shipping-override', [TaxEUController::class, 'deleteOssShippingOverride'])->int('id');
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 + ]);
833 976 });
834 977
835 978 $router->prefix('checkout-fields')->withPolicy('StoreSensitivePolicy')->group(function (Router $router) {
836 979 $router->get('get-fields', [CheckoutFieldsController::class, 'getFields']);
837 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 + ]);
838 1015 });